💡 Javascript에서 해시 함수를 통해 암호화를 할 수 있도록 도와주는 Node.js 패키지입니다.
먼저, Crypto를 알고 사용하기 전에 해시함수에 관하여 잘 모르겠다면 아래 내용을 참조하시길 바랍니다.
해시함수란 글자를 입력받아, 고정된 길이의 해시값을 출력하는 함수입니다.
같은 글자를 입력하게 되면 똑같은 해시 값을 받게됩니다.
SHA 알고리즘 중에 SHA-1
SHA-256
SHA-384
SHA-512
가 있습니다.
해시함수는 해커가 입력할 수 있는 모든 데이터를 입력하고, 그에 따른 결과값을 구한 표(레인보우 테이블)를 가지고 있으면 해시 값을 보고 입력값을 유추할 수 있습니다. 이를 방지하기 위해, 입력 값에 랜덤값(salt)을 추가하는 방법을 사용합니다.
Node.js 앱에서 중요한 정보를 암호화하여 안전하게 보호할 수 있습니다.
검색을 하면 Crpyto 패키지를 설치해야할 것처럼 된 글이 많지만
Node.js
의 기본 패키지이며, 따로 설치할 필요가 없습니다.
방법의 특징은 크게 단방향 암호화, 양방향 암호화가 있습니다.
단방향 암호화 : 복호화 할 수 없는 암호화(복호화 = 암호화 되기 이전의 내용으로 되돌리는 것), 해시 함수
양방향 암호화: 대칭형 암호화, 비대칭형 암호화
요청 값으로 받은 비밀번호를 암호화 --> 암호화된 문자열을 DB에 INSERT(저장)합니다.
--> 사용자가 또 다시 같은 비밀번호를 입력하면 암호화해서 DB에 저장된 암호화 값과 비교하여
===
면 true!==
면 false 입니다.
컨트롤러에서 crypto 모듈을 불러오고 해당 모듈을 사용하는 코드를 작성하면 됩니다.
controller.js
const crypto = require('crypto');
// INSERT 시키는 함수 전에 함수 내부에 요청받은 패스워드 값을 변환하도록 하는 코드
crypto.createHash('sha512').update('password').digest('base64');
crypto.createHash('sha512').update('password').digest('hex');
controller.js
에서 함수로 해커의 레인보우 테이블 방지하기 위한 salt 생성 코드를 작성합니다.
// salt 값을 구할 때와 해시 값을 구할 때, 작업이 끝날때까지 기다려 주어야 하므로 [동기 방식]으로 사용합니다.
crypto.randomBytes(64, (err, salt) => {
crypto.pbkdf2('password', salt.toString('base64'), 100000, 64, 'sha512', (err, key) => {
console.log(key.toString('base64'));
});
});
randomBytes(64)
: 64비트 길이의 salt를 반환합니다.
salt는 버퍼 형식이기 때문에 salt.toString('base64')
로 base64 문자열로 변환합니다.
pbkdf2(비밀번호, salt, 반복횟수, 비밀번호 길이, 해시 알고리즘)
: 설정 값에 따른 최종 해시값을 돌려줍니다.
반복회수 = 해시함수를 몇 번 반복하는지.
비밀번호 길이 = 정책에 맞게 적절한 길이로 설정합니다. (해킹이 어렵게)
해시 알고리즘 = 사용하고 싶은 해시 함수 ( sah512 )
salt를 key와 저장해야만 정확한 비밀번호 비교가 가능합니다.
randomBtytes
메소드는 매번 다른 salt값을 돌려주므로, 암호화 결과가 매번 달라집니다.