什么是 AES 加密
AES(Advanced Encryption Standard,高级加密标准)是目前最广泛使用的对称加密算法。2001 年被美国国家标准与技术研究院(NIST)采纳为标准,至今仍是全球政府、银行和企业系统的首选加密算法。
对称加密意味着加密和解密使用同一把密钥——拥有密钥的人可以加密和解密数据。
AES 的核心参数
| 参数 | 说明 | 常见值 | |------|------|--------| | 密钥长度 | 决定安全性 | 128 / 192 / 256 位 | | 分组大小 | 固定为 128 位 | 16 字节 | | 加密模式 | 数据块的处理方式 | ECB / CBC / GCM / CTR | | 填充方式 | 数据不足分组大小时的补充 | PKCS7 / Zero |
AES-GCM:推荐的加密模式
AES-GCM(Galois/Counter Mode)是目前最推荐的 AES 模式,因为它提供认证加密(Authenticated Encryption):
- 保密性:加密后的数据无法被读取
- 完整性:数据被篡改会被检测到
- 认证性:验证数据来源的真实性
密文 = AES-GCM-Encrypt(密钥, 明文, IV, 认证附加数据)
明文 = AES-GCM-Decrypt(密钥, 密文, IV, 认证附加数据)
为什么不用 ECB 模式
ECB(Electronic Codebook)模式是最简单的加密方式,但存在严重安全缺陷:相同的明文块会加密成相同的密文块,保留了数据的模式信息。
ECB 模式加密的 Linux 企鹅图片(模式泄露):
[密文块A][密文块A][密文块B]
[密文块B][密文块C][密文块C]
GCM 模式加密的同一图片(模式隐藏):
[随机密文][随机密文][随机密文]
[随机密文][随机密文][随机密文]
PBKDF2 密钥派生
直接使用用户密码作为 AES 密钥是不安全的,因为密码通常不够随机。PBKDF2(Password-Based Key Derivation Function 2)通过以下步骤派生安全密钥:
- 密码 + 盐值(Salt):盐值是随机生成的,防止彩虹表攻击
- 多次迭代(如 100,000 次):增加暴力破解的成本
- 输出固定长度密钥:派生出 AES-256 所需的 256 位密钥
如何使用在线 AES 加解密工具
使用 DevToolkit Pro 的 AES 加解密工具:
加密
- 输入明文数据
- 输入密码(Passphrase)
- 选择密钥长度(128 / 192 / 256 位)
- 点击 Encrypt 按钮
- 复制生成的密文(Base64 编码)
解密
- 输入密文(Base64 编码)
- 输入密码
- 选择对应的密钥长度
- 点击 Decrypt 按钮
- 还原的明文出现在输出框
编程语言中的 AES 加密
JavaScript / Web Crypto API
async function encrypt(data, password) {
const encoder = new TextEncoder();
const salt = crypto.getRandomValues(new Uint8Array(16));
const iv = crypto.getRandomValues(new Uint8Array(12));
// PBKDF2 派生密钥
const keyMaterial = await crypto.subtle.importKey(
'raw', encoder.encode(password),
'PBKDF2', false, ['deriveKey']
);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' },
keyMaterial,
{ name: 'AES-GCM', length: 256 },
false, ['encrypt']
);
// AES-GCM 加密
const ciphertext = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv },
key, encoder.encode(data)
);
return { ciphertext, salt, iv };
}
Python
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import os
def encrypt(plaintext: str, password: str) -> bytes:
salt = os.urandom(16)
iv = os.urandom(12)
# PBKDF2 派生密钥
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32,
salt=salt, iterations=100000)
key = kdf.derive(password.encode())
# AES-GCM 加密
aesgcm = AESGCM(key)
return aesgcm.encrypt(iv, plaintext.encode(), None)
安全最佳实践
- 永远不要自己实现加密算法:使用经过审计的标准库(Web Crypto API、OpenSSL、BoringSSL)
- 每次加密使用随机 IV:即使加密相同内容,不同 IV 产生不同密文
- 密钥与密文分开存储:密钥放在密钥管理服务,密文放在数据库
- 使用认证加密:优先选择 AES-GCM 而非 AES-CBC
FAQ
AES-256 比 AES-128 安全多少?
从实际角度看,两者都足够安全。AES-128 的密钥空间为 2^128,暴力破解需要宇宙年龄级别的时间。AES-256 提供更大的安全余量,是政府级应用的首选。
在线 AES 工具安全吗?
DevToolkit Pro 的 AES 加解密完全在浏览器端运行(Web Crypto API),密码和数据不离开设备。但请确保在安全的环境中使用,避免浏览器扩展窃取数据。
加密后数据体积会变大吗?
会略微变大。AES-GCM 输出包含密文 + 认证标签(16 字节)+ IV(12 字节)。对于小数据,开销比例较高;对于大数据,开销可忽略。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。