密码学把安全目标转换为可以计算和验证的机制:加密隐藏内容,哈希形成内容指纹,消息认证码验证共享密钥持有者与消息完整性,数字签名让任何持有公钥的人验证来源,密钥协商让陌生端点建立会话秘密,安全随机数为密钥和随机数提供不可预测性。

真正困难的地方通常不在“调用一个算法”,而在于选对原语、组合方式、参数、随机数、密钥生命周期和信任边界。这部分我们从工程视角建立完整密码学地图。
完成本章后,你应该能够区分明文、密文、算法和密钥,解释对称加密、公钥密码、哈希、消息认证码、数字签名、密钥协商和随机数的职责,并能判断一个方案提供了机密性、完整性、来源认证或不可否认性中的哪些属性。
现代设计遵循一个关键原则:算法可以公开,安全性应依赖密钥保密而不是隐藏算法。攻击者可能掌握算法、协议、部分明密文对和大量计算资源,防守方仍应依靠足够大的密钥空间、经过分析的结构和正确实现维持安全。
密码学不能自动修复弱认证、越权访问、恶意终端或错误业务逻辑。它只在清楚的威胁模型和正确密钥管理下提供特定安全属性。
对称密码中,加密方和解密方掌握同一把秘密密钥。明文经过加密算法和密钥变成密文,接收方以同一密钥逆变换恢复明文。安全使用至少要求两点:算法足够强,密钥被安全生成、分发和保存。
分组密码按固定长度处理数据,流密码则生成密钥流与数据结合。替换提供混淆,置换提供扩散,多轮结构让明文与密钥的局部变化扩散到整个密文。穷举搜索的成本随密钥长度指数增长,但实现漏洞、侧信道或弱口令派生往往比穷举更现实。
DES 的有效密钥只有 56 位,面对现代计算能力已不足。三重加密通过多次执行 DES 延长有效安全性并兼容旧系统,但速度慢、分组较小,不适合新设计。AES 使用 128 位分组和 128、192 或 256 位密钥,以字节替换、行移位、列混合与轮密钥加法构成多轮变换,是现代通用分组密码基础。
分组密码只能转换一个固定大小的块,模式决定怎样处理任意长度消息。
认证加密的随机数通常不要求保密,却必须满足相应模式的唯一性或不可预测性要求。若在同一密钥下违规复用,可能泄露明文关系、破坏认证甚至导致密钥材料被推断。解密时必须先验证标签,验证失败的数据不得交给业务层。
链路加密在相邻网络节点间反复解密和加密,能保护每段链路,但中间节点可看到明文;端到端加密只在通信端点解密,减少中间暴露,但可能留下路由、长度和时序等元数据。实际网络常叠加两者。
共享密钥可以由一方物理交付、可信第三方交付、旧密钥加密新密钥,或由密钥分发中心为会话生成临时密钥。长期主密钥用于保护分发过程,短期会话密钥用于具体连接,可减少单次泄露的影响。任何分发方法都必须认证通信方,否则攻击者可能替换密钥。
公钥密码使用数学相关的密钥对:公钥可以分发,私钥必须由持有者控制。它可用于加密、密钥协商和数字签名,但三种用途不能混为一谈。公钥加密通常由公钥保护数据、私钥解密;签名则由私钥产生、任何持有公钥者验证。

RSA 的安全性建立在大整数分解困难性上。工程使用必须采用成熟填充方案:加密使用 OAEP 一类编码,签名使用 PSS 一类编码;不能把“裸 RSA”直接用于消息。RSA 运算昂贵且明文长度受模数和编码限制,因此实际系统通常随机生成对称会话密钥,用公钥机制保护会话密钥,再用认证加密处理大量数据,这就是混合加密。
Diffie-Hellman 类密钥协商让双方通过公开交换值计算同一共享秘密,窃听者难以恢复该秘密。但它自身不确认身份,若没有签名、证书或预共享认证,仍会遭遇中间人攻击。临时密钥协商还可提供前向保密:长期身份密钥日后泄露,不应自动解开过去捕获的会话。
哈希函数把任意长度输入映射为固定长度摘要。安全哈希应高效计算,具备原像抗性、第二原像抗性与碰撞抗性,并呈现雪崩效应。长度为 n 位的理想哈希,寻找原像约需 2^n 级工作,而碰撞因生日效应约需 2^(n/2) 级工作。
哈希可用于完整性比对、签名前压缩消息、内容寻址和派生结构。MD5 与 SHA-1 的碰撞安全性已经不足,不应继续用于需要抗攻击碰撞的场景。SHA-256、SHA-384、SHA-512 等仍是常见选择。
但公开哈希不提供来源认证:攻击者若能替换文件,也能重新计算摘要。口令保存也不能直接使用快速哈希,而应使用每个账号独立随机盐,并采用专门的慢速、内存密集口令哈希,以提高离线猜测成本。
消息认证码把消息和共享密钥一起输入,产生短认证值。接收方重新计算并比较,能够同时发现消息变化并确认发送方掌握共享密钥。HMAC 以标准化的内外两层结构组合哈希与密钥,避免简单拼接的结构性问题。
数字签名先对消息形成摘要,再用私钥产生签名;验证者用公钥检查签名和消息是否匹配。它提供完整性、来源认证,并可支持不可否认性。不过,验证成功只说明相应私钥参与且内容未变,不自动证明业务陈述为真。

公钥只有与身份可靠绑定才有意义。证书由可信签发者对主体身份、公钥、有效期、用途等信息签名。验证时不仅要检查签名,还要验证信任链、主机名或主体标识、有效期、密钥用途、吊销状态和策略约束。证书有效并不代表终端安全,私钥泄露仍会破坏身份保证。
密钥生命周期包括生成、分发、存储、使用、轮换、吊销、归档与销毁。密钥不应硬编码在源码、镜像或日志中;生产环境应使用受控密钥服务或硬件安全模块,限制导出,分离管理职责并记录关键操作。轮换必须考虑旧密文解密、版本标识、灰度切换与紧急吊销。

密码学需要随机性来生成密钥、随机数、盐、挑战值和临时密钥。随机序列应具备均匀分布等统计特征,更重要的是对攻击者不可预测。密码学安全伪随机数生成器从高质量种子扩展出长序列;若种子可猜、内部状态泄露或系统回滚导致状态重复,输出也会失去安全性。
不能使用普通模拟随机函数生成密钥,也不能用时间戳、进程号或用户名充当随机种子。操作系统提供的安全随机接口会汇集熵并维护生成器状态,应优先使用。随机数的要求与模式相关:有的要求不可预测,有的核心要求是同一密钥下绝不重复。
我们在沙盒环境中使用系统密码库实际运行了 AES-256-GCM、HMAC-SHA-256、RSA-2048 签名和 32 字节安全随机数生成。消息为 pay bob 100,并将篡改版本设为 pay bob 900。本次运行的真实结果为:
aes-256-gcm ciphertext=b19f52ed97704da70bf748
tag=5312258c756c4522693599943dab0961
decrypted="pay bob 100"
hmac256 prefix=b2501c3881e2eb375524
tamperedPrefix=2d52d8b1abb78573f7b1
equal=false
rsa2048 signatureBytes=256
verifyOriginal=true
verifyChanged=false
random32=000521029eeeb21082cd45a255f62ceee4ea8ef4a71c3407fc8d2a8e4e1b1774认证加密成功还原明文并产生 16 字节标签;消息金额只改一位,HMAC 已完全不同;2048 位 RSA 签名为 256 字节,原消息验证成功,修改消息验证失败。随机输出是本次运行值,不应复制成任何实际密钥。
实验输出可用于理解行为,不能把示例密钥、随机数或密文硬编码进生产系统。每次会话都应按协议重新生成并安全管理所需材料。
存储加密可以放在应用、数据库、文件系统或磁盘层。层次越低,部署越透明,但运行中的系统往往能自动解密,难以抵抗已取得系统权限的攻击者;应用层能细粒度控制字段与密钥,却增加开发和查询复杂度。备份、临时文件、交换区、日志与搜索索引也必须纳入范围。
常见错误包括:使用过时算法;复用随机数;把加密误当认证;忽略标签验证;自创算法或协议;硬编码密钥;使用固定盐;直接快速哈希口令;使用同一密钥承担多种用途;错误处理泄露填充或验证差异;证书验证被关闭;日志记录秘密材料;密钥轮换没有版本和回滚计划。
更稳妥的做法是使用维护良好的高层密码库和认证加密接口,使用安全默认值,做密钥用途分离,为协议绑定上下文,统一处理认证失败,测试轮换与恢复,并让专家审查协议组合而不只是算法名称。
对称密码适合高效保护数据,公钥密码适合密钥建立与公开验证,混合加密把二者结合。哈希提供内容指纹,HMAC 以共享密钥认证消息,数字签名以私钥产生可公开验证的证据。随机数、证书验证和密钥生命周期决定这些原语能否在真实系统中兑现安全目标。
选择密码工具时始终先问:要保护的属性是什么、攻击者能控制什么、密钥由谁持有、随机数能否满足约束、失败如何处理、如何轮换和撤销、怎样证明实现按预期工作。