사용자의 민감한 정보를 처리하기 위해 암호화를 할 필요가 생겼다.
이 정보는 블록암호화 처리를 해야한다고 한다.
블록암호가 뭐지... 블록체인 같은 개념인건가...
어렵게 생각했는데 crypto 라이브러리를 통해 AES 암호화 알고리즘을 사용하면 쉽게 처리할 수 있었다.
AES는 미국 정부가 채택한 이후 전 세계적으로 널리 사용되고 있다.
암호화, 복호화 시에 같은 키를 사용하는 대칭 키 알고리즘이다.
crypto.createCipheriv(algorithm, key, iv, [options]) -> cipher
인자1 algorithm: 사용할 cipher algorithm
다음 명령어를 통해 목록을 조회해볼 수 있다.
openssl list -cipher-algorithms
인자2 key: 고유한 키값
256bits(총 32자)의 고유값으로 설정해주면 된다.
이 key값은 노출되지 않도록 한다.
인자3 iv: initialize vector
암호화 할 때 같은 input에 매번 같은 result를 만들어내면 안 좋은 암호화 알고리즘이라고 한다.
이를 위해 initialize vector(이하 iv)를 활용하여 무작위성을 추가해 같은 input에 다른 result가 나오도록 한다.
iv는 암호학적으로 무작위(cryptographically random)이어야 한다.
인자4 [options]: 추가 옵션
authTagLength <- 이런 옵션이 필요한 경우가 있다고 하지만 나는 사용하지 않아 잘 모르겠다!
반환값 cipher: Cipher 클래스의 인스턴스
솔직히 나도 암호화 쪽은 잘 몰라서 이 정도로 정리해뒀다.
얕은 지식으로 잘못 전달하기보다 내가 활용할 수 있는 정도까지만 정리를 해두고
실제 코드 예시로 남겨놓는게 좋을 것 같다.
잘못된 점이 있다면 알려주세요...
예시 (참고)
'use strict';
const crypto = require('crypto');
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; // Must be 256 bits (32 characters)
const IV_LENGTH = 16; // For AES, this is always 16
function encrypt(text) {
let iv = crypto.randomBytes(IV_LENGTH);
let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
function decrypt(text) {
let textParts = text.split(':');
let iv = Buffer.from(textParts.shift(), 'hex');
let encryptedText = Buffer.from(textParts.join(':'), 'hex');
let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
module.exports = { decrypt, encrypt };
출력 결과 (2번 시행, encrypt 결과가 다르게 출력)
encrypt result: b799f1bd43d718db599e5435e93a3088:eacfbcbfaef6568a61d9f3af0bca9b38
decrypt result: PumpapaPumpa
encrypt result: 01bf8a2d4a9386513d2a327ef12a324e:70294bcea27fc1667b1dc77896a25320
decrypt result: PumpapaPumpa
'개발 > Javascript' 카테고리의 다른 글
| [JavaScript] shuffle - 배열의 순서를 무작위로 섞기 (0) | 2021.01.07 |
|---|