由於某些奇怪的原因,Node內置的Cipher
和Decipher
類未按預期工作。該documentation指出cipher.update
Node.js Crypto AES密碼
「返回的加密內容,並且在其流可以被稱爲新的數據很多次了。」
的docs還指出cipher.final
「返回任何剩餘的加密內容。」
然而,在我的測試中,你必須電話向cipher.final
獲取所有數據,從而使密碼對象毫無價值,並且處理您必須創建一個新的Cipher對象的下一個塊。
var secret = crypto.randomBytes(16)
, source = crypto.randomBytes(8)
, cipher = crypto.createCipher("aes128", secret)
, decipher = crypto.createDecipher("aes128", secret);
var step = cipher.update(source);
var end = decipher.update(step);
assert.strictEqual(source.toString('binary'), end); // should not fail, but does
注意,這個使用crypto.createCipher
或crypto.createCipheriv
時,與祕密的初始化向量發生。解決方法是,以取代線6和7用下列:
var step = cipher.update(source) + cipher.final();
var end = decipher.update(step) + decipher.final();
但對此,如前所述,使兩者cipher
和decipher
毫無價值。
這就是我期望Node內置的加密技術能夠工作的原理,但它顯然不適用。這是我如何使用它或Node中的錯誤的問題?或者我期待錯誤的事情?我可以直接執行AES,但這會很耗時和煩人。每次我需要加密或解密時,是否應該創建一個新的Cipher
或Decipher
對象?這看起來很昂貴,如果我這樣做是一個流的一部分。
禁用填充是不安全的 –
感謝您的提示。在上下文中,這並不重要,因爲我試圖在安全性不重要的環境中模擬安全系統的協議。 – skeggse
is atuo padding salt –