🧰 密码学工具箱

实战导向的密码学工具与库速查——
从选型到使用,每个开发者都应该知道的密码学工具。

🔒 TLS — 互联网安全的基石

TLS (Transport Layer Security) 保护着互联网上绝大多数通信。TLS 1.3 于 2018 年发布,大幅简化了握手过程并移除了不安全的密码套件。

TLS 1.3 握手流程

Client                                          Server
  |--- ClientHello (支持的组+签名+密钥分享) ---->|
  |<-- ServerHello (选定的组+签名+密钥分享) -----|
  |<-- {EncryptedExtensions} --------------------|
  |<-- {Certificate} ---------------------------|
  |<-- {CertificateVerify} ---------------------|
  |<-- {Finished} ------------------------------|
  |--- {Finished} ----------------------------->|
  
// TLS 1.3 优化点:
// 1. 1-RTT握手(TLS 1.2需要2-RTT)
// 2. 0-RTT恢复(PSK模式)
// 3. 移除RSA密钥交换(仅ECDHE)
// 4. 移除CBC模式密码套件(仅AEAD)
// 5. 握手加密(ServerHello后全部加密)

TLS 配置最佳实践 (2024)

项目推荐避免
协议版本TLS 1.3 优先TLS 1.0/1.1
密钥交换X25519, P-256RSA密钥交换
认证签名Ed25519, ECDSA P-256RSA-PKCS#1 v1.5
对称加密AES-256-GCM, ChaCha20-Poly13053DES, RC4, AES-CBC
证书ECDSA/P-256 + Let's EncryptRSA-1024, 自签名
HSTSmax-age ≥ 1年 + includeSubDomains不设置

📚 密码学库选型

语言许可证特色适用场景
OpenSSLCApache-2.0最全面,工业标准TLS、证书、通用密码学
BoringSSLCISC+OpenSSLGoogle维护,精简安全Chrome、Android
LibreSSLCOpenSSL+ISCOpenBSD分支,移除旧APIOpenBSD生态
libsodiumCISCNaCl家族,API极简安全现代应用首选
RingRustISC+MITRust原生,无unsafe依赖Rust项目首选
TinkJava/C++/Go/ObjCApache-2.0Google出品,防误用设计多语言项目
ageGoBSD-3现代文件加密,极简CLI文件/密钥加密
NaCl/libsodiumC/多语言绑定ISC高安全原语集加密通信

Python密码学生态

定位推荐度备注
cryptography通用密码学⭐⭐⭐基于OpenSSL,API安全
PyNaClNaCl绑定⭐⭐⭐libsodium的Python绑定
hashlib哈希函数⭐⭐⭐标准库,够用
hmacHMAC⭐⭐⭐标准库
PyCryptodome通用密码学⭐⭐替代PyCrypto,API略旧
passlib密码哈希⭐⭐⭐argon2/bcrypt/scrypt
选型原则:1) 优先使用高层API而非底层原语;2) 使用经过审计的库而非自己实现;3) 默认选择最安全的选项(如Ed25519而非RSA);4) 关注库的维护状态和漏洞历史。**永远不要自己实现密码学算法!**

🔢 哈希函数与MAC

哈希函数选型

函数输出长度速度安全级别用途
SHA-256256 bit128-bit安全通用哈希、TLS
SHA-3-256256 bit128-bit安全替代SHA-2
BLAKE2b可变(≤512)极快128-bit安全高性能哈希
BLAKE3可变最快128-bit安全并行哈希、大文件
SHA-512512 bit快(64bit)256-bit安全高安全需求

密码哈希函数(慢哈希)

用于存储用户密码,刻意设计为计算缓慢,增加暴力破解成本:

函数内存硬度GPU抵抗推荐
Argon2id⭐ 首选
scrypt备选
bcrypt旧系统兼容
PBKDF2避免使用
// Argon2id 推荐参数 (OWASP 2024)
// 时间成本 t = 3 (迭代次数)
// 内存成本 m = 64 MB (65536 KiB)
// 并行度 p = 4
// 输出长度 = 32 bytes

from argon2 import PasswordHasher
ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)
hash = ph.hash("mypassword")        # $argon2id$v=19$m=65536,t=3,p=4$...
ph.verify(hash, "mypassword")       # True

🔑 密钥派生函数 (KDF)

KDF将一个秘密输入(如密码、共享密钥)转换为密码学安全的密钥。与密码哈希不同,KDF需要输出指定长度的密钥。

常用KDF

KDF输入特点用途
HKDF高熵共享密钥基于HMAC,极快TLS密钥派生、协议密钥
PBKDF2低熵密码迭代哈希,可调旧系统兼容
Argon2id低熵密码内存硬,GPU抵抗密码存储
XOF (SHAKE/BLAKE3)任意输入可变长输出需要自定义长度密钥
// HKDF 使用示例
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes

hkdf = HKDF(
    algorithm=hashes.SHA256(),
    length=32,           # 输出密钥长度
    salt=salt_bytes,     # 随机salt(非秘密但应随机)
    info=b"encryption",  # 上下文信息
)
key = hkdf.derive(shared_secret)

🔮 后量子密码 (PQC)

量子计算机威胁当前的RSA和ECC。NIST后量子密码标准化于2024年完成,三个算法正式发布为FIPS标准:

算法FIPS类型密钥/签名大小状态
ML-KEM (Kyber)FIPS 203密钥封装公钥1.6KB/密文1.6KB✅ 标准化
ML-DSA (Dilithium)FIPS 204数字签名公钥2.5KB/签名3.3KB✅ 标准化
SLH-DSA (SPHINCS+)FIPS 205数字签名公钥64B/签名29KB✅ 标准化
Falcon待定数字签名公钥1.3KB/签名666B草案中
BIKE密钥封装较大备选
HQC密钥封装较大备选

迁移策略

// 使用 liboqs 进行 PQC 密钥交换
#include 

// 生成 ML-KEM-768 密钥对
OQS_KEM *kem = OQS_KEM_new("ML-KEM-768");
uint8_t public_key[OQS_KEM_ml_kem_768_length_public_key];
uint8_t secret_key[OQS_KEM_ml_kem_768_length_secret_key];
OQS_KEM_keypair(kem, public_key, secret_key);

// 封装(对方执行)
uint8_t ciphertext[OQS_KEM_ml_kem_768_length_ciphertext];
uint8_t shared_secret[OQS_KEM_ml_kem_768_length_shared_secret];
OQS_KEM_encaps(kem, ciphertext, shared_secret, public_key);

// 解封
uint8_t shared_secret_d[OQS_KEM_ml_kem_768_length_shared_secret];
OQS_KEM_decaps(kem, shared_secret_d, ciphertext, secret_key);
// shared_secret == shared_secret_d ✅
迁移紧迫性:Google的"Harvest Now, Decrypt Later"威胁是真实的——攻击者现在存储加密流量,等量子计算机成熟后解密。对于需要长期保密(10年+)的数据,现在就应该部署PQC。Chrome 124+已默认启用X25519+ML-KEM-768混合密钥交换。

🔍 安全审计工具

工具功能适用
SSLyzeTLS配置扫描服务器TLS审计
testssl.sh全面TLS测试命令行TLS审计
sslscanSSL/TLS快速扫描CI/CD集成
OWASP ZAPWeb安全测试应用层安全
Burp SuiteWeb渗透测试专业安全审计
Signal Protocol 测试E2EE协议验证消息安全
x509-certificate-test证书链验证PKI审计

📋 密码学速查表

🎯 场景 → 算法推荐

常见错误 & 正确做法

❌ 错误✅ 正确原因
AES-ECBAES-GCM / ChaCha20-Poly1305ECB模式泄露数据模式
MD5 / SHA-1SHA-256 / BLAKE2b已被碰撞攻破
RSA-PKCS#1 v1.5RSA-OAEP / RSA-PSS填充oracle攻击
自建IV/Nonce随机生成,绝不重用Nonce重用导致灾难性失败
硬编码密钥KMS/HSM + 密钥轮换密钥泄露风险
自己实现加密使用成熟库的高层API实现缺陷难以发现
RSA-1024RSA-3072+ 或 Ed255191024位已不安全
PBKDF2 + 低迭代Argon2id + 足够参数GPU暴力破解