/**
* 加密字符串
* @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 代码来获取密钥。 为了更高的安全性,建议将加密操作放在服务器端进行。
改进建议:
- 密钥管理: 不要将密钥硬编码在客户端代码中。 最佳实践是将密钥