一, 散列函数的具体应用
1. 消息认证
消息认证是用来验证消息完整性的一种机制或服务. 消息认证确保收到的数据确实和发送时的一样(及没有修改, 插入, 删除或重放). 此外, 还要求消息认证机制确保发送方的身份是真实有效的. 当散列函数用于提供消息认证功能时, 散列函数值通常称为消息摘要.
消息认证中使用散列函数的本质: 发送者根据待发送的消息使用函数计算一组 Hash 值, 然后将 Hash 值和消息一同发送过去. 接受者收到后对于消息执行同样的 Hash 计算, 并将计算的结果与收到的 Hash 值比较, 如果不匹配, 则可推断出消息或者 Hash 值遭到更改.
2. 数字签名
在进行数字签名的过程使用用户的私钥加密消息的 Hash 值, 其他任何知道该用户的公钥的人都能通过数字签名来验证消息的完整性. 在这种情况下, 攻击者需要知道用户的私钥才能修改数据. 数字签名的应用比消息认证更广泛.
使用方案:(a)使用发送方的私钥, 利用公钥密码算法进队 Hash 码进行加密. 这个方法可以提供认证; 由于只有发送方可以产生加密后的 Hash 码, 所以还提供了数字签名, 这个就是数字签名的本质.(b)若希望既有保密性, 又有数字签名, 可现用发送方的私钥对 Hash 码加密, 再用对称密码中对消息和公钥算法加密结果进行加密, 这个技术更常用.
3. 用于产生单向口令文件
操作系统存储的是口令的 Hash 值, 而不是口令本身. 因为黑客即使能访问口令文件, 也不能获取到真正的口令(口令文件存的是 Hash 值). 当用户输入口令时, 操作系统将比对输入口令的 Hash 值和存储在口令文件中的 Hash 值. 大多数操作系统都采用这种口令保护机制.
4. 用于入侵检测和病毒检测
将每个文件的 Hash 值 H(F)存储在安全系统中, 随后就能通过重新计算 H(F)来判断文件是否被修改, 因为入侵者只能改变文件 F, 却无法改变 H(F)(不知道 Hash 函数).
5. 用于构建随机函数 (PRF) 或者用做伪随机数发生器(PRNG)
二, 散列函数的安全性以及目前安全散列函数的发展
1. 安全性
(1)抗原像攻击(单向性): 对任意给定的 Hash 值 h, 找到满足 H(y)=h 的 y 在计算上不可行.
(2)抗第二原像攻击 (抗弱碰撞性): 对任何给定的分块 x, 找到满足 y!=x 且 H(x)=H(y) 的 y 在计算上是不可行的
(3)抗碰撞性攻击: 找到任何满足 H(x)=H(y)的偶对 (x,y) 在计算上是不可行的
(4)伪随机性
2. 生日攻击
在 n 个人中随机选取 k 个人, 当 k 为多大时能保证 k 个人中有两个人的生日是相同的? 用概率的方法来考虑生日问题, 只要 k=70, 随机选取 70 个人, 这其中两个人有相同生日的可能性就是 99.9%. 假设至少有两个人同一天生日的概率为 P, 那么 P 的否定 (我们写做 1-P) 就是没有任何两个人在同一天过生日的概率. 假设我们有 k 个人, 那么这 k 个人中没有任何两个人在同一天过生日的概率就是: 1-P=(365*364*363*...*(36-k+1))/(365^k), 算得 k=70.
3.MD5 的安全性
抗修改性: 对原数据进行任何改动, 哪怕只修改 1 个字节, 所得到的 MD5 值都有很大区别.
强抗碰撞: 已知原数据和其 MD5 值, 想找到一个具有相同 MD5 值的数据 (即伪造数据) 是非常困难的.
简述: MD5 就是把不论什么长度的文字内容, 给精简成 128 位散列数. 不论文字内容只有一个字母 a, 还是 1w 多字的长篇论文, 都精简 (或填充) 成 128 位散列数. MD5 的弱点被不断发现以及计算机能力不断的提升, 通过碰撞的方法有可能构造两个具有相同 MD5 的信息, 使 MD5 算法在目前的安全环境下有一点落伍. 从实践角度, 不同信息具有相同 MD5 的可能性还是非常低的, 通常认为是不可能的, 通过碰撞的方法也很难碰撞出复杂信息的 MD5 数值.
4.SHA-1 的安全性
该算法的思想是接收一段明文, 然后以一种不可逆的方式将它转换成一段 (通常更小) 密文, 也可以简单的理解为取一串输入码 (称为预映射或信息), 并把它们转化为长度较短, 位数固定的输出序列即散列值(也称为信息摘要或信息认证代码) 的过程.
单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性. 如果在输入序列中嵌入密码, 那么任何人在不知道密码的情况下都不能产生正确的散列值, 从而保证了其安全性. SHA 将输入流按照每块 512 位 (64 个字节) 进行分块, 并产生 20 个字节的被称为信息认证代码或信息摘要的输出.
该算法输入报文的长度不限, 产生的输出是一个 160 位的报文摘要. 输入是按 512 位的分组进行处理的. SHA-1 是不可逆的, 防冲突, 并具有良好的雪崩效应.
安全哈希算法 SHA-1 是在 1993 年提出并在 1995 年完成修订, 如今已经在许多加密安全协议中广泛使用, 包括 TLS 和 SSL,PGP ,SSH,S/MIME 和 IPsec 等, 被视为是 MD5(散列函数)的后继者. 然而从 2005 年开始, SHA-1 的安全性就开始被密码学家质疑, 他们认为随着计算机性能的提升, 破解 SHA-1 算法将不成问题.
5. 发展
王小云教授的成果集中在加速构造碰撞对. 原来理论上构造出一个 MD5 碰撞对需要 2^64 次尝试, 而现在只需要 2^39 次, 其算法大大加速了这一过程. 2009 年, 冯登国, 谢涛二人利用差分攻击, 将 MD5 的碰撞算法复杂度进一步降低到 2^21, 极端情况下甚至可以降低至 2^10. 仅仅 2^21 的复杂度意味着即便是在 2008 年的计算机上, 也只要几秒便可以找到一对碰撞.
2013 年, Marc Stevens 发表了一篇论文, 概述了创建 SHA-1 碰撞的理论方法. 他说两份不一样的 pdf 文件, 可以散列到相同的 SHA-1 摘要. 破解难度: 总计 900 万兆 (即百万的五次幂, 具体为 9,223,372,036,854,775,808) 次 SHA1 计算. 要完成攻击的首个阶段需要单一 CPU 计算 6500 年. 要完成攻击的第二阶段需要单一 GPU 计算 110 年. 这是利用谷歌的技术专长与云基础设施计算碰撞情况, 这也是我们截至目前已完成的规模最大的计算任务之一.
但是, SHA 到目前为止, 还有 SHA-224,SHA-256,SHA-384 和 SHA-512, 并称 SHA-2. 至今尚未出现对 SHA-2 有效的攻击. 但是, 它的算法跟 SHA-1 基本上仍然相似. 因此我们仍然需要不断发展新的算法.
三, md5 算法在验证软件完整性时可能出现的问题.
首先两个完全不同的 EXE 软件(A 和 B),Hash 值也不一样. 然后使用选择性前缀碰撞法进行攻击, 得到两个软件(a 和 b),A 和 a 的功能一样, B 和 b 的功能一样, a 和 b 完全不一样. 但是 a 和 b 的 Hash 值一样. 通过选择前缀碰撞法, 在不知道 Hash 函数的情况下, 可以修改产生一个能和 Hash 函数匹配的软件.
后果: 按照 MD5 的原理, 发送方发送 A 软件和 A 软件的 Hash 值给接收方, 假如出现中间人攻击, 中间人收到 A, 并使用选择前缀碰撞法, 中间人自己写一个木马软件 B, 对 A 和 B 进行攻击, 产生 a 和 b, 然后把 b 和 b 的 Hash 值发送给真正的接收方, 接收方比对 b 和 b 的 Hash 值, 比对成功, 以为就是发送方发的软件 A, 于是中木马.
来源: http://www.bubuko.com/infodetail-2599797.html