JavaScript 提供了多种加密和解密的方法,可以用于保护敏感数据,如密码、API密钥等。在下面的文章中,我将详细介绍如何在 JavaScript 中实现加密与解密操作,包括使用内置的 CryptoJS 库和 Web Crypto API。
一、使用 CryptoJS 库
CryptoJS 是一个广泛使用的 JavaScript 加密库,它提供了多种加密算法和模式。以下是如何使用 CryptoJS 进行加密和解密的简单示例:
1. 安装 CryptoJS
首先,你需要将 CryptoJS 添加到你的项目中。可以通过以下几种方式:
通过 CDN 链接直接引入:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>通过 npm 安装:
npm install crypto-js
2. 加密
以下是一个使用 AES 加密算法的示例:
// 引入 CryptoJS
const CryptoJS = require("crypto-js");
// 待加密的文本
const message = "Hello, world!";
// 密钥
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
// 加密
const encrypted = CryptoJS.AES.encrypt(message, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(encrypted.toString()); // 输出加密后的字符串
3. 解密
以下是一个解密的示例:
// 引入 CryptoJS
const CryptoJS = require("crypto-js");
// 加密后的字符串
const encrypted = "U2FtcGxlIFdvcmxkIQ==";
// 密钥
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
// 解密
const decrypted = CryptoJS.AES.decrypt(encrypted, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypted.toString(CryptoJS.enc.Utf8)); // 输出解密后的文本
二、使用 Web Crypto API
Web Crypto API 是一个原生 JavaScript API,提供了加密和数字签名功能。以下是如何使用 Web Crypto API 进行加密和解密的示例:
1. 加密
async function encryptWithWebCrypto(message, password) {
// 创建一个密码对象
const passwordBytes = new TextEncoder().encode(password);
// 创建一个密钥
const key = await window.crypto.subtle.importKey(
"raw",
passwordBytes,
{
name: "PBKDF2",
salt: window.crypto.getRandomValues(new Uint8Array(16)),
iterations: 10000,
hash: "SHA-256"
},
false,
["encrypt", "decrypt"]
);
// 加密
const encrypted = await window.crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: window.crypto.getRandomValues(new Uint8Array(12))
},
key,
new TextEncoder().encode(message)
);
return encrypted;
}
// 使用示例
encryptWithWebCrypto("Hello, world!", "password").then(encrypted => {
console.log(new Uint8Array(encrypted)); // 输出加密后的数据
});
2. 解密
async function decryptWithWebCrypto(encrypted, password) {
// 创建一个密码对象
const passwordBytes = new TextEncoder().encode(password);
// 创建一个密钥
const key = await window.crypto.subtle.importKey(
"raw",
passwordBytes,
{
name: "PBKDF2",
salt: window.crypto.getRandomValues(new Uint8Array(16)),
iterations: 10000,
hash: "SHA-256"
},
false,
["encrypt", "decrypt"]
);
// 解密
const decrypted = await window.crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: window.crypto.getRandomValues(new Uint8Array(12))
},
key,
encrypted
);
return new TextDecoder().decode(decrypted);
}
// 使用示例
decryptWithWebCrypto(new Uint8Array([/* 加密后的数据 */]), "password").then(decrypted => {
console.log(decrypted); // 输出解密后的文本
});
总结
在 JavaScript 中,你可以使用多种方法实现加密和解密操作。CryptoJS 库和 Web Crypto API 都提供了丰富的功能,可以根据你的需求选择合适的方法。无论使用哪种方法,都请确保你的密钥和算法安全可靠,以保护你的数据不被未授权访问。
