본문 바로가기

STUDY/Node.js

Node.js | Crypto 모듈을 사용해 비밀번호 암호화 하기

node에서 기본으로 제공해주는 Crypto 모듈을 사용해 비밀번호를 암호화하기로 했다.
비밀번호는 복호화 할 수 없게 단방향 암호화를 해야 한다.
단방향 암호화 중 가장 쉬운 방법은 hash를 하는 것인데, Crypto에서 일반 hash를 생성하는 함수도 제공한다.

 

하지만 더 안전하게 암호화하기 위해서는 salt를 사용해야 한다.

salt란 해시할 때 추가로 사용되는 데이터다. salt를 사용하지 않고 해시만 할 경우에는 동일한 해시가 생성될 가능성이 있기 때문에 salt라는 추가적인 값을 더해 암호화를 한다. 이 때 salt는 비밀번호를 암호화할 때 마다 랜덤하게 생성된 값이어야 한다.
즉, 사용자의 비밀번호를 암호화할 때 마다 새로운 salt를 무작위로 생성해서 사용한다. 항상 동일한 salt를 사용하는 것은 salt를 사용하는 의미가 없어진다.

그래서 Crypto에서 제공하는 pbkdf2함수를 사용해 비밀번호 암호화를 한다. pbkdf란 Password-based Key Derivation Function을 말한다.

 

pbkdf2함수의 인자는 아래 다섯 개가 필요하다.

  • password: 암호화 할 비밀번호
  • salt
  • iterations: 반복 횟수
  • keylen: 암호화된 비밀번호의 길이
  • digest: 해시 알고리즘

interations는 높을수록 좋지만 높을수록 암호화 되는 시간도 길어진다. 반복 횟수가 증가할수록 키의 안전성도 높아진다. 공식 문서의 예시 코드에서는 10만을 주고있다. (12만회 이상으로 할 것을 권장한다고 한다.)

salt는 가능한 고유해야 한다. 무작위로 생성되어야 하며 길이는 16바이트 이상이면 좋다.

 

콜백 함수에서는 errorderivedKey 두 가지 값들이 전달된다. 성공적으로 암호화 되면 derivedKey에 값을 Buffer형태로 전달된다. 그래서 문자열로 바꿔주는 toString()을 사용해야 한다.

import Crypto from 'crypto';

Crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
});

 

see also
createHash
pbkdf2