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