Hash、加密和编码有什么区别
理解什么时候应该 Hash、什么时候应该加密、什么时候只是编码,避免把三者混用。
Hash、加密和编码都会“改变数据长相”,但它们解决的问题完全不同。混用这些概念,常常会造成密码存储不安全、接口对接失败和调试误判。
一句话版本:Hash 用来做指纹,加密用来保密,编码用来适配传输格式。
Hash 生成数据指纹
Hash 函数把输入变成固定长度的摘要。输入稍微变化,输出通常会完全不同。好的密码学 Hash 还应当难以反推原文。
Hash 适合:
- 文件完整性校验。
- 缓存键和内容指纹。
- 不保存原文的情况下比较数据。
- 密码存储,但必须使用专门的密码 Hash 算法和 salt,不能直接用 MD5 或 SHA-256。
调试摘要是否一致时,可以使用 Hash 生成器 对比期望值和实际值。
加密保护秘密
加密是可逆的,但需要密钥。只要有正确密钥,就能恢复原文。
加密适合:
- 存储敏感密钥。
- 私密消息。
- 数据库敏感字段。
- 安全通道里的数据保护。
如果一个值不需要密钥就能还原,那它不是加密。
编码改变表示形式
编码是为了让数据适配某种语法或传输通道。编码通常可以在没有密钥的情况下还原。
编码适合:
- 用 Base64 表示二进制字节。
- URL query 参数里的百分号编码。
- HTML 文本里的实体转义。
- JSON 字符串转义。
编码不是安全边界。Base64 可能让内容不那么直观,但它并不能保护数据。
怎么选择
先问你要解决什么问题:
- 判断两个文件是否一致:Hash。
- 存一个秘密并且之后要恢复:加密。
- 把文本安全放进 URL:编码。
- 存用户密码:使用专门的密码 Hash 方案,不要直接加密,也不要裸用 SHA。
快速排查混淆
如果一个值看起来不可读,先看上下文。URL-safe 字符可能是 URL 编码或 Base64URL。固定长度十六进制字符串可能是 Hash。带 IV、key ID 或算法元数据的值可能是加密结果。
把转换类型叫对,后面的工具选择就简单多了。