密码学基础:从对称到非对称,再到哈希与签名

对称加密:一把钥匙开一把锁

对称加密,说白了就是加密和解密用同一把密钥。我刚开始接触HSM时觉得这很简单,后来发现密钥管理的坑比想象中多得多。

金融行业最常用的是AES。密钥长度支持128、192、256位,实际项目中我几乎只用AES-256。为什么?监管要求加上一点安全冗余。

AES-256-GCM是标配——GCM模式自带认证标签,能检测密文是否被篡改。金融交易报文的加密,我建议首选这个模式。

记得有一次,第三方厂商用AES-ECB模式加密卡片数据,结果明文模式暴露了数据规律。你想想看,ECB同样的明文块会产生同样的密文块,这在金融场景下非常危险。

下面是最简单的Python演示(使用cryptography库):

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os

key = os.urandom(32)  # AES-256
iv = os.urandom(12)   # 96位IV,用于GCM
cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())
encryptor = cipher.encryptor()
plaintext = b"金融交易敏感数据"
ciphertext = encryptor.update(plaintext) + encryptor.finalize()
tag = encryptor.tag

GCM输出时要把ciphertext和tag一起传给接收方,接收方用相同密钥和IV进行解密+认证。如果tag校验失败,说明数据被改过。

特性AES-128AES-192AES-256
密钥长度128 bit192 bit256 bit
轮数101214
安全级别可接受良好极高
金融推荐❌❌✅
避坑: 切记不要自己拼凑加密方案。比如自己用AES-CTR+CRC做认证,这远不如直接用GCM。我曾经见过一个项目因此被渗透测试报高危。

非对称加密:公钥与私钥的舞蹈

非对称加密有两个钥匙:公钥加密,私钥解密。RSA和ECC是金融HSM里最常见的两种。

RSA基于大整数分解困难,密钥长度越长越安全。目前RSA-2048是底线,RSA-4096也常见。但我个人更倾向于转向ECC——同等安全强度下,ECC密钥短很多,运算也快。

举个例子,256位ECC和3072位RSA的安全级别相当,但ECC的私钥只有32字节,签名速度也快十几倍。HSM硬件在处理大量交易签名时,这个差距很可观。

from cryptography.hazmat.primitives.asymmetric import rsa, ec
from cryptography.hazmat.primitives import serialization

# 生成RSA-2048密钥对
private_key_rsa = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
# 生成ECC P-256密钥对
private_key_ecc = ec.generate_private_key(
    ec.SECP256R1(),  # prime256v1
    backend=default_backend()
)
严重警告: RSA-1024早已被证明可被破解,金融行业严禁使用。我曾处理过一个遗留系统升级,全部重新生成2048位密钥,折腾了两个月。
对比项RSA-2048ECC P-256
密钥长度2048 bit256 bit
签名速度较慢较快
量子安全脆弱同样脆弱
HSM支持非常成熟逐渐普及

我在一个跨境支付项目里把RSA2154迁移到了ECC P-384,HSM硬件直接支持,签名性能提升了近3倍。嗯,迁移时一定要注意HSM固件版本是否兼容指定的椭圆曲线。

哈希函数:不可逆的指纹

哈希函数能把任意数据压缩成固定长度的“指纹”,而且无法逆向。金融行业用它做完整性校验、数字签名的摘要计算。

SHA-256是目前最稳妥的。虽然SHA-3已经发布,但硬件支持还不够普遍。我建议现阶段统一用SHA-256,除非HSM明确支持SHA-3加速。

哈希函数在HSM中常被硬件加速。比如签名前先对交易报文做SHA-256哈希,用硬件算,比纯软件快10倍以上。

有一个老掉牙的坑:MD5。几年前我审计一个合作方接口,发现他们竟然还在用MD5做报文完整性校验。你想想看,MD5碰撞攻击已经公开了十多年,金融数据用MD5等于裸奔。当场就被我驳回了。

from cryptography.hazmat.primitives import hashes
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
digest.update(b"交易流水号: TX2025-00123")
hash_value = digest.finalize()  # 32字节

另外,SHA-256的输出长度是256比特(32字节)。如果HSM内部签名算法要求更短的哈希(比如DSA要求160位),就要用SHA-1?不,千万别用SHA-1。选SHA-256截断也不行,最好直接用兼容的椭圆曲线配合SHA-256。

数字签名:谁签的?验一下

数字签名 = 哈希 + 非对称加密 + 签名算法。流程很简单:发送方对哈希值用私钥签名,接收方用公钥验签。

金融领域常用的有RSA-PSS、ECDSA(ECDSA是ECC上的签名算法)。我个人更推荐ECDSA,因为密钥短、签名快、证书链小——金融数据传输时少几个字节都有成本优势。

下面演示ECDSA签名与验签:

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature

# 假设已有私钥 private_key_ecc
message = b"转账指令: A给B 1000元"
signature = private_key_ecc.sign(
    message,
    ec.ECDSA(hashes.SHA256())
)
# 验签
public_key = private_key_ecc.public_key()
try:
    public_key.verify(signature, message, ec.ECDSA(hashes.SHA256()))
    print("签名验证通过")
except InvalidSignature:
    print("签名无效,数据可能被篡改")
关键: 签名操作必须在HSM内部完成,私钥不能离开安全边界。我曾经见过一个工程把私钥导出到应用服务器签名,后来审计直接判不合格。HSM之所以叫硬件安全模块,就是因为它物理隔离私钥。
延伸: 量子计算对RSA和ECC都有威胁。目前NIST正在推进后量子密码标准化,金融HSM厂商已经开始布局。但短中期内,ECC P-384 + SHA-256仍是黄金组合。
密码学基础 · 金融HSM知识体系 对称加密 AES-256-GCM 非对称加密 RSA / ECC 哈希函数 SHA-256 数字签名 ECDSA / RSA-PSS 摘要作为输入 私钥签名 / 公钥验签 硬件安全模块 (HSM) 密钥生成 · 加密解密 · 签名验签 · 哈希加速 🔔 知识点关联 数字签名 = 哈希(报文) + 私钥签名;对称加密用于批量数据,非对称用于密钥交换与签名