28. pbkdf2
비밀번호를 해시화할 땐, crypto
의 createHash
메서드를 사용해도 되는데, pbkdf2
라는 알고리즘도 있고, bcrypt
, scrypt
알고리즘도 있다.
비밀번호 해시화엔 다양한 알고리즘들이 있다.
이 중에서 선택을해 사용하면되는데 보통 bcrypt
를 많이 쓰는 것 같다.
그런데 bcrypt
는 노드에서 지원을 안해서 노드에서는 pbkdf2
를 사용한다.
노드에서 bcrypt
사용 방법은 나중에 알아보도록 하겠다.
컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있다.
sha512
가 취약해지면sha3
으로 넘어가야한다.- 현재는
pbkdf2
나bcrypt
,scrypt
알고리즘으로 비밀번호를 암호화한다. - node는
pbkdf2
와scrypt
를 지원한다.
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는 해독을 더 어렵게하기 위해서 추가되는 것이라고 보면된다.