跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptNode.js大前端算法

Web 开发中五种核心加密算法实战与原理

Web 安全是开发基石。深入解析 AES、RSA、SHA-256、HMAC 及 PBKDF2 五大核心算法。涵盖对称与非对称加密、哈希认证及密钥派生机制,提供 Node.js 与浏览器环境下的实战代码。结合最佳实践,帮助开发者构建高安全性应用,避免常见密钥管理与传输漏洞。

BackendPro发布于 2026/3/27更新于 2026/10/16102 浏览
Web 开发中五种核心加密算法实战与原理

五种常用 Web 加密算法实战及原理详解

在现代 Web 开发中,数据安全是重中之重。无论是传输中的敏感信息还是存储的密码,选择合适的加密方案都是构建安全应用的基础。下面我们来深入探讨五种最常用的 Web 加密算法,结合原理、场景以及 Node.js 和浏览器环境下的实战代码。

1. AES (高级加密标准)

原理详解

AES 是一种对称加密算法,意味着加密和解密使用同一个密钥。它基于替代 - 置换网络 (SPN) 结构,通过多轮迭代来混淆数据。主要流程包括密钥扩展、初始轮的轮密钥加,以及主轮中的字节替换、行移位、列混淆等操作。最终轮会省略列混淆步骤。AES 支持 128、192 和 256 位密钥长度,分别对应 10、12 和 14 轮加密。

算法原理示意图

应用场景
  • HTTPS 传输中的数据加密
  • 数据库敏感字段加密
  • 文件加密存储
实战代码(Node.js)

在 Node.js 中,我们直接使用内置的 crypto 模块。这里以 AES-256-CBC 模式为例,注意初始化向量 (IV) 必须随机生成且不可预测。

const crypto = require('crypto');

// AES-256-CBC 加密
function encrypt(text, key, iv) {
    const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
    let encrypted = cipher.update(text);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return encrypted.toString('hex');
}

// AES-256-CBC 解密
function decrypt(encryptedText, key, iv) {
    const encryptedBuffer = Buffer.from(encryptedText, 'hex');
    const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
    let decrypted = decipher.update(encryptedBuffer);
    decrypted = Buffer.concat([decrypted, decipher.final()]);
    return decrypted.toString();
}

// 使用示例
const key = crypto.randomBytes(32); // 256 位密钥
const iv = crypto.randomBytes(16);  // 初始向量
const message = 'Secret Message';

const encrypted = encrypt(message, key, iv);
console.log('Encrypted:', encrypted);

const decrypted = decrypt(encrypted, key, iv);
console.log('Decrypted:', decrypted);

2. RSA (非对称加密)

原理详解

RSA 基于大整数因数分解的数学难题。它包含一对密钥:公钥用于加密,私钥用于解密。生成过程涉及选择两个大素数 p 和 q,计算模数 n 和欧拉函数 φ(n),进而导出公钥指数 e 和私钥指数 d。虽然安全性高,但计算开销较大,通常只用于加密小数据量或交换对称密钥。

算法原理示意图

应用场景
  • SSL/TLS 握手过程中的密钥交换
  • 数字签名
  • 加密对称密钥
实战代码(Node.js)

Node.js 提供了 generateKeyPairSync 方法快速生成密钥对。实际应用中,建议将公钥分发给客户端,私钥严格保密。

const crypto = require('crypto');

// 生成 RSA 密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048,
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem'
    }
});

// RSA 加密
function rsaEncrypt(data, publicKey) {
    return crypto.publicEncrypt({
        key: publicKey,
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: 'sha256'
    }, Buffer.from(data)).toString('base64');
}

// RSA 解密
function rsaDecrypt(encryptedData, privateKey) {
    return crypto.privateDecrypt({
        key: privateKey,
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: 'sha256'
    }, Buffer.from(encryptedData, 'base64')).toString();
}

// 使用示例
const message = 'Confidential Data';
const encrypted = rsaEncrypt(message, publicKey);
console.log('RSA Encrypted:', encrypted);

const decrypted = rsaDecrypt(encrypted, privateKey);
console.log('RSA Decrypted:', decrypted);

3. SHA-256 (安全哈希算法)

原理详解

SHA-256 属于 SHA-2 家族,输出固定长度的 256 位哈希值。它不是加密算法,无法解密,主要用于验证数据完整性。其过程包括消息填充、分块处理以及 64 轮压缩函数运算。任何微小的输入变化都会导致哈希值的巨大差异(雪崩效应)。

算法原理示意图

应用场景
  • 密码存储(需配合盐值)
  • 数据完整性验证
  • 区块链和加密货币
  • 数字签名
实战代码(浏览器环境)

现代浏览器支持 Web Crypto API,这是比 crypto-js 等库更底层、更安全的选择。注意这是一个异步操作。

// 浏览器中使用 Web Crypto API 进行 SHA-256 哈希
async function sha256Hash(message) {
    // 将字符串编码为 Uint8Array
    const encoder = new TextEncoder();
    const data = encoder.encode(message);

    // 计算哈希
    const hashBuffer = await crypto.subtle.digest('SHA-256', data);

    // 将 ArrayBuffer 转换为十六进制字符串
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
    return hashHex;
}

// 使用示例
sha256Hash('Hello World').then(hash => console.log('SHA-256 Hash:', hash));

4. HMAC (基于哈希的消息认证码)

原理详解

HMAC 结合了哈希函数和共享密钥,既能验证消息来源的真实性,又能确保消息未被篡改。公式上,它是对密钥进行两次哈希填充(ipad 和 opad)后与消息混合。这能有效防止重放攻击和伪造请求。

算法原理示意图

应用场景
  • API 请求认证
  • JWT 签名
  • 消息完整性验证
实战代码(Node.js)

实现 HMAC 时,务必使用恒定时间比较函数(如 timingSafeEqual)来验证结果,防止时序攻击泄露有效签名。

const crypto = require('crypto');

// 生成 HMAC
function generateHMAC(message, secret) {
    return crypto.createHmac('sha256', secret).update(message).digest('hex');
}

// 验证 HMAC
function verifyHMAC(message, secret, hmac) {
    const expectedHmac = generateHMAC(message, secret);
    return crypto.timingSafeEqual(
        Buffer.from(expectedHmac),
        Buffer.from(hmac)
    );
}

// 使用示例
const secretKey = 'mySecretKey123';
const message = 'Important Data';
const hmac = generateHMAC(message, secretKey);
console.log('HMAC:', hmac);

const isValid = verifyHMAC(message, secretKey, hmac);
console.log('Verification:', isValid ? 'Valid' : 'Invalid');

5. PBKDF2 (基于密码的密钥派生函数)

原理详解

PBKDF2 专门用于将弱密码转化为强密钥。它通过大量迭代哈希运算增加暴力破解的成本。输入包括密码、盐值、迭代次数和期望密钥长度。每次迭代的输出会与上一次结果异或,最终组合成派生密钥。

算法原理示意图

应用场景
  • 用户密码存储
  • 从密码生成加密密钥
实战代码(Node.js)

密码存储场景中,盐值必须唯一且随机。验证密码时,重新计算哈希并与存储值比对。

const crypto = require('crypto');

// 使用 PBKDF2 派生密钥
function deriveKey(password, salt, iterations, keyLength, digest) {
    return crypto.pbkdf2Sync(
        password,
        salt,
        iterations,
        keyLength,
        digest
    ).toString('hex');
}

// 使用示例
const password = 'userPassword123';
const salt = crypto.randomBytes(16).toString('hex'); // 生成随机盐
const iterations = 10000; // 迭代次数
const keyLength = 32;     // 密钥长度(字节)
const digest = 'sha256';  // 哈希算法

const derivedKey = deriveKey(password, salt, iterations, keyLength, digest);
console.log('Derived Key:', derivedKey);
console.log('Salt:', salt);

// 验证密码示例
function verifyPassword(password, storedHash, storedSalt, iterations, keyLength, digest) {
    const newHash = deriveKey(password, storedSalt, iterations, keyLength, digest);
    return newHash === storedHash;
}

const isMatch = verifyPassword('userPassword123', derivedKey, salt, iterations, keyLength, digest);
console.log('Password Match:', isMatch);

加密算法对比表

算法类型密钥长度安全性性能适用场景
AES对称加密128/192/256 位高快大数据量加密
RSA非对称加密2048 位 +高慢密钥交换、数字签名
SHA-256哈希算法256 位输出高快数据完整性验证
HMAC消息认证码可变高中等消息认证
PBKDF2密钥派生可变高可调密码存储

安全最佳实践

  1. 密钥管理:永远不要硬编码密钥,建议使用环境变量或密钥管理系统(如 AWS KMS、Hashicorp Vault),并定期轮换。
  2. 算法选择:对称加密首选 AES-256,非对称加密使用 RSA 2048 位或 ECC 256 位以上,哈希函数推荐 SHA-256 或 SHA-3。
  3. 密码存储:严禁明文存储,必须使用 PBKDF2、bcrypt 或 Argon2,且每个用户需使用唯一的盐值。
  4. 传输安全:始终启用 HTTPS,敏感数据在客户端也应考虑加密。
  5. 错误处理:加密失败时避免暴露详细信息,使用恒定时间比较防止时序攻击。

进阶主题

除了上述基础算法,还可以关注椭圆曲线加密 (ECC)、更现代的密码哈希算法 (bcrypt/Argon2)、抗量子计算的格密码、同态加密以及零知识证明等技术。掌握这些核心加密算法及其实现,已具备构建安全 Web 应用的基础能力。在实际项目中,应根据具体需求选择合适的算法组合,并严格遵循安全最佳实践来保护用户数据。

目录

  1. 五种常用 Web 加密算法实战及原理详解
  2. 1. AES (高级加密标准)
  3. 原理详解
  4. 应用场景
  5. 实战代码(Node.js)
  6. 2. RSA (非对称加密)
  7. 原理详解
  8. 应用场景
  9. 实战代码(Node.js)
  10. 3. SHA-256 (安全哈希算法)
  11. 原理详解
  12. 应用场景
  13. 实战代码(浏览器环境)
  14. 4. HMAC (基于哈希的消息认证码)
  15. 原理详解
  16. 应用场景
  17. 实战代码(Node.js)
  18. 5. PBKDF2 (基于密码的密钥派生函数)
  19. 原理详解
  20. 应用场景
  21. 实战代码(Node.js)
  22. 加密算法对比表
  23. 安全最佳实践
  24. 进阶主题

更多推荐文章

查看全部
  • 使用 TRAE CN 与 MasterGo MCP 实现设计稿转前端代码
  • 低配环境运行 Qwen3Guard-Gen-WEB 的 CPU 部署实战指南
  • Milvus 实战:Attu 可视化安装与 Python 整合指南
  • CPP Summit 2020 学习笔记:系统架构与设计
  • 系统架构与设计:空间、角色与开发流程
  • 主流大模型架构全景 | GPT/LLaMA/DeepSeek/Qwen 深度对比
  • OpenClaw 本地部署与 AI Agent 开发指南
  • Open-Lovable 网页克隆工具本地部署与远程访问方案
  • 大模型提示工程技术分类详解:单一、多重及外部工具应用
  • Java 动态代理:JDK 与 CGLIB 实现与取舍
  • 使用 cpolar 远程部署 Open-Lovable 实现网页克隆
  • Coze 智能体核心资源详解:插件、知识库与数据库实战
  • Kiro AI 助手完整使用指南
  • Function Call、Skill 和 MCP:AI 工具链的三层抽象
  • 鸿蒙金融理财全栈实战:生态合作与数据变现优化
  • Coze 与 Dify 对比:AI 智能体开发平台选型指南
  • AI 辅助前端 UI 设计工具 UI UX Pro Max 实战指南
  • Coze 智能体的手、脑、记忆:插件、知识库与数据库
  • 基于阿里开源 CoPaw 在魔搭创空间搭建个人 AI 助理
  • GitHub Copilot 接入 Figma MCP 还原设计稿生成前端代码

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online