Crypto
이번 포스팅에서는 Node.js를 설치하면 들어 있는 내장 모듈 중에 Crypto 모듈을 직접 사용해보려고 합니다.
crypto
형용사 비밀의, 숨겨진; 내밀(內密)의 출처 : 네이버 영어사전
위의 사전 정의에서 알 수 있듯이, 비밀 즉 암호와 관련된 모듈입니다.
평문(암호화 되기 이전의 텍스트)를 암호화하는 데에는 다양한 방법의 암호화 기법들이 존재하는데, 그 중 많은 방식들을 갖고 있는 고마운 모듈입니다.
Crypto 모듈에서 사용할 수 있는 암호화 기법들은 다음과 같습니다.
Certificate
Cipher < - > Decipher
Diffie Hellman
ECDH (Elliptic Curve Diffie-Hellman)
Hash
Hmac (a keyed-Hash Message Authentication Code)
Sign
Verify
각각의 기법들을 용도에 맞게 사용할 수 있으며, 보안에 관한 공부가 선행되어야 할 듯 합니다.
오늘 다룰 방식은 두가지로 , Cipher와 Hmac입니다.
Cipher는 우선 일반적인 암호화로, 특징으로는 평문 -> 암호문 -> 복호문(평문) 의 방식으로 암호화하고 복호화합니다.
즉 암호화를 하기 위한 Key를 가지고 평문을 암호화하고, 그것을 사용할 때에는 다시 Key를 통해 복호화하여 사용합니다.
이에 반대로 Hmac는 암호화를 하면 다시 되돌릴 수 없기 때문에, 암호화된 암호문 자체를 이용합니다.
흔히 웹사이트 가입 등에서 볼 수 있는 모든 정보는 암호화되어 운영자도 모른다.. 뭐 이런 내용들은 대부분 Hashed 된 암호들이기 때문입니다.
먼저 모듈을 임포트합니다.
1 | var crypto = require('crypto'); | cs |
Cipher
먼저 Crypto에는 cipher 방식에 어떤 것들이 있는지 알 수 있는 getCiphers() 라는 함수가 있습니다.
1 2 | var ciphers = crypto.getCiphers(); console.log(ciphers); | cs |
이렇게 코딩을 한 후에 실행하면 사용 가능한 모든 Cipher 방식들이 나옵니다.
(굉장히 많은 암호화 방식들이 나옵니다. 위의 사진은 그중 극히 일부분입니다.)
이 중에서 사용할 방식을 골라서 cipher 객체를 생성하여야 합니다.
1 2 3 | var cipher = crypto.createCipher('aes256', 'password'); cipher.update('TestCipher','ascii','hex'); var cipherd = cipher.final('hex'); | cs |
사용되어진 함수는 다음과 같이 사용합니다.
var Cipher객체 = crypto module.createCipher('암호화 방식', '암호화 Key');
Cipher객체.update('평문(암호화 이전의 글)'[, 'input type'][, 'output type']); // 인풋 타입과 아웃풋 타입은 생략 가능
var 암호문 = cipher.final(['output type']);
위와 같이 한 후에 Console.log를 통해 cipherd를 출력해 보았습니다.
암호화가 된 것을 확인할 수 있습니다.
이를 복호화하기 위해서는 Decipher 객체를 똑같이 생성하여, 똑같은 방식으로 실행해주면 됩니다.
1 2 3 | var decipher = crypto.createDecipher('aes256', 'password'); decipher.update(cipherd, 'hex', 'ascii'); var decipherd = decipher.final('ascii'); | cs |
방식은 위의 cipher와 동일합니다.
위의 암호화된 텍스트를 그대로 Decipher하면 원래의 평문인 TestCipher가 정상적으로 나오는 것을 확인할 수 있습니다.
Hmac
Hmac도 cipher처럼 사용 가능한 방식들을 알 수 있는데,
Hmac는 Hash를 기반으로 하므로 getHashes() 함수를 사용합니다.
사용 가능한 방식을 찾는 법은 위와 동일하므로 생략합니다.
1 2 | var hmac = crypto.createHmac('sha256', 'hash password'); var pass = hmac.update('TestHmac').digest('hex'); | cs |
Hmac 오브젝트를 만들기 위해서
var hmac객체 = crypto module.createHmac('암호화 방식', '암호화 Key');
var pass = hmac.update('평문').digest('output type');
의 방식으로 합니다.
출력 결과는 다음과 같습니다.
이상이 Crypto 모듈 사용법이었습니다.
더 다양한 Certificate, Sign 등은 공부가 조금 더 필요 합니다 !
회원가입에 있어서 암호화 등을 위하여 사용되는 모듈입니다.
수많은 암호화 기법들이 있고 사용도 간단해서 자주 사용할 듯 합니다 !