0Pricing
Cryptology Academy · 课时

常见密码学误用模式

了解开发者最常见的错误:使用 ECB 模式、弱 PRNG 播种,以及自行编写密码学实现。

常见密码学误用模式 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。

ECB 模式暴露分组模式

电子密码本(ECB)模式使用同一密钥独立加密每个分组。相同的明文分组会产生相同的密文分组。经典演示是“ECB 企鹅”:使用 ECB 加密位图图像会保留图像的分组级结构,使企鹅轮廓在密文中清晰可见。ECB 模式不提供语义安全性,绝不应将其用于任何实际加密目的。

自行实现密码学

从头实现密码学原语,是软件开发中最危险的做法之一。密码学要求在对手环境下做到完全正确:细微的时间泄露、填充中的差一错误,或对安全要求的误解,都可能造成可利用的漏洞;这些漏洞在正常测试中可能与正确行为毫无区别。即使是密码学专家也会犯实现错误;应用开发者应只使用经过充分审计的库。

将 MD5 和 SHA-1 用于安全目的

MD5 自 2004 年起就已被碰撞攻击攻破;生成两个具有相同 MD5 哈希值的文件在计算上已十分容易。2017 年,Google 的 SHAttered 攻击实际演示了 SHA-1 碰撞,生成了两个具有相同 SHA-1 哈希值的 PDF 文件。两者都不应出于任何安全目的使用:数字签名、内容完整性、密码存储或 HMAC。现代部署应使用 SHA-256、SHA-3 或 BLAKE2。

可预测的 PRNG 播种

使用 time() 或其他可预测值为伪随机数生成器播种,在将 PRNG 输出用于安全目的时会构成严重漏洞。知道密钥大致生成时间的攻击者,可以穷举种子空间(小时间窗口内的所有可能时间戳)来恢复密钥。经典例子:Netscape 的早期版本使用时间和进程 ID 为 SSL 密钥生成播种,而同一台机器上的攻击者可以观察到这两者。

弱 PRNG 的选择

C 中的 rand()、java.util.Random 和 Python 的 random 模块使用确定性的线性同余生成器或梅森旋转算法;这些算法旨在为模拟提供良好的统计性质,而非用于安全场景。观察到这些生成器足够多的输出后,攻击者可以重建其内部状态并预测所有未来输出。出于安全目的,请使用操作系统提供的 CSPRNG:Python 中的 secrets.token_bytes()、Node.js 中的 crypto.randomBytes(),或 Linux 上的 /dev/urandom。

未进行认证的加密

不带认证的加密只提供机密性,不提供完整性。无法读取明文的攻击者仍可修改密文,可能使明文发生可预测的变化(尤其是在 CTR 或 CBC 模式中)。这种可塑性会促成攻击:截获加密银行交易的攻击者,即使不知道明文,也可能翻转位来更改转账金额或目标账户。始终使用认证加密(AEAD)。

将密钥和初始化向量硬编码

在源代码中硬编码加密密钥或初始化向量是严重漏洞。源代码通常会提交到版本控制仓库,有时还会公开。即使是私有仓库,任何有权访问代码的人都能获得密钥。硬编码密钥意味着所有实例都使用同一个密钥,而密钥轮换需要重新部署。密钥必须存储在环境变量、机密管理系统(HashiCorp Vault、AWS Secrets Manager)或硬件安全模块中。

重用初始化向量

对同一密钥进行多次加密时使用相同的初始化向量,会造成严重漏洞。在 CTR 模式中,重用初始化向量会产生相同的密钥流,从而可以通过 XOR 恢复明文。在 CBC 模式中,重用初始化向量会让攻击者能够检测两条消息是否以相同的明文分组开头。在 GCM 中,重用随机数(初始化向量)是灾难性的(参见初始化向量重用课程)。每次执行加密操作都应生成新的随机初始化向量;将其添加到密文前面,以便与解密上下文一起存储。

使用快速哈希进行密码哈希

使用 MD5、SHA-256 或任何其他快速密码学哈希函数对密码进行哈希后存储,都是不够安全的。现代 GPU 每秒可以计算数十亿个 SHA-256 哈希值,使得针对被盗哈希数据库的离线穷举攻击快得轻而易举。密码哈希需要专门设计的慢速、内存开销大的函数:bcrypt、scrypt 或 Argon2id。这些函数旨在让穷举攻击即使使用专用硬件也代价高昂,从而使离线攻击在计算上难以实现。

忽略证书验证

禁用 SSL/TLS 证书验证(在 Python 中设置 ssl.CERT_NONE、向 curl 传递 -k、在 Android 中设置 trustAllCerts=true)会消除针对中间人攻击的防护。攻击者可以出示任意证书并拦截所有通信。这种做法在开发阶段很常见,用于绕过自签名证书错误,但经常会遗留到生产环境。始终使用正确的证书验证,并正确修复底层证书问题。

未检查返回值

密码学函数通过返回值或异常传达失败。忽略这些信息会让程序继续以无效状态执行:解密产生了乱码、验证失败,或密钥生成出错。在 OpenSSL 这类基于 C 的 API 中,忽略返回值尤其危险,因为程序可能会继续使用未初始化的内存。始终检查密码学函数的每个返回值,并以安全方式处理失败。

ECB 模式的弱点

为什么 ECB(电子密码本)模式被认为不适合用于加密数据?

密码学误用回顾

需要避免的主要误用模式:绝不要使用 ECB 模式(会泄露分组模式),绝不要自行实现密码原语,不要将 MD5 和 SHA-1 用于安全用途,使用 CSPRNG 而不是 time() 为伪随机数生成器播种,对所有安全敏感的随机性都使用 CSPRNG,始终对加密数据进行身份验证(AEAD),绝不要将密钥或 IV 硬编码,每次加密都生成新的 IV,对密码使用 Argon2id 而不是快速哈希,始终验证 TLS 证书,并检查每个密码学函数的返回值。

常见问题解答

「常见密码学误用模式」课时是免费的吗?

是的 — 「常见密码学误用模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。

「常见密码学误用模式」这节课中我会学到什么?

了解开发者最常见的错误:使用 ECB 模式、弱 PRNG 播种,以及自行编写密码学实现。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cryptology Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「常见密码学误用模式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cryptology Academy 课中编写并运行代码吗?

能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 深入了解填充预言机攻击
  2. 重放攻击与随机数重复使用漏洞
  3. 应用层代码中的时序攻击
  4. 常见密码学误用模式
← 返回 Cryptology Academy