개발/Javascript

[JavaScript] crypto를 활용한 AES 블록 암호화

품파파품파 2021. 1. 8. 21:56

사용자의 민감한 정보를 처리하기 위해 암호화를 할 필요가 생겼다.

이 정보는 블록암호화 처리를 해야한다고 한다.

가비아 게시물 참고

 

블록암호가 뭐지... 블록체인 같은 개념인건가...

어렵게 생각했는데 crypto 라이브러리를 통해 AES 암호화 알고리즘을 사용하면 쉽게 처리할 수 있었다.

 

AES는 미국 정부가 채택한 이후 전 세계적으로 널리 사용되고 있다.

암호화, 복호화 시에 같은 키를 사용하는 대칭 키 알고리즘이다.

위키피디아 AES 참고

 

 

crypto.createCipheriv(algorithmkeyiv, [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 클래스의 인스턴스

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

 

 

Crypto 공식 문서

 

'개발 > Javascript' 카테고리의 다른 글

[JavaScript] shuffle - 배열의 순서를 무작위로 섞기  (0) 2021.01.07