window.crypto
是 Web Crypto API 的一部分,它提供了一个接口来访问基本的加密操作,包括生成加密密钥、签名、验证签名、加密和解密数据等。这个 API 旨在为 Web 应用提供一个安全的方式来处理加密任务,而不需要依赖第三方库。
属性和方法
window.crypto
对象包含以下主要的属性和方法:
crypto.subtle
:提供了一组异步的加密操作,如加密、解密、签名和验证签名等。crypto.getRandomValues()
:用于生成加密安全的随机值。
1. 生成加密安全的随机值
javascript
// 生成一个 256 位的随机数组
const array = new Uint8Array(256 / 8);
window.crypto.getRandomValues(array);
console.log(array);
2. 使用 crypto.subtle
进行加密和解密
javascript
// 异步生成一个加密密钥
window.crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
).then(key => {
// 使用密钥加密数据
const data = new TextEncoder().encode("Hello World");
window.crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: window.crypto.getRandomValues(new Uint8Array(12))
},
key,
data
).then(encrypted => {
// 异步解密数据
window.crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: new Uint8Array(12) // 需要与加密时的 IV 相同
},
key,
encrypted
).then(decrypted => {
const dec = new TextDecoder().decode(decrypted);
console.log(dec); // 输出:Hello World
});
});
});
3. 使用 crypto.subtle
进行签名和验证签名
javascript
// 异步生成一个签名密钥
window.crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: {name: "SHA-256"}
},
true,
["sign", "verify"]
).then(keyPair => {
const data = new TextEncoder().encode("Hello World");
// 签名数据
window.crypto.subtle.sign(
"RSASSA-PKCS1-v1_5",
keyPair.privateKey,
data
).then(signature => {
// 验证签名
window.crypto.subtle.verify(
"RSASSA-PKCS1-v1_5",
keyPair.publicKey,
signature,
data
).then(isVerified => {
console.log(isVerified); // 输出:true
});
});
});
Web Crypto API 在 Node.js 中如何使用
要在 Node.js 中使用类似于 Web Crypto API 的功能,你可以使用以下替代方案:
1. crypto
模块
Node.js 自带了一个名为 crypto
的核心模块,它提供了加密功能,包括哈希、HMAC、加密解密、签名验证等。
javascript
使用 crypto 模块进行加密和解密
const crypto = require('crypto');
// 加密
function encrypt(text) {
const cipher = crypto.createCipher('aes-256-cbc', 'secret-key');
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
// 解密
function decrypt(encrypted) {
const decipher = crypto.createDecipher('aes-256-cbc', 'secret-key');
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
const originalText = 'Hello, world!';
const encryptedText = encrypt(originalText);
const decryptedText = decrypt(encryptedText);
console.log(`Original: ${originalText}`);
console.log(`Encrypted: ${encryptedText}`);
console.log(`Decrypted: ${decryptedText}`);
2. node-forge
库
node-forge
是一个纯 JavaScript 编写的库,提供了许多加密功能,包括 PKI、PSS、OAEP、SHA 系列等。
安装 node-forge
bash
npm install node-forge
javascript
使用 node-forge 进行签名和验证
const forge = require('node-forge');
// 生成密钥对
const keypair = forge.pki.rsa.generateKeyPair({bits: 1024, e: 0x10001});
// 签名
const md = forge.md.sha256.create();
md.update('Hello, world!', 'utf8');
const signature = keypair.privateKey.sign(md);
// 验证签名
const verified = keypair.publicKey.verify(md.digest().data, signature);
console.log('Signature verified:', verified);
3. crypto-browserify
或 node-crypto
(之前称为 crypto
)
这些库提供了一个与 Web Crypto API 类似的 API,可以在 Node.js 环境中使用。
安装 crypto-browserify
bash
npm install crypto-browserify
javascript
使用 crypto-browserify 进行哈希计算
const crypto = require('crypto-browserify');
const hash = crypto.createHash('sha256');
hash.update('Hello, world!');
const result = hash.digest('hex');
console.log(result);
window.crypto
的优势
优势
安全性:
- 提供了一个安全的随机数生成器,可以生成加密安全的随机值,这对于密码学应用至关重要。
标准化:
- 作为 Web 标准的一部分,
window.crypto
在所有现代浏览器中都有一致的实现,这意味着开发者可以在不同的浏览器和平台上使用相同的代码。功能丰富:
- 提供了多种加密算法,包括对称加密(如 AES)和非对称加密(如 RSA、ECDSA),以及哈希函数(如 SHA-256)。
异步操作:
- 所有加密操作都是异步的,不会阻塞主线程,这对于提高网页性能和用户体验非常重要。
密钥管理:
- 允许在用户的浏览器中生成和存储加密密钥,而不需要将密钥发送到服务器。
集成性:
- 与 Web 应用的其他部分(如 IndexedDB、Service Workers)集成良好,可以用于实现安全的数据存储和通信。
劣势浏览器限制:
- 只能在浏览器环境中使用,不适用于 Node.js 或其他非浏览器环境。
复杂性:
- 对于复杂的加密操作,API 可能显得复杂和难以理解,尤其是对于初学者。
性能问题:
- 某些加密操作可能比较耗时,尤其是在性能较差的设备上。
错误处理:
- 错误处理依赖于 Promise,可能不如传统的回调方式直观。
兼容性:
- 尽管大多数现代浏览器都支持
window.crypto
,但一些非常旧的浏览器可能不支持,这可能需要 polyfills 或降级方案。
window.crypto
在日常开发中的使用场景包括但不限于:安全通信:
- 使用 Web Crypto API 加密和解密数据,以保护用户数据的隐私和完整性。
身份验证:
- 生成和验证数字签名,用于用户身份验证或确保数据的来源。
密钥交换:
- 使用非对称加密算法安全地交换密钥,为对称加密通信提供基础。
随机数生成:
- 生成加密安全的随机数,用于密码学应用,如生成安全的密码或密钥。
本地数据存储:
- 存储加密的数据,如用户凭据或敏感信息,以防止未经授权的访问。
WebAssembly 集成:
- 与 WebAssembly 集成,为高性能的加密操作提供支持。
区块链和加密货币:
- 实现区块链技术中的加密算法,处理加密货币交易。
END.