crypto.pbkdf2()는 비밀번호 기반 키 유도 함수(Password-Based Key Derivation Function)라고도 불리며, Node.js crypto 모듈에서 키 유도 작업을 비동기 방식으로 수행하는 메서드입니다. 지정된 알고리즘의 HMAC 다이제스트를 사용하여 비밀번호(password), 솔트(salt), 반복 횟수(iterations)로부터 원하는 길이의 키를 생성합니다.
PBKDF2는 비밀번호를 안전하게 저장할 때 무차별 대입 공격(brute-force attack)을 방지하기 위해 널리 사용되는 표준 방식입니다. 반복 횟수를 높일수록 키 유도에 더 많은 연산이 필요해지므로 보안성이 향상되지만, 처리 시간도 그만큼 늘어난다는 점을 고려해야 합니다.
구문
crypto.pbkdf2(password, salt, iterations, keylen[, digest], callback)
매개변수
각 매개변수의 의미는 아래와 같습니다 −
password – 요청한 바이트 길이의 키를 생성하기 위해 정의하는 비밀번호입니다. 문자열(string), DataView, Buffer 등의 타입을 사용할 수 있습니다.
salt – 비밀번호와 함께 키를 생성하는 데 사용되는 값으로, 사전 공격이나 레인보우 테이블 공격을 방지하는 역할을 합니다. 문자열, DataView, Buffer 등의 타입을 사용할 수 있습니다.
iterations – 원하는 키를 얻기 위해 해시 함수를 반복 실행하는 횟수입니다. 숫자(number) 타입의 값을 받으며, 값이 클수록 보안이 강화됩니다.
keylen – 생성할 키의 바이트 길이입니다. 숫자 타입입니다.
digest – HMAC 알고리즘을 지정하는 다이제스트 값입니다. 기본값은 'sha1'이며, 더 높은 보안을 위해 'sha256' 또는 'sha512' 사용이 권장됩니다.
callback – 비동기 방식으로 실행되므로, 오류가 발생하면 콜백 함수의 첫 번째 인자(err)로 전달되어 처리됩니다.
예제 1
pbkdf2.js라는 이름의 파일을 생성하고 아래 코드를 복사한 뒤, 다음 명령어로 실행합니다 −
node pbkdf2.js
pbkdf2.js
// crypto.pbkdf2() 데모 예제
// crypto 모듈 가져오기
const crypto = require('crypto');
// 아래 옵션으로 pbkdf2 정의
crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
if (err) throw err;
// 유도된 키 출력
console.log("Key Derived: ", derivedKey.toString('hex'));
});출력 결과
C:\home\node>> node pbkdf2.js Key Derived: 3745e482c6e0ade35da10139e797157f4a5da669dad7d5da88ef87e47471cc47ed941c7ad618e8 27304f083f8707f12b7cfdd5f489b782f10cc269e3c08d59ae
위 예제에서는 'sha512' 알고리즘으로 10만 번 반복하여 64바이트 길이의 키를 생성하고, 16진수(hex) 형태로 출력했습니다.
예제 2
이번에는 다른 옵션을 적용한 추가 예제를 살펴보겠습니다.
// crypto.pbkdf2() 데모 예제
// crypto 모듈 가져오기
const crypto = require('crypto');
// 아래 옵션으로 pbkdf2 정의
crypto.pbkdf2('secret', 'salt', 100, 64, 'sha1', (err, derivedKey) => {
if (err) throw err;
// 유도된 키 출력
console.log("Key Derived: ", derivedKey);
console.log("Key Derived in hex: ", derivedKey.toString('hex'));
console.log("Key Derived in base64: ", derivedKey.toString('base64'));
});출력 결과
C:\home\node>> node pbkdf2.js Key Derived: <Buffer b7 36 35 f7 c0 88 2e 1f c3 ba 6e 29 b1 4a f1 27 4d f8 48 28 b4 d1 8f cc 22 2e b5 74 45 5f 50 5d 3d 23 19 13 2d 84 e1 91 a7 83 e2 00 73 4e 37 4a 24 b6 ... > Key Derived in hex: b73635f7c0882e1fc3ba6e29b14af1274df84828b4d18fcc222eb574455f505d3d2319132d84e1 91a783e200734e374a24b62cfab65dfb5e9dc28ae147072419 Key Derived in base64: tzY198CILh/Dum4psUrxJ034SCi00Y/MIi61dEVfUF09IxkTLYThkaeD4gBzTjdKJLYs+rZd+16dworhRwckGQ==
두 번째 예제에서는 유도된 키를 Buffer 객체 그대로, 16진수(hex), base64 세 가지 형식으로 확인할 수 있습니다. 참고로 동기 방식으로 처리하고 싶다면 crypto.pbkdf2Sync() 메서드를 사용하면 됩니다.