Frameworks/Node.js

[Node.js 강좌] 5. Node.js 내장 모듈 - Crypto

양디 2016. 1. 4. 15:12



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 등은 공부가 조금 더 필요 합니다 !


회원가입에 있어서 암호화 등을 위하여 사용되는 모듈입니다.

수많은 암호화 기법들이 있고 사용도 간단해서 자주 사용할 듯 합니다 ! 


댓글