原文地址: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());
});