输入数据 → 哈希函数 → 固定长度输出
哈希(Hash)是一种将任意长度的输入(又称为预映射,pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间。
相同的输入总是产生相同的哈希值,确保结果可预测和可验证。
计算哈希值的过程非常快速,即使对于大量数据也能高效处理。
从哈希值几乎不可能反推原始输入数据,这是密码学安全的基础。
很难找到两个不同的输入产生相同的哈希值,确保数据唯一性。
"哈希技术专题网站"
a3f5c8e2d4b7a912f4c6e8d5c3b7a291f4e6c8d5a3b7c291f4e6d5c8a3b7f2c4
c8e3a5b7d2f4a691c7e5b8d3a2f4c691
哈希过程示意图
哈希函数在密码学中用于存储密码、数字签名和消息认证码。密码通常以哈希值形式存储,即使数据库泄露,攻击者也无法直接获取原始密码。
密码安全存储
区块链中的每个区块都包含前一个区块的哈希值,形成不可篡改的链式结构。工作量证明机制也依赖哈希计算来确保网络安全。
区块链哈希链
通过比较文件的哈希值,可以验证数据在传输或存储过程中是否被篡改。下载软件时提供的校验和就是哈希值的应用。
数据完整性检查
哈希表通过哈希函数将键映射到存储位置,实现快速的数据插入、删除和查找操作,时间复杂度接近O(1)。
哈希表示意图
哈希值可以作为数据的唯一指纹,用于检测重复内容。在云存储、内容分发网络中广泛用于数据去重。
数据指纹识别
Git等版本控制系统使用SHA-1哈希来标识提交、文件和目录,确保版本历史的完整性和一致性。
Git版本控制
| 算法名称 | 输出长度 | 安全性 | 主要应用 | 特点 |
|---|---|---|---|---|
| MD5 | 128位 | 已不安全 | 文件校验、非密码用途 | 计算速度快,但已发现严重碰撞漏洞 |
| SHA-1 | 160位 | 较弱 | Git版本控制、旧版TLS/SSL | 已被证明存在碰撞攻击可能 |
| SHA-256 | 256位 | 安全 | 区块链、数字签名、密码存储 | SHA-2家族成员,目前广泛使用 |
| SHA-3 | 可变长度 | 安全 | 新一代安全应用 | 基于Keccak算法,设计上与SHA-2不同 |
| Bcrypt | 可变长度 | 安全 | 密码哈希 | 专门为密码哈希设计,包含盐值和成本因子 |
| Argon2 | 可变长度 | 高安全 | 密码哈希竞赛获胜者 | 抗GPU/ASIC攻击,内存密集型设计 |
不同哈希算法的安全性、性能和应用场景对比
加密是可逆的过程,目的是保护数据的机密性,加密后的数据可以通过密钥解密还原。哈希是单向的过程,目的是验证数据的完整性,哈希值无法还原为原始数据。加密用于传输和存储敏感信息,哈希用于验证数据是否被篡改。
哈希碰撞是指两个不同的输入产生了相同的哈希值。对于加密哈希函数,碰撞应该是计算上不可行的。如果攻击者能够找到碰撞,就可以用恶意文件替换合法文件而不改变哈希值,从而绕过完整性检查。MD5和SHA-1算法就是因为碰撞攻击而被认为不安全。
直接存储密码的哈希值仍然不安全,因为攻击者可以使用彩虹表(预先计算的哈希值表)进行反向查找。安全的做法是使用加盐哈希:为每个密码生成一个随机盐值,将盐值与密码组合后再进行哈希,并将盐值与哈希值一起存储。更好的方法是使用专门设计的密码哈希函数如Bcrypt或Argon2。
区块链中的每个区块都包含前一个区块的哈希值,形成不可篡改的链式结构。如果某个区块的数据被修改,其哈希值会改变,导致后续所有区块的哈希值都需要重新计算,这在计算上是不可行的。此外,工作量证明机制要求矿工找到满足特定条件的哈希值,这需要大量计算资源,确保了网络安全。
选择哈希算法应考虑以下因素:
输入数据经过哈希函数处理生成固定长度的数字指纹