개요
crypto.pbkdf2Sync()는 PBKDF2(Password-Based Key Derivation Function 2)라고도 불리며, 키 유도 함수의 동기식(synchronous) 구현을 제공하는 Node.js crypto 모듈의 메서드입니다. 지정된 알고리즘의 HMAC 다이제스트를 기반으로, 비밀번호(password), 솔트(salt), 반복 횟수(iterations)를 사용해 새로운 키를 유도합니다. 이 메서드는 동기 방식으로 작동하므로, 키 생성이 완료될 때까지 프로그램의 실행이 차단(blocking)됩니다.
참고로 동기 방식은 CPU 집약적인 연산으로 인해 이벤트 루프를 막을 수 있으므로, 실제 서비스 환경에서는 비동기 버전인 crypto.pbkdf2() 또는 프로미스 기반 API 사용을 권장합니다.
문법(Syntax)
crypto.pbkdf2Sync(password, salt, iterations, keylen[, digest])
매개변수(Parameters)
각 매개변수에 대한 설명은 다음과 같습니다.
password – 요청된 바이트 길이의 키를 유도하기 위한 비밀번호입니다. 문자열(string), DataView, Buffer 등의 타입을 사용할 수 있습니다.
salt – 비밀번호와 마찬가지로 키를 유도하는 데 사용되는 솔트 값입니다. 문자열, DataView, Buffer 등의 타입을 사용할 수 있습니다.
iterations – 원하는 키를 얻기 위해 해시 연산을 반복하는 횟수입니다. 숫자(number) 타입의 값을 받으며, 값이 클수록 보안성은 높아지지만 연산 시간도 길어집니다.
keylen – 생성하고자 하는 키의 바이트 길이입니다. 숫자 타입입니다.
digest – HMAC 알고리즘을 지정하는 다이제스트 값입니다. 기본값은 'sha1'이며, 보안 강화를 위해 'sha256' 또는 'sha512' 사용이 권장됩니다.
예제 1
pbkdf2Sync.js라는 이름의 파일을 생성한 뒤 아래 코드를 복사합니다. 파일 생성 후 다음 명령어로 코드를 실행할 수 있습니다.
node pbkdf2Sync.js
pbkdf2Sync.js
// crypto.pbkdf2Sync() 데모 예제
// crypto 모듈 가져오기
const crypto = require('crypto');
// 지정한 옵션으로 pbkdf2Sync 실행
const pbkdfKey = crypto.pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
// 파생된 키 출력
console.log("key is: ", pbkdfKey.toString('hex'));실행 결과
C:\home\node>> node pbkdf2Sync.js key is: 3745e482c6e0ade35da10139e797157f4a5da669dad7d5da88ef87e47471cc47ed941c7ad618e827304f083f8707f12b7cfdd5f489b782f10cc269e3c08d59ae
위 예제에서는 'sha512' 알고리즘과 100,000번의 반복을 통해 64바이트 길이의 키가 생성되었으며, 결과는 16진수(hex) 문자열로 출력됩니다.
예제 2
이번에는 다양한 인코딩 형식으로 키를 출력하는 예제를 살펴보겠습니다.
// crypto.pbkdf2Sync() 데모 예제
// crypto 모듈 가져오기
const crypto = require('crypto');
// 지정한 옵션으로 pbkdf2Sync 실행
const pbkdfKey = crypto.pbkdf2Sync('secret', 'salt', 100, 32, 'sha1');
// 파생된 키를 여러 형식으로 출력
console.log("key is: ", pbkdfKey);
console.log("key(in hex) is: ", pbkdfKey.toString('hex'));
console.log("key(in base64) is: ", pbkdfKey.toString('base64'));실행 결과
C:\home\node>> node pbkdf2Sync.js key is: <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> key(in hex) is: b73635f7c0882e1fc3ba6e29b14af1274df84828b4d18fcc222eb574455f505d key(in base64) is: tzY198CILh/Dum4psUrxJ034SCi00Y/Mii61dEVfUF0=
두 번째 예제에서는 반환값이 Buffer 객체임을 확인할 수 있으며, toString() 메서드를 활용해 hex 또는 base64 등 원하는 인코딩 형식으로 변환하여 사용할 수 있습니다.
정리
crypto.pbkdf2Sync()는 비밀번호 기반 키 유도를 간편하게 수행할 수 있는 메서드입니다. 다만 동기 방식의 특성상 이벤트 루프를 차단하므로, 반복 횟수가 큰 연산을 처리할 때는 성능 영향을 반드시 고려해야 합니다.