写一个加密字符串的方法

/**
 * 加密字符串
 * @param {string} str 需要加密的字符串
 * @param {string} key 加密密钥
 * @returns {string} 加密后的字符串
 */
function encryptString(str, key) {
  if (!str) {
    return "";
  }

  try {
    // 使用 CryptoJS 库进行 AES 加密
    const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
    const iv = CryptoJS.enc.Utf8.parse(key.substring(0, 16)); // 使用 key 的前 16 个字符作为 iv
    const encrypted = CryptoJS.AES.encrypt(str, keyUtf8, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });

    // 将加密结果转换为 Base64 编码
    return encrypted.toString();
  } catch (error) {
    console.error("加密失败:", error);
    return "";
  }
}


/**
 * 解密字符串
 * @param {string} encryptedStr 加密后的字符串
 * @param {string} key 解密密钥
 * @returns {string} 解密后的字符串
 */
function decryptString(encryptedStr, key) {
  if (!encryptedStr) {
    return "";
  }

  try {
    const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
    const iv = CryptoJS.enc.Utf8.parse(key.substring(0, 16)); // 使用 key 的前 16 个字符作为 iv

    const decrypted = CryptoJS.AES.decrypt(encryptedStr, keyUtf8, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });

    // 将解密结果转换为 UTF-8 编码
    return decrypted.toString(CryptoJS.enc.Utf8);
  } catch (error) {
    console.error("解密失败:", error);
    return "";
  }
}



// 使用示例:
const key = "YourSecretKey12345"; //  密钥长度建议至少 16 位
const originalString = "This is a secret message.";

const encryptedString = encryptString(originalString, key);
console.log("Encrypted:", encryptedString);

const decryptedString = decryptString(encryptedString, key);
console.log("Decrypted:", decryptedString);



// 引入 CryptoJS 库 (在 HTML 文件中)
// <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

代码解释和要点:

  • 依赖 CryptoJS: 这段代码使用了 CryptoJS 库进行 AES 加密。你需要在你的 HTML 文件中引入 CryptoJS 库。
  • AES 加密: AES 是一种对称加密算法,这意味着加密和解密使用相同的密钥。
  • 密钥 (key): 密钥 key 用于加密和解密,非常重要。建议使用长度至少为 16 位的强密钥,并妥善保管,不要将其暴露在客户端代码中。 理想情况下,密钥应该存储在服务器端,并在需要时安全地传输到客户端。
  • 初始化向量 (IV): iv (初始化向量)增加了加密的安全性,防止相同的明文在使用相同的密钥加密时产生相同的密文。这里使用了 key 的前 16 个字符作为 IV。
  • CBC 模式: CBC (Cipher Block Chaining) 模式是一种常用的加密模式,它将每个明文块与前一个密文块进行异或运算后再进行加密,提高了安全性。
  • PKCS7 填充: PKCS7 填充是一种标准的填充方式,用于处理明文长度不是加密块大小整数倍的情况。
  • Base64 编码: 加密后的结果是二进制数据,为了方便存储和传输,将其转换为 Base64 编码的字符串。
  • 错误处理: 代码包含了 try...catch 块来处理潜在的错误,例如密钥或密文格式无效。
  • 安全性: 虽然这段代码提供了前端加密的功能,但需要注意的是,纯前端的加密并不能保证绝对的安全性。攻击者仍然可以通过分析你的 JavaScript 代码来获取密钥。 为了更高的安全性,建议将加密操作放在服务器端进行。

改进建议:

  • 密钥管理: 不要将密钥硬编码在客户端代码中。 最佳实践是将密钥
posted @   王铁柱6  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示