crypto 모듈
http://nodejs.org/api/crypto.html
- Crypto
- crypto.getCiphers()
- crypto.getHashes()
- crypto.createCredentials(details)
- crypto.createHash(algorithm)
- Class: Hash
- crypto.createHmac(algorithm, key)
- Class: Hmac
- crypto.createCipher(algorithm, password)
- crypto.createCipheriv(algorithm, key, iv)
- Class: Cipher
- crypto.createDecipher(algorithm, password)
- crypto.createDecipheriv(algorithm, key, iv)
- Class: Decipher
- crypto.createSign(algorithm)
- Class: Sign
- crypto.createVerify(algorithm)
- Class: Verify
- crypto.createDiffieHellman(prime_length)
- crypto.createDiffieHellman(prime, [encoding])
- Class: DiffieHellman
- diffieHellman.generateKeys([encoding])
- diffieHellman.computeSecret(other_public_key, [input_encoding], [output_encoding])
- diffieHellman.getPrime([encoding])
- diffieHellman.getGenerator([encoding])
- diffieHellman.getPublicKey([encoding])
- diffieHellman.getPrivateKey([encoding])
- diffieHellman.setPublicKey(public_key, [encoding])
- diffieHellman.setPrivateKey(private_key, [encoding])
- crypto.getDiffieHellman(group_name)
- crypto.pbkdf2(password, salt, iterations, keylen, callback)
- crypto.pbkdf2Sync(password, salt, iterations, keylen)
- crypto.randomBytes(size, [callback])
- crypto.pseudoRandomBytes(size, [callback])
- crypto.DEFAULT_ENCODING
- Recent API Changes
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로 복구하는 것은 불가능합니다.
암호화 및 복호화
- crypto.createDecipher(algorithm, password)
- crypto.createDecipheriv(algorithm, key, iv)
- Class: Decipher
위에서 설명한 해시 생성은 기존의 데이터로 복구하지 못하는 단점이 있습니다.(물론 상황에 따라 이것이 장점이지만요..) 원래의 데이터로의 복구가 필요할 때에는 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