淺談nodejs中的Crypto模塊
原文地址:https://cnodejs.org/topic/504061d7fef591855112bab5
+
Node.js的加密模塊crypto之使用Decipher類解密數據
2015年07月20日 407 聲明
前文件介紹了Node.js的crypto模塊中Cipher
類,Cipher
類用於對流數據進行加密的。在數據傳輸前對數據進行加密碼可以保證數據傳輸的安全。對於加密碼的數據,在收到加密碼數據後,需要對數據進行解密。crypto模塊中封將了Decipher
類,用於對Cipher
加密數據的解密。
1. Decipher
類的創建
創建Cipher
類可以crypto.createCipher()
和crypto.createCipheriv()
兩個方法。創建Decipher
類也有兩個對應的鏡像方法分別是:crypto.createDecipher()
和crypto.createDecipheriv()
。
crypto.createDecipher(algorithm, password)
:根據給定的算法和密鑰,創建並返回一個Decipher
解密對象。crypto.createDecipheriv(algorithm, key, iv)
:根據給定的算法,密鑰和初始化向量,創建並返回一個Decipher
解密對象。
2. 使用Decipher
類解密數據
Decipher
解密對象是一個可讀寫的Stream
流。可以使用Decipher
類中的update
方法寫入需要解密的數據,數據輸入完成後通過final
方法返回解密後的數據。
decipher.update(data, [input_encoding], [output_encoding])
:更新Decipher
類解密數據。data
:要更新的Decipher
解密對象的數據,編碼input_encoding
可以是:'utf8'
、'ascii'
、'binary'
。如果沒有編碼參數,那麼data
必須是一個Buffer
。output_encoding
指定解密數據的輸出編碼,可以是:'binary'
、'base64'
或'hex'
,如果未設置這個參數,將會返回一個Buffer
。decipher.final([output_encoding])
:返回解密後的內容,output_encoding
爲:'binary'
、'base64'
或'hex'
。 如果沒有提供編碼格式,如果未設置這個參數,將會返回一個Buffer
。
注意:調用 digest()後不能再用Decipher
對象cipher.setAutoPadding(auto_padding=true)
:如果數據以非標準的塊填充方式被加密,那麼你可以禁用自動填充來防止decipher.final
對數據進行檢查和移除。這只有在輸入數據的長度是加密器塊大小的整倍數時纔有效。這個方法必須在數據流傳給decipher.update
之前調用。cipher.setAuthTag(buffer)
:對於加密認證模式(目前支持:GCM),必須用這個方法來傳遞接收到的認證標誌。如果沒有提供標誌或者密文被篡改,將會拋出final
標誌,認證失敗,密文會被拋棄。cipher.setAAD(buffer)
:對於加密認證模式(目前支持:GCM),用這個方法設置附加認證數據( AAD )。
3. Decipher
類的使用
當前文件夾下有文件file1
,文件內容爲:abcdef。讀取文件內容,使用Cipher
類加密文件內容後,再用Decipher
類對加密內容進行解密:
var crypto = require('crypto'); var fs = require('fs'); var cipher = crypto.createCipher('aes192', new Buffer('my password')); var decipher = crypto.createDecipher('aes192', new Buffer('my password')); var s = fs.ReadStream('./file1'); s.on('data', function(d) { cipher.update(d); }); s.on('end', function() { var d = cipher.final(); console.log('加密後的數據是:%s', d.toString('hex')); decipher.update(d); console.log('解密後的數據是:%s', decipher.final().toString()); });