양방향 암호화는, 예상했다시피 암호화된 패스워드 문자열을 복호화할 수 있다는 것이 가장 큰 특징입니다. 이 복호화 과정에서는 키(열쇠)가 사용됩니다. 대칭형 암호화에서 암호를 복호화하기 위해서는 암호화 과정에서 사용한 키와 동일한 키를 사용해야 합니다.
아래 예제를 통해서, 양방향 암호화 과정을 살펴보겠습니다. 참고로 암호학 자체에 대한 이해도가 필요한 부분도 있으므로, 일정 부분은 간단하게 읽고 이해하는 정도로 살펴보면 되겠습니다.
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = 'abcdefghijklmnopqrstuvwxyz123456';
const iv = '1234567890123456';
const cipher = crypto.createCipheriv(algorithm, key, iv);
let result = cipher.update('암호화대상문장', 'utf8', 'base64');
result += cipher.final('base64');
console.log('암호화 결과:', result);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('복호화:', result2);
/* 출력
암호화 결과: EVn0AHAmBm2E4ILfKK5w7uRwetJQ2SgVortBU0/uh1I=
복호화: 암호화대상문장
*/
· crypto.createCipheriv(알고리즘, 키, iv) : 암호화 알고리즘과 키, iv를 넣습니다. 예제에서는 각각 변수로 선언되었죠. 여기서 사용한 알고리즘 'aes-256-cbc'는 키가 32바이트 여야 합니다. 또한 iv는 16바이트 여야 해서 예제와 같은 값을 갖게 되었습니다.
iv는 암호화 시 사용하는 초기화 벡터를 의미하는데 이 이상의 설명은 어려우므로 따로 AES를 공부할 필요가 있습니다. 더불어 여기서 사용하게 되는 알고리즘 종류는 crypto.getCiphers( )를 호출해 확인 가능합니다.
· cipher.update(문자열, 인코딩, 출력 인코딩) : 암호화를 할 대상 문자열을 전달하고, 대상의 인코딩을 입력한 다음 출력 결과물에 대한 인코딩을 전달합니다. 보통 문자열은 utf8, 암호는 base64를 주로 사용하죠.
· cipher.final(출력 인코딩) : 출력 결과물의 인코딩을 넣어 암호화를 완료합니다.
· crypto.createDecipheriv(알고리즘, 키, iv) : 복호화를 위해 사용합니다. 암호화 때 사용한 알고리즘, 키, iv를 그대로 넣습니다.
· decipher.update(문자열, 인코딩, 출력 인코딩) : 암호화가 된 문장, 그 문장의 인코딩, 복호화할 인코딩을 전달합니다. 여기서는 utf8과 base64의 순서가 반대로 되겠죠?
· decipher.final(출력 인코딩) : 복호화 결과물의 인코딩을 넣어 암호화를 완료합니다. 역시 여기서는 utf8이 됩니다.
이밖에도 crypto 모듈은 양방향 비대칭형 암호화, HMAC 등 다양한 암호화 방식을 지원하니 공식 문서에서 확인해 보시기 바랍니다.
또한 더 간단한 npm 패키지인 crypto-js도 사용이 가능합니다.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 1 (0) | 2024.04.30 |
---|---|
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 8 [util] (1) | 2024.04.26 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 7 [crypto] : 단방향 암호화 2 (0) | 2024.04.23 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 7 [crypto] : 단방향 암호화 1 (0) | 2024.04.22 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 6 [dns] (1) | 2024.04.19 |