3、密码学基础:对称加密、非对称加密、哈希函数与数字签名
密码学是信息安全工程师必须掌握的核心地基。本章围绕四大支柱展开:对称加密(DES/AES)、非对称加密(RSA/ECC)、哈希函数(MD5/SHA)以及数字签名与密钥管理。理解这些算法的数学原理、工程实现、适用场景与常见误区,是后续学习PKI、SSL/TLS、IPSec等协议的前提。本章将结合实战案例,帮助你在真实系统中做出正确的密码学选型与配置决策。
3.1 对称加密:DES与AES
3.1.1 核心原理
对称加密使用同一个密钥进行加密和解密。发送方用密钥K加密明文得到密文,接收方用同一密钥K解密密文恢复明文。其安全性完全依赖于密钥的保密性。DES(Data Encryption Standard)诞生于1977年,使用56位有效密钥,分组长度64位,采用Feistel网络结构,经过16轮迭代运算。由于密钥空间仅有2^56,1999年已被分布式攻击在22小时内破解,不再安全。3DES是对DES的改进,使用三个56位密钥(K1、K2、K3),有效密钥长度112位,但速度较慢。AES(Advanced Encryption Standard)于2001年由NIST标准化,分组长度128位,支持128/192/256位密钥,采用SPN(Substitution-Permutation Network)结构,通过字节代换、行移位、列混合和轮密钥加四步操作完成10/12/14轮迭代。
| 算法 | 密钥长度 | 分组长度 | 结构 | 轮数 | 状态 |
|---|---|---|---|---|---|
| DES | 56位 | 64位 | Feistel | 16 | 已废弃 |
| 3DES | 112/168位 | 64位 | Feistel | 48 | 过渡期 |
| AES-128 | 128位 | 128位 | SPN | 10 | 推荐 |
| AES-256 | 256位 | 128位 | SPN | 14 | 推荐 |
3.1.2 操作流程与工作模式
实际使用AES时,除了选择密钥长度,还必须选择工作模式。ECB模式将明文分成独立块分别加密,相同明文块产生相同密文块,容易泄露模式信息,不推荐使用。CBC模式引入前一个密文块与当前明文块异或后再加密,需要初始化向量IV,推荐用于文件加密。GCM模式(Galois/Counter Mode)同时提供加密和完整性校验,是当前TLS 1.3的首选。CTR模式将计数器加密后与明文异或,支持并行计算,适合高速场景。
# OpenSSL中使用AES-256-GCM加密示例
openssl enc -aes-256-gcm -in plaintext.txt -out ciphertext.bin -K 0123456789abcdef0123456789abcdef -iv 0123456789abcdef
3.1.3 案例拆解:数据库字段加密
某金融系统需要对用户手机号进行加密存储。初始方案使用AES-128-ECB,上线后发现相同手机号产生相同密文,攻击者可通过频率分析推断用户行为。整改方案:改用AES-256-GCM,每次加密生成随机12字节IV,将IV与密文一起存储。同时引入密钥管理服务(KMS)定期轮换密钥。改造后密文随机性显著提升,通过渗透测试验证无法从密文推断任何明文信息。
3.2 非对称加密:RSA与ECC
3.2.1 核心原理
非对称加密使用公钥-私钥对。公钥公开分发,私钥严格保密。RSA基于大整数因子分解难题,密钥长度通常为2048位或3072位。加密时使用接收方公钥,解密时使用接收方私钥。ECC(Elliptic Curve Cryptography)基于椭圆曲线离散对数难题,在相同安全强度下密钥长度远小于RSA:256位ECC约等于3072位RSA的安全性。ECC计算效率更高,适合移动设备和物联网场景。
| 安全强度 | RSA密钥长度 | ECC密钥长度 | 推荐场景 |
|---|---|---|---|
| 112位 | 2048位 | 224位 | 一般业务 |
| 128位 | 3072位 | 256位 | 金融/政务 |
| 256位 | 15360位 | 512位 | 长期机密 |
3.2.2 混合加密方案
实际系统中很少直接用RSA加密大量数据,因为非对称加密速度慢(比AES慢100-1000倍)。标准做法是混合加密:使用AES随机生成会话密钥加密数据,再用RSA公钥加密该会话密钥。TLS协议正是采用这种方案。例如HTTPS握手过程中,客户端生成48字节预主密钥,用服务器公钥加密后发送,双方再通过密钥派生函数生成会话密钥。
3.2.3 案例拆解:API签名认证
某开放平台需要为第三方应用提供API访问认证。方案设计:为每个应用分配一对RSA密钥,应用使用私钥对请求参数(时间戳+随机数+业务参数)进行签名,平台使用公钥验签。关键参数:时间戳有效期5分钟防止重放攻击,随机数防止相同请求重复提交。实施中发现部分应用使用1024位RSA密钥,已不满足安全要求,强制升级至2048位。同时增加签名算法协商机制,支持RSA-PSS和ECDSA。
3.3 哈希函数:MD5与SHA家族
3.3.1 核心原理与安全要求
哈希函数将任意长度输入映射为固定长度输出,具备三个核心特性:抗原像性(无法从哈希值反推原文)、抗第二原像性(给定原文和哈希值,无法找到另一个原文产生相同哈希)、抗碰撞性(无法找到两个不同原文产生相同哈希)。MD5输出128位,1996年发现碰撞漏洞,2004年王小云教授团队实现MD5快速碰撞,已完全不可用于安全场景。SHA-1输出160位,2017年Google与CWI研究所联合宣布SHAttered碰撞攻击。SHA-2家族(SHA-224/256/384/512)目前安全,SHA-3(Keccak)作为备选标准。
| 算法 | 输出长度 | 碰撞状态 | 推荐用途 |
|---|---|---|---|
| MD5 | 128位 | 已破解 | 仅用于非安全校验 |
| SHA-1 | 160位 | 已破解 | 禁止用于签名 |
| SHA-256 | 256位 | 安全 | 数字签名/证书 |
| SHA-512 | 512位 | 安全 | 高安全场景 |
3.3.2 口令存储方案
直接使用SHA-256存储用户口令存在严重风险:攻击者可通过彩虹表快速反查。正确做法是使用加盐哈希(Salt):为每个用户生成随机盐值,将盐值与口令拼接后计算哈希。更推荐使用专门的口令哈希算法如bcrypt、scrypt或Argon2,这些算法内置盐值生成和计算强度调节功能,可有效抵御暴力破解。
# Python中使用bcrypt存储口令示例
import bcrypt
password = b"SecurePass123!"
salt = bcrypt.gensalt(rounds=12)
hashed = bcrypt.hashpw(password, salt)
# 验证时:bcrypt.checkpw(password, hashed)
3.3.3 案例拆解:文件完整性校验
某软件分发平台需要确保用户下载的安装包未被篡改。方案:发布时计算安装包SHA-256哈希值,在官网公布。用户下载后自行计算哈希并比对。但攻击者可能同时篡改安装包和官网哈希值,因此更安全的方案是使用代码签名证书对哈希值进行数字签名。实际实施中,平台使用HSM(硬件安全模块)存储签名私钥,确保证书私钥无法被导出。
3.4 数字签名与密钥管理
3.4.1 数字签名原理
数字签名结合哈希函数和非对称加密,提供完整性、认证性和不可否认性。签名过程:发送方计算消息哈希值,用私钥加密哈希值得到签名,将消息和签名一起发送。验证过程:接收方用发送方公钥解密签名得到哈希值,再计算消息哈希值,两者比对一致则验证通过。RSA签名和ECDSA是两种主流方案。实际应用中,签名算法还包含填充方案(如RSA-PSS)和哈希算法协商。
3.4.2 密钥管理生命周期
密钥管理是密码学应用中最薄弱的环节。完整生命周期包括:密钥生成(使用密码学安全随机数)、密钥分发(通过安全通道或公钥加密)、密钥存储(使用HSM或KMS)、密钥使用(限定用途和次数)、密钥轮换(定期更换)、密钥撤销(泄露时紧急作废)、密钥销毁(安全删除)。密钥分层策略:主密钥加密数据密钥,数据密钥加密业务数据,降低单点风险。
| 生命周期阶段 | 关键操作 | 安全要求 |
|---|---|---|
| 生成 | 使用CSPRNG | 不可预测,足够熵源 |
| 分发 | TLS/SSH通道 | 防窃听、防篡改 |
| 存储 | HSM/KMS | 加密存储,访问控制 |
| 轮换 | 定期更换 | 90天-1年,紧急立即 |
| 销毁 | 安全擦除 | 不可恢复,审计记录 |
3.4.3 案例拆解:企业PKI体系建设
某大型企业需要为内部系统部署数字证书。初始方案:使用自签名证书,但无法统一管理,证书过期导致服务中断。整改方案:搭建企业级PKI,部署根CA和二级CA,通过AD域自动下发证书。关键设计:根CA离线存储,二级CA在线签发;证书有效期设为2年,提前30天自动续期;私钥存储在HSM中,设置双人控制访问。实施后证书管理效率提升80%,安全事件为零。