TypeScript 中的密码学:加密与哈希
现代 Web 开发离不开数据安全保障。TypeScript 作为 JavaScript 的强类型超集,为开发者提供了实现密码学算法的强大工具。本文将介绍 TypeScript 生态系统中可用的主要加密和哈希方法,并展示如何在实际中应用它们。
为什么密码学在 TypeScript 中很重要?
TypeScript 广泛用于前端和后端(通过 Node.js)。在这两种情况下,都需要保护敏感数据:用户密码、身份验证令牌、消息内容。如果没有适当的密码学保护,数据可能会被截获或泄露。
TypeScript 中的密码学解决三个主要问题:
- 机密性 — 加密数据,防止未经授权的人员读取。
- 完整性 — 确保数据在传输过程中未被篡改。
- 身份验证 — 验证数据来源的真实性。
TypeScript 的主要密码学库
在 TypeScript 中,既可以使用浏览器内置 API,也可以使用第三方库。以下是最流行的选项:
1. Web Crypto API(浏览器内置)
标准 API,适用于现代浏览器和 Node.js(15 版本及以上)。无需安装额外包。支持 AES、RSA、SHA 等。
2. crypto(Node.js 库)
Node.js 内置模块,提供广泛的密码学函数。对于 TypeScript,需要安装类型定义:npm install @types/node。
3. bcrypt / bcryptjs
专门用于密码哈希的库。由于内置加盐保护,推荐用于存储用户密码。
4. tweetnacl / nacl
用于公钥加密的库(NaCl)。性能高且易于使用。
TypeScript 中的数据加密
我们将介绍两种主要加密类型:对称加密(单密钥)和非对称加密(密钥对)。
使用 AES-GCM 进行对称加密
AES(高级加密标准)在 GCM 模式下既提供加密,也提供数据完整性验证。以下是使用 Web Crypto API 的 TypeScript 实现示例:
// AES-GCM 加密函数async function encryptAESGCM( plaintext: string, password: string): Promise<{ iv: Uint8Array; ciphertext: Uint8Array }> { const encoder = new TextEncoder(); const keyMaterial = await crypto.subtle.importKey( 'raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits', 'deriveKey'] );
const key = await crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode('my-salt'), iterations: 100000, hash: 'SHA-256', }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt'] );
const iv = crypto.getRandomValues(new Uint8Array(12)); const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, encoder.encode(plaintext) );
return { iv, ciphertext: new Uint8Array(encrypted), };}
// 使用示例const { iv, ciphertext } = await encryptAESGCM('秘密消息', '我的密码');console.log('加密数据:', ciphertext);使用 RSA-OAEP 进行非对称加密
RSA 使用密钥对:公钥用于加密,私钥用于解密。以下是密钥生成和加密示例:
// 生成 RSA 密钥对async function generateRSAKeyPair(): Promise<CryptoKeyPair> { return await crypto.subtle.generateKey( { name: