crypto-js遇到的坑

摘要:
最近,当我在H5网站上工作并使用websocket与后台交互时,我需要加密数据,所以我选择了crypto-js组件。GitHub上有很多api,编写也很清楚。但在实际使用中,我遇到了许多陷阱:在加密和解密时,传入的密钥需要转换为特定的数组,而不是字符串加密,当传入的明文需要转换成特定的数组时,解密时,密文数组需要特殊封装,要正确解密letaes_option={mode:CryptoJS.mode.ECB,paddi

最近在做H5网站,用websocket跟后台交互时,需要对数据进行加密,于是选了crypto-js组件,GitHub上api也不少,写的也清晰,但实际使用上会遇到不少坑:

  1. 加密解密时,传入的密钥key,需要转换为特定数组,不能是字符串
  2. 加密时,传入的明文需转换为特定数组
  3. 解密时,密文数组还要做特别的封装后,才能正确解密
let aes_option = {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
};
/**
 * @method AES加密
 * @param {string} txt 明文字符串
 * @param {string} key 密钥
 * @return {string} 加密后的字符串
 */
function aesEncrypt(txt, key){
    let uTxt = CryptoJS.enc.Utf8.parse(txt);
    let uKey = CryptoJS.enc.Utf8.parse(key);
    let result = CryptoJS.AES.encrypt(uTxt, uKey, aes_option);
    return result.toString();
};
/**
 * @method AES解密
 * @param {array} byteArray 密文二进制流
 * @param {string} key 密钥
 * @return {string} 解密后的字符串
 */
function aesDecrypt(byteArray, key){
    let uTxt = CryptoJS.lib.WordArray.create(byteArray);
    let uKey = CryptoJS.enc.Utf8.parse(key);
    let bytes = CryptoJS.AES.decrypt({ciphertext:uTxt}, uKey, aes_option);
    let result = CryptoJS.enc.Utf8.stringify(bytes).toString();
    return result;
};

免责声明:文章转载自《crypto-js遇到的坑》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇promise使用场景ios用户登录记住密码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring 框架的事务管理

1. Spring 框架的事务管理相关的类和API PlateformTransactionManager 接口: 平台事务管理器(真正管理事务的类); TransactionDefinition 接口: 事务定义信息(事务的隔离级别,传播行为,超时,只读等); TransactionStatus 接口: 事务的状态; 平台事务管理器真正管理事务对...

基于 gpusharedeviceplugin 的 k8s device plugin 分析

k8s device plugin 分析 device plugin 工作流程 技术细节 DP 启动的入口函数? DP 流程 DP 如何知道 DM 的 Unix socket 地址? Register 的细节 DM 调用 DP ListAndWatch 的时机? ListAndWatch 的参数 Allocate 详解 in kubelet ->...

string.Format出现异常"输入的字符串格式有误"的解决方法

string.Format出现异常"输入的字符串格式有误"的解决方法 今天在做项目时,碰到一个很奇怪的问题,我使用string.Format居然报“输入的字符串格式有误”的错误,我调了很久,还是不对,不明白错 在哪里,后来还是google了一下,原来我在字符串中出现了"{"字符。而"{"字符若出现在string.Format中是必需转义的,也就是要用两...

Map遍历法则

    /** * 如果既要遍历key又要value,那么建议这种方式,应为如果先获取keySet然后再执行map.get(key),map内部会执行两次遍历。 * 一次是在获取keySet的时候,一次是在遍历所有key的时候。 */ // 当我调用put(key,value)方法的时候...

JAVA对文件类型的校验

通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等。 2. 通过读取文件,获取文件的Content-type来判断。 3. 通过读取文件流,根据文件流中特定的一些字节标识来区分不同类型的文件。 4. 若是图片,则通过缩放来判断,可以缩放的为图片,不可以的则不是。 然而...

c# Winform PropertyGrid 实现下拉框 多选

1 usingPropertyGridHelpers.Controls; 2 usingSystem; 3 usingSystem.Collections.Generic; 4 usingSystem.ComponentModel; 5 usingSystem.Drawing.Design; 6 usingSystem.Windows.Forms;...