编码、哈希和加密都会转换数据,但不会产生相同结果。编码改变表示形式。哈希生成固定长度的哈希值。加密使用密钥保护可读内容。即使输出看起来不可读,错误的操作仍可能造成严重错误。
快速回答: 其他系统需要兼容表示形式时,请使用编码。需要可重复指纹或完整性检查时,请使用哈希。授权系统必须恢复机密数据时,请使用经过身份验证的加密。Base64 是编码,不是加密。
本指南比较用途、可逆性、密钥、算法、错误和示例。每项决定都连接到编码工具、哈希工具和加密工具。
最重要的区别是什么?
最重要的区别是承诺的结果。编码承诺规范化表示。哈希承诺具有算法相关属性的确定性哈希。只有算法、模式、密钥、Nonce、身份验证和实现都合适时,加密才承诺机密性。
| 操作 | 主要用途 | 可逆 | 需要秘密密钥 | 常见输出 | 示例 |
|---|---|---|---|---|---|
| 编码 | 为传输或存储表示数据 | 是 | 否 | 使用其他语法的文本或字节 | Base64、十六进制、百分号编码 |
| 哈希 | 生成用于完整性或比较的指纹 | 实际不可逆 | 否 | 固定长度哈希 | SHA-256、SHA-384、SHA-512 |
| 加密 | 防止未经授权的读取 | 是,需要正确密钥 | 是 | 密文、Nonce 和 Tag | AES-GCM、ChaCha20-Poly1305 |
外观不能决定操作。Base64 可能看起来随机,但任何人都可以解码。十六进制哈希可能像密文,但不会恢复原文。密文可以使用 Base64 编码进行传输。
什么是编码?
编码使用公开规则,将数据映射为另一种表示形式。它在系统之间创建兼容性。它不需要秘密。如果解码器知道模式,就可以还原有效输入。
Base64 是常见的二进制到文本编码。RFC 4648 规定 Base16、Base32 和 Base64,以及它们的字母表、填充和规范行为。Base64 让字节可以通过面向文本的系统传输。它不会隐藏这些字节。
Base64 编码器会分组比特,并将它们映射到有限字母表。填充会补齐最后一组。不同变体可能使用其他字母表。URL 安全的 Base64 会替换有问题的字符。接收方必须知道变体和填充规则。
十六进制编码使用两个十六进制字符表示每个字节。它易于检查和复制。在再次封装前,它会使字符数量翻倍。Base64 通常需要较少文本,但相对于二进制数据同样会增加大小。
百分号编码在 URL 组件中表示八位字节。HTML 实体在标记中表示特殊字符。UTF-8 等字符编码将字符映射到字节。每种操作解决兼容性问题,但不提供机密性。
你可以使用 Base64 编码器和解码器测试受控输入。未检查处理模型前,不要输入密码、密钥或受监管数据。浏览器处理可以降低部分传输风险,但不能替代设备安全。
Base64 是加密吗?
不是。Base64 使用公开且可逆的映射,不使用秘密密钥。拥有文本的任何人都可以解码。Base64 可以封装密文,但单独不提供机密性。
配置、Cookie、令牌和协议需要特别注意这种区别。编码后的秘密仍然是必须保护的秘密。将 Base64 当作屏障可能泄露凭据和个人数据。
什么是哈希?
密码学哈希函数接受可变长度输入,并返回固定长度哈希。相同输入产生相同哈希。一个小变化应显著改变结果。安全性还需要抵抗原像、第二原像和有意碰撞攻击。
NIST FIPS 180-4 规定 Secure Hash Standard。它包含 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256。“SHA-2”表示一个系列,而不是单个长度。
直接回答: 需要可重复值但不需要恢复输入时,请使用哈希。授权方必须恢复输入时,请使用加密。
文件发布者通常会在下载旁发布哈希。请对下载的字节计算哈希并比较。匹配结果证明这些字节与生成已发布值的字节相同。它不能证明是谁发布了该值。你需要经过身份验证的渠道或签名来证明来源。
SHA-2 哈希计算器可以计算常见结果。All Hashes Generator(英文页面)可以显示多个算法。多个输出不会让弱算法变强。请根据要求和适用标准选择算法。
哈希不是唯一标识符
固定长度哈希表示无限数量的输入。因此,碰撞必然存在。安全哈希会让有用碰撞变得困难,但不会让碰撞不可能。
不要将哈希作为通用身份凭证。请评估算法、输入构造、攻击者和后果。旧哈希可以检测意外损坏,但可能抵抗不了攻击者。
Hash Analyzer(英文页面)可以根据长度和语法建议算法。它不能证明哪个算法生成了该值。仍然需要上下文。
密码哈希需要特定设计
通用哈希有意设计得很快。这有利于文件检查,但也让攻击者可以在单位时间内尝试许多密码。
密码存储需要专门设计的函数或密钥派生。它必须使用唯一 Salt 和有意选择的成本。它还需要受控参数、安全比较、迁移和副本保护。NIST SP 800-63B提供最新指导。
Salt 不需要保密。它可以防止相同密码在多个账户中生成相同验证值。Pepper 是具有不同运行要求的另一种秘密。Salt 和 Pepper 都不会将 Base64 变成加密,也不会让无 Salt 的快速哈希变得合适。
校验和不一定是密码学哈希
校验和可以检测意外更改。CRC 算法适合传输和存储错误。它们通常不能抵抗有意篡改。密码学哈希面向更强的属性。
请在选择前定义要求。意外错误请使用校验和。攻击者可能修改数据时,请使用密码学哈希或 MAC。接收方必须使用公钥检查来源和完整性时,请使用数字签名。
什么是加密?
加密使用密钥将明文转换为密文。解密会恢复原文。安全系统还需要正确的密钥生成、模式、Nonce、身份验证、存储、轮换和访问控制。
NIST FIPS 197 规定 AES。AES 使用 128 位块,并支持 128、192 或 256 位密钥。AES 本身不会规定如何加密长消息。操作模式提供这种构造。
经过身份验证的模式可以保护机密性并检测更改。AES-GCM 是常见示例。它的 Tag 可以拒绝被更改的密文或相关数据。未经身份验证的加密可能泄露信息,或接受攻击者控制的更改。
NIST SP 800-38D 规定 GCM 和 GMAC。其中的 Nonce 要求非常重要。对同一 GCM 密钥重复使用 Nonce 可能破坏安全性。如果系统不管理状态,接口无法阻止不同会话重复使用 Nonce。
你可以使用 AES Encryption(英文页面)学习并执行受控转换。浏览器工具不是完整的密钥管理系统。生产加密需要经过验证的协议和受保护的生命周期。
对称加密和非对称加密
对称加密使用共享秘密密钥。同一密钥或相关密钥负责加密和解密。AES 是对称算法。它效率高,但参与方必须安全共享和保存密钥。
非对称加密使用公钥和私钥对。在适当模式中,公钥可以为私钥持有者加密。公钥密码学也支持签名,但签名不是加密。
许多协议结合两种类型。公钥方法建立或保护临时对称密钥。经过身份验证的对称加密保护数据。协议还会验证参与方、绑定上下文并阻止重放。
密钥、证书和令牌集合提供相关工具。证书通过签名链将身份与公钥关联。JWT 可以签名或加密。其 Base64url 片段不会使它保密。
静态数据和传输中数据的加密
静态数据加密根据威胁模型保护数据。磁盘加密有助于保护关机设备丢失后的数据。字段加密可以限制部分数据路径。副本、日志、导出、索引和缓存需要单独检查。
传输中加密保护端点之间的通信。TLS 是常见的 Web 示例。数据一旦被授权端点解密,传输中加密就不再保护数据。扩展、受损设备、日志和授权用户仍可能访问明文。
如果不说明范围,“已加密”是不完整的说法。请询问保护哪些数据、加密从哪里开始到哪里结束、谁控制密钥,以及包含哪些攻击者。
Message Authentication Code 属于哪一类?
消息认证码(MAC)使用秘密密钥,在共享密钥的参与方之间保护完整性和真实性。HMAC 将密码学哈希与特定构造结合。它不是简单哈希,也不会加密内容。
NIST FIPS 198-1 规定 HMAC。拥有密钥的接收方可以检查消息和 Tag 是否匹配。Tag 不会恢复消息。拥有共享密钥并能检查的人也能生成有效 Tag。
消息可以保持可见,但你必须检测参与方之间的更改时,请使用 MAC。还需要机密性时,请使用经过身份验证的加密。验证必须使用公钥时,请使用签名。
数字签名属于哪一类?
数字签名使用私钥签名,并使用公钥验证。它面向真实性和完整性。在某些系统中,它还支持不可否认性。它不会隐藏签名内容。
签名通常作用于结构化表示或哈希。规范化很重要,因为两个序列可能表示相似的可读数据。协议还必须绑定算法、上下文、标识符和有效期。
NIST SP 800-175B 说明联邦密码学标准。开发者应使用维护良好的库和成熟协议。不要从孤立输出中拼接原语。
这些操作如何协同工作?
安全应用通常会按固定顺序使用多种转换。请考虑通过 JSON 传输的加密消息:
- 应用将明文序列化为准确的字节序列。
- 经过身份验证的算法使用密钥和 Nonce 生成密文和 Tag。
- Base64url 对二进制字段编码,使 JSON 可以传输它们。
- 接收方解码 Base64url,然后执行经过身份验证的解密。
- 如果身份验证失败,接收方拒绝消息。
编码层提供表示形式。加密层提供机密性和完整性。只反转编码会显示密文,而不是明文。省略身份验证会使设计无效。
另一种流程可以计算公共文件的哈希,为哈希签名,并使用 Base64 编码签名。哈希生成固定输入。签名将其绑定到私钥。Base64 让签名可以作为文本传输。每个步骤承诺不同功能。
决策帮助
请从所需结果开始,不要从输出外观开始。
| 要求 | 方法 | 重要条件 |
|---|---|---|
| 将二进制字节放入文本字段 | 编码 | 两个系统约定相同变体 |
| 使用可靠哈希比较文件 | 密码学哈希 | 从可靠来源获取哈希 |
| 检测共享秘密参与方之间的更改 | MAC | 保护并轮换共享密钥 |
| 隐藏内容并检测更改 | 经过身份验证的加密 | 始终遵守密钥和 Nonce 规则 |
| 存储密码验证值 | 密码哈希或 KDF | 使用唯一 Salt 和合适成本 |
| 允许公开验证发布者 | 数字签名 | 保护私钥并验证身份 |
| 检测意外错误 | 校验和 | 不要声称可以抵抗攻击者 |
授权系统必须恢复输入时,不可逆哈希就是错误选择。不需要机密性时,加密可能增加不必要的密钥风险。只需要兼容性时,请使用有文档的编码和单独的安全控制。
常见错误
错误 1:将不可读文本视为安全
看起来随机的输出不能证明任何事情。Base64、十六进制、压缩数据、哈希和密文都可能看起来陌生。请识别操作和属性。
错误 2:不进行身份验证就加密
机密性不能证明密文未被更改。请优先使用成熟的、经过身份验证的构造。在使用明文前检查 Tag。
错误 3:重复使用 Nonce 或初始化向量
要求取决于算法和模式。有些要求唯一性,有些要求不可预测性。错误重复使用可能泄露文本之间的关系或身份验证密钥。
错误 4:将密钥与密文放在一起
将密钥放在数据旁边可能取消威胁边界。请使用合适的秘密或密钥管理系统。限制访问,记录操作,轮换密钥,并规划恢复。
错误 5:对低熵秘密使用快速哈希
攻击者可以离线测试短值或常见值。请使用专用密码构造。遵循当前平台和安全指导。
错误 6:信任来自同一受损来源的哈希
替换文件的攻击者也可以替换附近的哈希。请使用签名清单、可靠渠道或独立的经过身份验证的来源。
错误 7:设计新的密码协议
安全原语可能在不安全的组合中失败。重要系统请优先使用经过审查的标准、成熟库、安全值和专家检查。
使用浏览器工具的安全流程
浏览器工具有助于学习、格式转换、诊断和检查。请对受控数据使用以下流程:
- 确定需要表示、完整性、身份验证还是机密性。
- 从示例中移除生产秘密和个人数据。
- 为操作选择具体工具。
- 确认算法、字母表、模式、填充和输出编码。
- 在信任未知结果前测试已知示例。
- 在独立检查通过前保留原件。
- 在生产代码中使用维护良好的库。
Tool Factory 的路径将学习与准确操作连接起来。从 Base64开始,检查哈希格式(英文页面),计算 SHA-2 哈希,或检查 AES(英文页面)。每个页面都会说明用途和替代方案。
常见问题
哈希可以替代加密吗?
不能。哈希不会恢复输入。指纹和适当的完整性任务请使用哈希。需要授权恢复时,请使用加密。
加密可以替代哈希吗?
不一定。加密需要密钥管理,并且同一文本可能生成不同输出。哈希无需密钥即可提供稳定值。经过身份验证的加密包含完整性,但使用不同的访问模型。
SHA-256 是加密吗?
不是。SHA-256 属于 SHA-2 系列。它生成 256 位哈希,没有解密密钥。
AES 是哈希吗?
不是。AES 是对称分组加密。应用通过模式或构造使用它。正确实现的 AES-GCM 可以提供经过身份验证的加密。
Base64 会减小数据大小吗?
不会。Base64 通常会增加数据大小,因为它使用有限文本字母表表示字节。压缩是另一种操作,通常在 Base64 前进行。
哪种方法可以保护 API 令牌?
这取决于系统。请通过 TLS 传输令牌。请将它存储在秘密系统中。限制并轮换访问。如果不需要恢复原文,可以使用哈希进行检查。编码不提供保护。
哪种加密算法最安全?
没有名称可以保证系统安全。请通过维护良好的库使用当前的、经过身份验证的构造。遵循密钥、Nonce、Tag 和错误规则。评估完整协议和威胁模型。
最终选择规则
编码改变表示形式。哈希生成不可逆值。加密使用密钥保护可恢复内容。MAC 和签名增加简单哈希无法提供的身份验证模型。
请在选择前写下所需属性。然后选择当前标准、维护良好的实现和受控密钥生命周期。浏览器工具适合学习和有限转换。生产安全需要经过验证的协议。