前端使用 CryptoJS 实现 AES 解密

        近日,有这样一个业务场景,后端在接口返回一些敏感数据的时候,使用了 aes 加密了部分字段,比如脱敏之后的身份证号,手机号等等,我在前端接受到这些加密过的数据之后,要先处理一遍,在这过程中踩了一些坑,在这里记录一下。

        首先,要关注一下后端返回的加密字段的密文的编码格式,比如后端可能会返回 16进制 / utf-8 / base64 等等各种进制的密文,当然,如果跟你合作的是一个负责任的有经验的后端,他会告诉你这些加密过程中的细节,以及返回的密文结构,但是很不幸,我这次合作的后端应该之前没搞过加密,他只给我一个加密时候用的 key,让我自己解密,我问他其他一些问题,他都回答不出来,于是,我前面试了好几次解密,都只解析出来空值,最终,我参考了一个在线解密网站的解析过程,终于完成了解密。

        在我的业务场景中,后端返回给我的是一个 16 进制的加密密文,和一个解密用的 16位密钥,参考在线解密网站 AES在线解密 AES在线加密 Aes online hex 十六进制密钥 - The X 在线工具

 查看他解密过程发现传输过程中,他都是用 base64 格式,最后再把 base64 转换成 utf-8 明文。

参考在线解密的过程,我实现了 16 进制密文 aes 解密:

  let hexString = "xxxxx16进制密文";
  // 密钥(必须与加密时使用的密钥相同)
  let key = 'xxxxx16位密钥';
  try {
    // 将字符串密文转换为字节数组
    let ciphertextBytes = CryptoJS.enc.Hex.parse(hexString);
    let keyBytes = CryptoJS.enc.Utf8.parse(key);
    let iv = CryptoJS.lib.WordArray.create(0); // 随机创建一个 iv,在 ECB 模式下,不需要iv
    // 进行解密操作
    let decryptedBytes = CryptoJS.AES.decrypt({ ciphertext: ciphertextBytes }, keyBytes, {
      iv,
      padding: CryptoJS.pad.Pkcs7,
      mode: CryptoJS.mode.ECB,
    });
    // 将解密后的字节数组转换为字符串
    let decryptedText = decryptedBytes.toString(CryptoJS.enc.Utf8);
    return decryptedText;
  } catch (error) {
    console.error('Decryption error:', error);
  }

  这样即可成功解密,主要还是得跟后端约定好加密解密的一些配置项。

        另外记录一下,前端也可以用 JSEncrypt 这个库很方便进行 RSA 加密解密。

猜你喜欢

转载自blog.csdn.net/qq_42348464/article/details/132314192