포시코딩

[bcrypt] Error: Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue 본문

Node.js

[bcrypt] Error: Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue

포시 2022. 12. 21. 11:38
728x90

문제 발견

  async #encryptPsword(userInfo) {
    // const saltRounds = 10;
    const saltRounds = process.env.SALT;
    console.log('saltRounds: ' + saltRounds);

    return new Promise((resolve, reject) => {
      bcrypt.hash(userInfo.password, saltRounds, (err, hash)=>{
        if (err) {
          reject(`${err}`);
        } else {
          userInfo.password = hash;
          resolve(userInfo);
        }
      });
    });
  };

salt에 그대로 10을 넣어 쓰면 잘되는데, dotenv로 불러오는 값을 넣으면 아래와 같은 에러가 나오면서 

해싱을 하지 못하고 있었다.

바로 이전에 sequelize에서 dotenv를 사용하지 못해 문제를 겪다가 겨우 해결하고 온 참이라

이번에도 dotenv 설정에 문제가 있나 고민을 하며 열심히 구글링 해봤는데

좀처럼 답이 나오지 않고 있었다.

 

원인 파악

console.log('saltRounds type: ' + typeof(saltRounds));

에러 메시지에서 NumRounds라는 글자를 보며 혹시..? 라는 생각에 env에서 가져온 값의 타입을 찍어봤다.

아.. 역시

값을 가져오면 문자 타입이 된다는걸 깜빡하고 있었다.

 

문제 해결

  async #encryptPsword(userInfo) {
    const saltRounds = parseInt(process.env.SALT);
    console.log('saltRounds: ' + saltRounds);

    return new Promise((resolve, reject) => {
      bcrypt.hash(userInfo.password, saltRounds, (err, hash)=>{
        if (err) {
          reject(`${err}`);
        } else {
          userInfo.password = hash;
          resolve(userInfo);
        }
      });
    });
  };

parseInt()로 감싸주니 단번에 해결됐다.

728x90