淺談nodejs中的Crypto模塊

淺談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類的創建
  2. 使用Decipher類解密數據
  3. Decipher類使用示例

 

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());
});
posted @ 2017-07-28 18:02 General_up 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章