28. pbkdf2

비밀번호를 해시화할 땐, cryptocreateHash 메서드를 사용해도 되는데, pbkdf2라는 알고리즘도 있고, bcrypt, scrypt 알고리즘도 있다.
비밀번호 해시화엔 다양한 알고리즘들이 있다.
이 중에서 선택을해 사용하면되는데 보통 bcrypt를 많이 쓰는 것 같다.

그런데 bcrypt는 노드에서 지원을 안해서 노드에서는 pbkdf2를 사용한다.
노드에서 bcrypt 사용 방법은 나중에 알아보도록 하겠다.

컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있다.

  • sha512가 취약해지면 sha3으로 넘어가야한다.
  • 현재는 pbkdf2bcrypt, scrypt 알고리즘으로 비밀번호를 암호화한다.
  • node는 pbkdf2scrypt를 지원한다.
          salt, 반복횟수
            |     |
            v     v
비밀번호 ---> pbkdf2 ----> pbkdf2 해시 알고리즘
// --------------------------------------------------------
// pbkdf2 예제
//  컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있음
//      - crypto.randomBytes로 64비트 문자열 생성 -> salt 역할
//      - pbkdf2 인수로 순서대로
//          - 비밀번호 (password)
//          - salt (salt)
//          - 반복횟수 (iterations)
//          - 출력 바이트 (keylen)
//          - 알고리즘 (digest)
//          - callback
//      - 반복횟수를 조정해 암호화하는데 1초 정도 걸리게 맞추는 것이 권장됨
const crypto = require('server/node/202305ing_node_study/section_3/3_9_crypto_util/3_9_1_crypto');

crypto.randomBytes(64, (err, buf) => {
    const salt = buf.toString('base64');
    console.log(salt); // OqMyBvpdzJJes3L+Nq460JU3/tZ+aZut7wlQ+BtjzKwfhaIfWoHDc+vyFWu1u2ou6vdcXjGGO/N8bmeFfBqDPg==
    crypto.pbkdf2('비밀번호', salt, 100000, 64, 'sha512', (err, key) => {
        console.log(key.toString('base64')); // WRz81UcCWXBSTAQIyb4HmFa4xGjdm1UpUCtKz4D9w3yt0HUS0xOFLOeNsBlAMVkqVAjEU8vhVN8QtuVjvupCqw==
    })
})

// --------------------------------------------------------
// pbkdf2 사용할 때는 salt와 해시화된 값 2개를 모두 DB에 저장해야된다.
// salt가 달라지면 해시화된 값도 달라지기 때문이다.
// 이 salt는 해독을 더 어렵게하기 위해서 추가되는 것이라고 보면된다.