node.js

crypto 모듈

crypto 모듈

http://nodejs.org/api/crypto.html 

crypto 모듈은 해시 생성 및 암호화와 관련된 모듈입니다. 

API 문서가 상당히 길군요.. 기본적인 부분만 살펴봅시다.

해시 생성하기

crypto.createHash() 메소드를 호출하면 매개 변수로 전달한 알고리즘에 해당하는 Hash 클래스가 반환됩니다. 이 Hash 클래스의 update() 메소드를 통해 data를 해싱하고 digest() 메소드로 encoding 방식에 따라서 결과 값을 가져올 수 있습니다.

매개 변수에 올 수 있는 값들에 대한 부분은 API 문서를 참조해 주세요! (위 목록을 클릭하면 바로 해당 API 문서로 이동합니다.)

예제

// createHash.js

var crypto = require('crypto');

// 해시 생성
var shasum = crypto.createHash('sha1'); // shasum은 Hash 클래스의 인스턴스입니다.
shasum.update('이 문자열이 해싱됩니다.');
var output = shasum.digest('hex');

console.log(output);

// 실행 결과
// 3283b8e5763985f459afaba372d466666181839d

해시는 다른 data라도 같은 값이 나올 수가 있고 단 방향성이므로 해싱된 값을 다시 원래의 data로 복구하는 것은 불가능합니다.

암호화 및 복호화

위에서 설명한 해시 생성은 기존의 데이터로 복구하지 못하는 단점이 있습니다.(물론 상황에 따라 이것이 장점이지만요..) 원래의 데이터로의 복구가 필요할 때에는 Cipher 객체를 이용하면 됩니다.

crypto.createCipher() 메소드의 매개변수로 algorithm에 암호화할 알고리즘명, password에 암호화, 복호화에 사용할 키를 입력하면 Cipher 객체가 생성됩니다. 이 객체의 update() 메소드로 암호화할 data를 매개변수로 전달하고 final() 메소드를 호출하여 암호화된 값을 얻을 수 있습니다.

복호화 과정도 같은 방법으로 crypto.createDecipher() 를 통해 이루어집니다.

말로 설명하는 것보다 직접 코드를 보면 이해하기가 수월할 것입니다.

예제

// createCipher.js

var crypto = require('crypto');

var key = 'myKey';      // 암호화, 복호화를 위한 키
var input = 'node.js';  // 암호화할 대상

// 암호화
var cipher = crypto.createCipher('aes192', key);    // Cipher 객체 생성
cipher.update(input, 'utf8', 'base64');             // 인코딩 방식에 따라 암호화
var cipheredOutput = cipher.final('base64');        // 암호화된 결과 값

// 복호화
var decipher = crypto.createDecipher('aes192', key); // Decipher 객체 생성
decipher.update(cipheredOutput, 'base64', 'utf8');   // 인코딩 방식에 따라 복호화
var decipheredOutput = decipher.final('utf8');       // 복호화된 결과 값

// 출력
console.log('기존 문자열: ' + input);
console.log('암호화된 문자열: ' + cipheredOutput);
console.log('복호화된 문자열: ' + decipheredOutput);

실행 결과

$ node createCipher.js
기존 문자열: node.js
암호화된 문자열: iUuiYCnC6Gg0IWsqycqQ8w==
복호화된 문자열: node.js

댓글

댓글 본문
  1. hiroszan
    final은 마지막 블록만 인코딩하기 때문에 이렇게 암호화 코드를 구성하면 본문의 길이가 조금만 길어도 에러가 발생하게 됩니다.

    아래와 같이 update의 결과를 final의 결과와 합친 문자열을 암호화된 문자로 쓰고 그 역으로 복호화 해야 장문의 문자열도 복호화 할 수 있겠다고 할 수 있겠습니다.

    var crypto = require('crypto');

    var key = 'myKey'; // 암호화, 복호화를 위한 키
    var input = 'node.js+node.js+node.js+node.js+node.js+node.js'; // 암호화할 대상

    // 암호화
    var cipher = crypto.createCipher('aes192', key); // Cipher 객체 생성
    var ec = cipher.update(input, 'utf8', 'base64'); // 인코딩 방식에 따라 암호화
    var cipheredOutput = ec + cipher.final('base64'); // 암호화된 결과 값

    // 복호화
    var decipher = crypto.createDecipher('aes192', key); // Decipher 객체 생성
    var dc = decipher.update(cipheredOutput, 'base64', 'utf8'); // 인코딩 방식에 따라 복호화
    var decipheredOutput = dc + decipher.final('utf8'); // 복호화된 결과 값

    // 출력
    console.log('기존 문자열: ' + input);
    console.log('암호화된 문자열: ' + cipheredOutput);
    console.log('복호화된 문자열: ' + decipheredOutput);
  2. 나무마루
    아 그렇군요.감사합니다.
    대화보기
    • miki
      원형: hash.digest([encoding]) (여기서 hash는 Hash 클래스의 한 인스턴스. 예제에서는 shasum에 해당)
      'hex'는 매개변수 [encoding]에 해당합니다. 그냥 인코딩의 한 방식이라고 생각하시면 됩니다.
      crypto 모듈에 관한 부분은 보안, 암호화, 인코딩 등과 관련된 내용으로 node.js의 내용을 벗어날 수 있습니다.
      하지만 제공되는 모듈을 사용하는 방법 위주로 보시면 될 것 같습니다.
      대화보기
      • 나무마루
        var output = shasum.digest('hex');
        hex는 어디서 갑자기 나온거죠??
      버전 관리
      miki
      현재 버전
      선택 버전
      graphittie 자세히 보기