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바이트 이상이면 좋다.
콜백 함수에서는 error
와 derivedKey
두 가지 값들이 전달된다. 성공적으로 암호화 되면 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
'STUDY > Node.js' 카테고리의 다른 글
NestJS | API 만들기 (3) - Exception, Validation (0) | 2021.08.06 |
---|---|
NestJS | API 만들기 (2) - Controller (0) | 2021.08.04 |
NestJS | API 만들기 (1) - Repository (0) | 2021.08.04 |
NestJS | 데이터베이스 연결, 설정 정보를 입력하는 다양한 방법... (database connection) (0) | 2021.07.28 |
NestJS | 유효성 검사 validation (0) | 2021.07.23 |