TypeScript 中的密码学:加密与哈希

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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:                    

推荐