浅谈nodejs中的Crypto模块

原文地址:https://cnodejs.org/topic/504061d7fef591855112bab5

+

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());
});