crypto 모듈 / 양방향 암호화
출처 : https://blog.naver.com/PostView.naver?blogId=01075970528&logNo=222484380977
DB에 정보를 암호화해서 저장해야 한다.
node js 암호화 모듈 중에서 유명한 crypto 모듈을 사용하기로 결정!
암호화해서 insert한 후에 조회할 때는 select 후에 복호화가 필요하니까
양방향 암호화 라고 할 수 있음
먼저 npm으로 모듈 설치-
npm i -d crypto
그리고 소스 상단쪽에 require 해주시고
const crypto = require('crypto');
crypto 모듈을 사용하려면 알고리즘을 선택해야하는데
md5나 sha1은 뚫렸다고 함..(!)
내가 선택한 알고리즘은 aes-256-cbc
왜냐면 아래 블로그에서 고오급 암호화 알고리즘이라고 봐서...ㅎㅎ
>> AES는 Advanced Encryption Standard 고오급 암호화 표준이다.
암호화 및 복호화에 동일한 키를 사용하는 대칭키 알고리즘이다.
종류로는 AES-128, AES-192, AES-256 이 있는데
각 뒤에 붙은 숫자가 키의 길이를 의미한다.
ex) AES-256 => 키가 256bit(=32byte)
AES 의 암/복호화는 다음과 같은 과정으로 이루어진다.
암호화
plain text > plain bytes > encrypt > encrypted bytes > encrypted base64 text
복호화
encrpyted base64 text > encrypted bytes > decrypt > plain bytes > plain text
그리고 암호화 소스
const algorithm = 'aes-256-cbc';
let text = 'Hello World!'; // 암호화 할 문구
const key = crypto.scryptSync('wolfootjaIsSpecial','specialSalt', 32); // 나만의 암호화키. password, salt, byte 순인데 password와 salt는 본인이 원하는 문구로~
const iv = crypto.randomBytes(16); //초기화 벡터. 더 강력한 암호화를 위해 사용. 랜덤값이 좋음
const cipher = crypto.createCipheriv(algorithm, key, iv); //key는 32바이트, iv는 16바이트
let result = cipher.update(text, 'utf8', 'base64');
result += cipher.final('base64');
console.log('암호화: ', result);
그러면 결과는 아래와 같이 나온당~
암호화: 5+0OhgJcCSRj84Xxg0J0xQ==
이제 복호화 해보자~
const deciper = crypto.createDecipheriv(algorithm, key, iv);
let result2 = deciper.update(result, 'base64', 'utf8');
result2 += deciper.final('utf8');
console.log('복호화: ', result2);
그러면 결과는
복호화: Hello World!