2010-12-21 6 views
8

노드의 암호화 라이브러리에 이상한 문제가 있습니다. 이 간단한 AES 테스트 스크립트를 작성했습니다 :Node.js 및 암호화 라이브러리

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8') 
var text = "123|123123123123123"; 
cipher.update(text,'utf8','hex') 
var crypted = cipher.final('hex') 
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8') 
decipher.update(crypted,'hex','utf8') 
var dec = decipher.final('utf8') 

console.log (dec) 할 때 null입니다. 어떤 이유로 "123 | 123123"으로 테스트를 설정하면 작동합니다. 그렇다면 "123 | 123123"은 작동하지만 "123 | 123123123123123"은 왜 작동하지 않습니까?

+1

텍스트의 마지막 작동 길이는 15자인 것으로 보입니다. – Mike

답변

27

모든 것을 가지고 있는지 확인하려면 cipher.update와 cipher.final에서 반환 값을 저장해야합니다.

cipher.update "는 암호화 된 내용을 반환하고가 스트리밍으로 새로운 데이터를 여러 번 호출 할 수 있습니다"

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final "남아있는 암호화 된 내용을 반환합니다."

나는 그냥이 같은 각각의 호출로 결과를 추가 생각 :

var crypto = require('crypto'); 
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8'); 
var text = "123|123123123123123"; 
var crypted = cipher.update(text,'utf8','hex'); 
crypted += cipher.final('hex'); 
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8'); 
var dec = decipher.update(crypted,'hex','utf8'); 
dec += decipher.final('utf8'); 

내가 '123 | 123123123123123'를 암호화 되위한 '12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585'를 얻을 노드 v0.2.5로 위에서 12월 위해를

+3

RandomEtc가 정확합니다. node.js에서 모든 것이 스트림에 맞게 간소화되어 있습니다. 해시 함수와 암호 함수는 텍스트를 여러 번 업데이트 할 수 있습니다. 텍스트를 추가하기 만하면됩니다. 결과를 얻으려면 hash.digest 또는 cipher.final을 사용해야합니다. – Vanwaril

+0

RandomEtc, 답변 해 주셔서 감사합니다. 마침내 암호 물건에 나 거기있어! :) –

8

RandomEtc가 정확 합니다만,이 질문에 걸림돌이있는 사람이 인코딩으로 'base64'을 사용하는 경우를 대비하여 하지 마십시오. 스틱 'hex'. 최소한 0.4.2 이상에서는 'base64'을 사용하면 데이터가 손상 될 수있는 버그가 있습니다. 참조 : https://github.com/joyent/node/issues/738/