2010-12-21 78 views
8

我對Node的加密庫有奇怪的問題。我寫了這個簡單的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)時,它是空的。由於某種原因,如果我將測試設置爲「123 | 123123」,它會起作用。那麼爲什麼「123 | 123123」工作但「123 | 123123123123123」不工作?

+1

文本的最後工作長度似乎爲15個字符。 – Mike 2010-12-21 08:50:18

回答

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'); 

我得到「12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585」對加密後和「123 | 123123123123123」的DEC中以上節點v0.2.5

+3

RandomEtc是正確的,請記住,在node.js中,一切都精簡了,以及流。散列函數和密碼函數可以用文本更新任意次數,它只是向文本添加文本,但要得到結果,您必須執行hash.digest或cipher.final – Vanwaril 2011-01-02 18:55:19

+0

RandomEtc,感謝您的回答。它終於讓我在那裏加密的東西! :) – 2011-07-13 03:56:21

8

RandomEtc是正確的,但只是爲了防止任何人在這個問題上磕磕碰碰'base64'作爲他們的編碼:不要。堅持到'hex'。至少從0.4.2開始,使用'base64'時會出現一個可能導致數據損壞的錯誤。請參閱:https://github.com/joyent/node/issues/738/