编码、加密与哈希的区别
明确区分这三个概念,并了解分别应在何时使用它们
编码、加密与哈希的区别 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
三种不同的操作
编码、加密和哈希处理是三种根本不同的操作,分别服务于不同目的。人们经常将它们混淆,但理解它们之间的区别对于设计安全系统至关重要。
编码会转换数据格式,但不提供安全性。加密保护机密性。哈希处理会生成用于完整性验证的固定长度指纹。
编码:格式转换
编码会将数据从一种格式转换为另一种格式,用于兼容或传输。编码始终可逆,且不需要密钥。任何知道编码方案的人都可以对数据进行解码。
示例包括 Base64(二进制转 ASCII)、URL 编码(空格用 %20 表示)、HTML 实体(& 表示 &)以及十六进制编码。编码的目标是兼容性,而不是安全性。
加密:使用密钥保护机密性
加密会使用密钥将明文转换为密文。只有拥有正确密钥的人才能还原该操作。没有密钥时,在计算上无法实际解密密文。
加密算法包括 AES(对称加密)、RSA(非对称加密)和 ChaCha20。提供安全性的是密钥,而不是算法本身。算法本身是公开信息。
哈希处理:单向固定长度摘要
密码学哈希函数会接收任意长度的输入,并生成固定长度的输出(摘要或哈希值)。该函数具有确定性(相同输入始终产生相同输出),但按设计不可逆。
无论输入是 1 字节还是 1 GB,SHA-256 始终生成 256 位输出。哈希函数用于完整性检查、密码存储和数字签名。
Base64 并非加密(NOT)
一个关键且常见的错误是:Base64 编码的数据并未加密(NOT)。解码 Base64 只需要知道它使用的是 Base64,而这一点通常可以从 "==" 填充或字符集看出来。
如果您将密码编码为 "cGFzc3dvcmQ="("password" 的 Base64 编码),攻击者可以在几秒钟内将其解码。在安全场景中,Base64 仅适用于传输兼容性,绝不能用于隐藏数据。
密码的 MD5 值是哈希值,而不是加密
使用 MD5 对密码进行哈希处理,会将密码存储为单向摘要。您无法对 MD5 哈希值进行“解密”来恢复密码。不过,MD5 并不适合作为密码哈希函数,因为它的速度太快。
攻击者可以利用 GPU 每秒计算数十亿个 MD5 哈希值,从而使暴力破解和彩虹表攻击变得切实可行。密码存储需要使用 bcrypt、scrypt 或 Argon2 等速度较慢且具有高内存需求的函数。
AES-GCM 是经认证的加密
AES-GCM(伽罗瓦/计数器模式)同时提供机密性(加密)和完整性(认证)。它使用计数器模式下的 AES 进行加密,并使用 GHASH 进行认证。
AES-GCM 生成的认证标签可以检测密文是否遭到篡改。因此,它属于带关联数据的经认证加密(AEAD)方案,是现代加密的黄金标准。
SHA-256 是哈希函数
SHA-256(256 位安全哈希算法)是由 NIST 标准化的密码学哈希函数。它会生成 256 位摘要,并且被认为能够抵御所有已知攻击,包括碰撞攻击和原像攻击。
SHA-256 用于 TLS 证书、比特币挖矿(工作量证明)、HMAC 消息认证,以及 RSA-SHA256 和 ECDSA 等数字签名方案。
开发人员常见错误
混淆这三种操作会导致一些常见的安全错误:将密码加密而不是进行哈希处理(加密密钥会成为真正的漏洞),用编码代替加密来处理敏感数据,使用快速哈希函数(MD5、SHA-1)存储密码,以及误以为某些内容只要是 Base64 就一定安全。
另一个错误是让同一个函数承担多个用途,例如在没有 HMAC 构造的情况下将哈希函数用作 MAC,这样会容易受到长度扩展攻击。
何时使用哪种操作
当您需要通过文本协议传输二进制数据、将字节存储在文本字段中,或将数据嵌入 URL 时,请使用编码。存储密码(使用 bcrypt/Argon2)、验证数据完整性(校验和),以及从可变长度数据派生固定长度标识符时,请使用哈希处理。
当您需要存储或传输敏感数据,并且必须能够使用正确的密钥恢复这些数据时,请使用加密。在传输过程中,将哈希处理与加密(AEAD)结合使用,可以同时实现完整性和机密性。
实践中结合使用三种操作
设计良好的身份验证系统会同时使用三种操作:密码使用 Argon2 进行哈希处理(哈希处理),哈希值使用 AES-256 列加密存储在数据库字段中(加密),登录后返回的 API 令牌则采用 Base64url 编码(编码)。
每种操作都服务于明确的目的。在具体使用场景中识别哪种操作最为合适,是应用密码学和安全系统设计的一项基本技能。
编码与加密测验
请测试您对编码、加密和哈希处理的理解。
要点:编码与加密和哈希处理的区别
编码(Base64、十六进制)是格式转换,不提供安全性。加密(AES-GCM)提供可逆的机密性保护,并且需要密钥。哈希处理(SHA-256、Argon2)会生成不可逆的固定长度摘要。
绝不要将编码用于安全保护。密码应使用速度较慢的哈希函数(Argon2/bcrypt)。传输中或静态存储的敏感数据应使用经认证的加密(AEAD)。混淆这些类别是导致安全漏洞的最常见原因之一。
常见问题解答
「编码、加密与哈希的区别」课时是免费的吗?
是的 — 「编码、加密与哈希的区别」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「编码、加密与哈希的区别」这节课中我会学到什么?
明确区分这三个概念,并了解分别应在何时使用它们 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「编码、加密与哈希的区别」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Base64 编码:工作原理
- ASCII、Unicode 与文本表示
- 密码学输出中的十六进制
- 编码、加密与哈希的区别