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

  • 时间:
  • 浏览:0
  • 来源:大发uu快3_uu快3娱乐_大发uu快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计算得到的加密结果还须要通过服务端的验证。

猜你喜欢

PDD希望小学完工是怎么回事 PDD小学具体信息一览

想必关注英雄联盟圈子的玩家都知道,主播PDD在2017年就现在开始了了英文接触需用捐助的希望小学,有刚刚决定捐资500万元给内蒙多伦县,就在最近,有媒体爆料PDD希望小学正式完

2020-01-18

《飘流幻境》手机版甜蜜七夕即将上线结婚系统

【斗蟹资讯】喂,瞧一瞧,看一看嘞~~~热乎乎的情报,嗯,刚出炉的,据说和臊子面一样酸甜苦是咸emmm...啊呀,我怕是吃到了假的臊子面~~~心塞塞,不过,萝卡情人关系提示,情报

2020-01-18

小米悦米机械键盘Pro静音版开售:599元、TTC静音红轴

IT之家4月25日消息 今天小米商城上线了一款全新的机械键盘——悦米机械键盘Pro静音版。悦米机械键盘Pro静音版采用了CNC全铝机身设计,内置TTC静音红轴,支持背光,共拥有

2020-01-18

中國長城文化學術研討會 助推新時代長城文化事業大發展

探討長城文旅融合創新共繪長城公園建設藍圖大公網訊共議長城保護利用發展大計,共繪長城國家文化公園建設藍圖。10月29日至31日,中國長城文化學術研討會在北京市八達嶺長城腳下——延

2020-01-18

负暄集/秋声裏/赵阳

前天早上醒来,推开窗,一阵秋风带着清新的草丛气息扑面而来,不要探头张望,就知道是小区在进行绿化作业。风裏面带着丝丝凉意,终於同类秋的意思了。我着实我知道距离气象意义上的秋天,还

2020-01-18