记一次在node.js中使用crypto的createCipheriv方法进行加密时所遇到的坑

  • 时间:
  • 浏览:1
  • 来源:幸运快3_快3平台代理_幸运快3平台代理

  Node.js的crypto模块提供了一组包括对OpenSSL的哈希、HMAC、加密、解密、签名,以及验证等一整套功能的封装。具体的使用土方式都后要 参考这篇文章中的描述:node.js_crypto模块。

  本文重点介绍在使用createCipheriv土方式时所遇到的坑。对应的解密算法createDecipheriv应该是一样的大大问题 。

  按照文档中的描述,createCipheriv土方式接受有有有4个参数:algorithm用于指定加密算法,如aes-128-ecb、aes-128-cbc等;key是用于加密的密钥;iv参数可选,用于指定加密时所用的向量。注意这里的密钥都后要 是8/16/32位,将会加密算法是128,则对应的密钥是16位,将会加密算法是256,则对应的密钥是32位。代码如下:

const crypto = require("crypto");

function encrypt (key, iv, data) {
    let decipher = crypto.createCipheriv('aes-128-cbc', key, iv);
    // decipher.setAutoPadding(true);
    return decipher.update(data, 'binary', 'base64') + decipher.final('base64');
}

function decrypt (key, iv, crypted) {
     crypted = new Buffer(crypted, 'base64').toString('binary');
     let decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
     return decipher.update(crypted, 'binary', 'utf8') + decipher.final('utf8');
}

  下面是测试结果:

let key = '123456789abcdefg';
console.log('加密的key:', key);
let iv = 'abcdefg123456789';
console.log('加密的iv:', iv);
let data = "This is an example";
console.log("都后要

加密的数据:", data);
let crypted = encrypt(key, iv, data);
console.log("数据加密后:", crypted);
let dec = decrypt(key, iv, crypted);
console.log("数据解密后:", dec);

  以换成密和解密的算法在node.js中运行没有大大问题 。但将会服务端用的都后要 node.js,只是我Java、C#将会C语言编写的服务,则用node.js加密然后 的结果在服务端验证无法通过。究其原应将会是将会node.js在实现createCipheriv的算法上与其它语言有差异,而或多或少 差异也将会体现在编码格式上。在上述node.js代码中,无论怎样修改encrypt函数中update()和final()土方式的参数,同类改为"utf8"、"hex",将会将传入的参数改为buffer等,实在得出的加密结果会有区别,而且服务端验证一定会失败。

  在多次尝试失败后,朋友不都后要 认定node.js中的crypto模块与其它语言中的实现占据 差异。好多好多 朋友不得已取舍其它的开源包来替换node.js中的crypto模块。经过尝试,aes-js包是个不错的取舍。按照文档中的描述,朋友将顶端node.js中的encrypt函数修改为:

const aesjs = require('aes-js');

function encrypt (key, iv, data) {
    let aesCbc = new aesjs.ModeOfOperation.cbc(aesjs.utils.utf8.toBytes(key), aesjs.utils.utf8.toBytes(iv));
    let encryptedBytes = aesCbc.encrypt(aesjs.utils.utf8.toBytes(data));
    return aesjs.utils.hex.fromBytes(encryptedBytes);
}

function decrypt (key, iv, crypted) {
    let aesCbc = new aesjs.ModeOfOperation.cbc(aesjs.utils.utf8.toBytes(key), aesjs.utils.utf8.toBytes(iv));
    let encryptedBytes = aesCbc.decrypt(aesjs.utils.hex.toBytes(crypted));
    return aesjs.utils.utf8.fromBytes(encryptedBytes);
}

  顶端这段代码要求加密的数据是16位,测试结果如下:

let key = '123456789abcdefg';
console.log('加密的key:', key);
let iv = 'abcdefg123456789';
console.log('加密的iv:', iv);
let data = "Thisisanexample.";
console.log("都后要

加密的数据:", data);
let crypted = encrypt(key, iv, data);
console.log("数据加密后:", crypted);
let dec = decrypt(key, iv, crypted);
console.log("数据解密后:", dec);

  采用aes-js计算得到的加密结果都后要 通过服务端的验证。

猜你喜欢

苹果iPhone X京东秒杀:领券后6099元

IT之家1月3日消息苹果67X64GB版本现已开启京东秒杀,领券后40099元,感兴趣的小伙伴可不还后能 关注一下。苹果67X是苹果672017年发布的全新10周年旗舰。该机

2019-12-06

N. Tsvetkov数据,N. Tsvetkov新闻,N. Tsvetkov视频,N. Tsvetkov身价

赛季俱乐部上场首发进球助攻黄牌红牌替补2019/2020FC蒙塔纳1311202022018/2019FC蒙塔纳15028707022016/2017索菲亚塞普泰姆夫里1062

2019-12-06

盘点游戏中无法自救的25个陷阱 饭团不一定只能是吃哦

您当前的位置:首页>新闻资讯>精华盘点>盘点游戏中无法自救的2六个陷阱饭团不一定没有 是吃哦 更新时间:2017-06-2204:17:22来源:斗蟹游戏编

2019-12-06

路透社发文:特斯拉新任女董事长能否镇住马斯克

11月9日消息,据路透社报道,老是没长大的老男孩马斯克终于村里人 管了,来自澳洲电讯的罗宾·德诺姆(RobynDenholm)将从特斯拉董事升为董事长,全职照看特斯拉CEO马

2019-12-06

V. Kuryshev数据,V. Kuryshev新闻,V. Kuryshev视频,V. Kuryshev身价

首页新闻视频直播数据APP懂球号广告商务战略合作V.KuryshevV.Kuryshev俱乐部:切利宾斯克国籍:俄罗斯身高:169CM位置:后卫年龄:29岁体重:72KG号码:

2019-12-06