前后端加密传输

150 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

AES算法

项目中用到AES算法做传输加密的优点 1、对内存的需求非常低,适合于受限环境 2、运算速度快 3、分组长度和密钥长度设计灵活 4、很好的抵抗差分密码分析及线性密码分析的能力 5、AES的密钥长度比DES大,它也可设定为32比特的任意倍数,最小值为128比特,最大值为256比特,所以用穷举法是不可能破解的

安装crypto-js依赖

npm install crypto-js --save-dev

aes.js

import CryptoJS from "crypto-js";
//随机生成指定数量的32进制key
export default {
  generatekey(num) {
    const library =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    let key = "";
    for (let i = 0; i < num; i++) {
      const randomPoz = Math.floor(Math.random() * library.length);
      key += library.substring(randomPoz, randomPoz + 1);
    }
    return key;
  },
  //加密
  encrypt(word, keyStr) {
    // 判断是否存在keyStr,不存在就用默认的keyStr(注意:这个keyStr必需要前后端统一,不然双方加密解密后会不相同。调用generatekey方法生成)
    keyStr = keyStr ? keyStr : "1grLx91U40VawzhRAm7E";
    const key = CryptoJS.enc.Utf8.parse(keyStr);
    const srcs = CryptoJS.enc.Utf8.parse(word);
    const encrypted = CryptoJS.AES.encrypt(srcs, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
  },
  //解密
  decrypt(word, keyStr) {
    keyStr = keyStr ? keyStr : "1grLx91U40VawzhRAm7E";
    const key = CryptoJS.enc.Utf8.parse(keyStr);
    const decrypt = CryptoJS.AES.decrypt(word, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    });
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
  }
};

思考优化

个人认为,对于这种加密方式,还是不够完美。

  • 一般来说,后端对一些字段的存储,还是需要做单独的加密,再存到库中
  • 对于前端传过去的值,后端大概率是需要解密的
  • 如果如上述代码,不管是写死一个加密的key,或者随机生成一个加密的key,都得需要传给后端,这个key就有泄漏的风险(拿到这个key/解密的函数)在线加密解密工具
  • 所以,最好,这个key由后端通过一定的算法生成,动态传递给客户端,客户端用这个key做加密操作,然后把加密后的数据传给后端,解密放在服务端

参考思路

思路