简介
什么是密码学中的哈希函数?
哈希函数是一种快速算法,它接受任何长度的输入,并产生一个固定长度的随机输出,称为摘要(digest),比如:
- MD4, MD5: 128-bit output (broken)
- •SHA-1: 160-bit output (broken)
- SHA-2: 224, 256, 384, or 512-bit output
- SHA-3: 224, 256, 384, 512, …-bit output
雪崩效应 - Avalanche effect:输入的微小变化导致输出的巨大变化
比如:
哈希函数的安全要求
- 单向或Preimage Resistant - 抗第一原像性:给定H(x),很难找到x
- Second-Preimage Resistant - 抗第二原像性:给定x,很难找到不同的y,使得H(x)=H(y)
- 抗碰撞性 - Collision Resistant:很难找到不同的x,y,使得H(x)=H(y)
- 随机Oracle:对H进行建模,以产生随机值作为输出
- “hard”意味着没有(已知的)算法在合理的时间(例如一天)内以合理的概率(例如50%)成功进行攻击
密码学中的哈希函数是用来干什么的?
- 存储密码摘要:例如哈希(nonce、challenge、password)
- 完整性检查:例如软件下载摘要、入侵检测
- 注册表和配置文件的快照
- 哈希表:索引=哈希(数据库密钥)
- MAC和数字签名:加密完整性保护
- 承诺:安全地承诺一个价值,并在以后揭示它
- 密钥派生功能:例如,从主密钥生成会话密钥
- 随机数生成:例如挑战生成
- 重复数据消除
- 工作证明:例如证明花费的计算资源
存储密码摘要
- 通常会存储一个加密的密码散列
- 如果通信被截获,我们希望很难计算H(salt,pwd)
- 如果数据库受损,我们希望很难找到pwd
- 因此,至少我们希望散列是单向的:知道输出,应该很难找到给出该输出的输入(除非我们尝试所有可能的输入)
- 例如,给定H(salt,pwd),很难找到salt,pwd
入侵检测
- 系统文件是“指纹”(即散列),摘要存储在安全的保险库中,以便稍后与新摘要进行比较
- 如果系统受损(但不是vault)并且系统文件被修改,则摘要不应匹配
- 对手看到原始文件(原始输入),不应能够构建摘要匹配的修改文件(第二输入)
- 因此,至少我们想要second-preimage resistance,即知道一个输入,应该很难找到另一个具有相同摘要的输入
哈希表
- 对数据库键进行散列处理,以快速计算记录索引并加快查找速度
- 理想情况下,我们希望将不同的键散列到不同的索引中
- 不同的输入散列到相同的输出称为冲突
- 因此,至少我们想要抗碰撞 - Collision Resistant:应该很难找到两个具有相同摘要的不同输入
密钥导出函数 - Key Derivation Function (KDF)
- 用于从主密钥派生新会话密钥的KDF
- 例如,在Intel SGX等安全元件中,或在Signal等端到端加密即时消息中
- KDF是通过组合散列函数构建的
- 我们需要哈希函数是单向的
- 我们还需要散列函数来产生不可预测的随机输出
- 因此,我们需要散列函数作为一个随机函数,称为随机预言机,即对任何输入进行建模,以产生真正的随机输出