加密哈希函数
哈希函数非常有用,几乎出现在所有信息安全应用中。
哈希函数是一种数学函数,可将数字输入值转换为另一个压缩的数字值。 哈希函数的输入是任意长度,但输出始终是固定长度。
哈希函数返回的值称为消息摘要或简称为哈希值。 下图说明了哈希函数−
哈希函数的特点
哈希函数的典型特征是 −
固定长度输出(哈希值)
哈希函数将任意长度的数据转换为固定长度。 此过程通常称为对数据进行哈希处理。
一般来说,哈希值比输入数据小得多,因此哈希函数有时称为压缩函数。
由于哈希是较大数据的较小表示,因此它也称为摘要。
具有 n 位输出的哈希函数称为n 位哈希函数。 流行的哈希函数生成 160 到 512 位之间的值。
效率
一般来说,对于输入为 x 的任何哈希函数 h,h(x) 的计算都是快速运算。
计算哈希函数比对称加密快得多。
哈希函数的属性
为了成为有效的加密工具,哈希函数需要具备以下属性 −
Pre-Image Resistance(原像阻力)
此属性意味着反转哈希函数在计算上应该很困难。
换句话说,如果哈希函数 h 生成哈希值 z,那么找到哈希到 z 的任何输入值 x 应该是一个困难的过程。
此属性可防止仅拥有哈希值并试图查找输入的攻击者。
Second Pre-Image Resistance(第二原像阻力)
此属性意味着给定输入及其哈希值,应该很难找到具有相同哈希值的不同输入。
换句话说,如果输入 x 的哈希函数 h 生成哈希值 h(x),那么应该很难找到任何其他输入值 y 使得 h(y) = h(x) .
哈希函数的这一属性可以防止攻击者拥有输入值及其哈希值,并希望将不同的值替换为合法值来代替原始输入值。
Collision Resistance(抗碰撞能力)
此属性意味着很难找到任意长度的两个不同输入产生相同的哈希值。 此属性也称为无冲突哈希函数。
换句话说,对于哈希函数 h,很难找到任何两个不同的输入 x 和 y 使得 h(x) = h(y)。
由于哈希函数是固定哈希长度的压缩函数,因此哈希函数不可能不发生冲突。 这种无碰撞特性仅证实这些碰撞应该很难发现。
此属性使攻击者很难找到具有相同哈希值的两个输入值。
此外,如果哈希函数具有抗碰撞性,那么它具有第二原像抗性。
哈希算法的设计
哈希的核心是一个数学函数,它对两个固定大小的数据块进行运算以创建哈希码。 该哈希函数构成了哈希算法的一部分。
每个数据块的大小根据算法的不同而不同。 通常块大小为 128 位到 512 位。 下图演示了哈希函数 −
哈希算法像分组密码一样涉及上述哈希函数的轮次。 每轮都采用固定大小的输入,通常是最新消息块和上一轮输出的组合。
根据散列整个消息所需的次数,重复此过程。 哈希算法的示意图如下图所示−
因为,第一个消息块的哈希值成为第二个哈希运算的输入,第二个哈希运算的输出改变了第三个运算的结果,依此类推。 这种效应称为哈希的雪崩效应。
雪崩效应会导致两条消息的哈希值显着不同,甚至仅相差一个数据位。
正确理解哈希函数和算法之间的区别。 哈希函数通过对两块固定长度的二进制数据进行运算,生成哈希码。
哈希算法是使用哈希函数的过程,指定如何分解消息以及如何将先前消息块的结果链接在一起。
流行的哈希函数
让我们简单看一下一些流行的哈希函数−
消息摘要(MD)
MD5 是多年来最流行和广泛使用的哈希函数。
MD 系列由哈希函数 MD2、MD4、MD5 和 MD6 组成。 它被采纳为互联网标准 RFC 1321。它是一个 128 位哈希函数。
MD5 摘要已广泛应用于软件领域,以保证传输文件的完整性。 例如,文件服务器通常会为文件提供预先计算的 MD5 校验和,以便用户可以将下载文件的校验和与其进行比较。
2004年,MD5中发现了冲突。 据报道,使用计算机集群的分析攻击仅在一小时内就成功了。 此次碰撞攻击导致 MD5 被破坏,因此不再建议使用。
安全哈希函数 (SHA)
SHA 系列由四种 SHA 算法组成; SHA-0、SHA-1、SHA-2 和 SHA-3。 虽然来自同一个家族,但结构上却有所不同。
最初的版本是 SHA-0,一种 160 位的哈希函数,由美国国家标准与技术研究所 (NIST) 于 1993 年发布。它有一些弱点,并且没有变得非常流行。 1995 年晚些时候,SHA-1 旨在纠正 SHA-0 的缺陷。
SHA-1 是现有 SHA 哈希函数中使用最广泛的。 它被用于多种广泛使用的应用程序和协议中,包括安全套接字层 (SSL) 安全性。
2005 年,发现了一种在实际时间范围内发现 SHA-1 冲突的方法,这使得 SHA-1 的长期使用性受到质疑。
SHA-2 系列还有四种 SHA 变体:SHA-224、SHA-256、SHA-384 和 SHA-512,具体取决于其哈希值中的位数。 目前还没有关于 SHA-2 哈希函数的成功攻击的报告。
尽管 SHA-2 是一个强大的哈希函数。 尽管有很大不同,但其基本设计仍然遵循 SHA-1 的设计。 因此,NIST 呼吁新的竞争性哈希函数设计。
2012 年 10 月,NIST 选择 Keccak 算法作为新的 SHA-3 标准。 Keccak 具有许多优点,例如高效的性能和良好的攻击抵抗能力。
RIPEMD
RIPEMD 是 RACE 完整性原语评估消息摘要的缩写。 这套哈希函数是由开放研究社区设计的,通常被称为欧洲哈希函数家族。
该套装包括 RIPEMD、RIPEMD-128 和 RIPEMD-160。 该算法还存在 256 位和 320 位版本。
原始 RIPEMD(128 位)基于 MD4 中使用的设计原理,但发现其安全性存在问题。 RIPEMD 128 位版本作为快速修复替代品来克服原始 RIPEMD 上的漏洞。
RIPEMD-160是改进版本,也是该系列中使用最广泛的版本。 256 和 320 位版本减少了意外碰撞的可能性,但分别与 RIPEMD-128 和 RIPEMD-160 相比没有更高的安全级别。
Whirlpool
这是一个 512 位哈希函数。
它源自高级加密标准(AES)的修改版本。 其中设计者之一是 AES 的共同创建者 Vincent Rijmen。
Whirlpool 已发布三个版本; 即 WHIRLPOOL-0、WHIRLPOOL-T 和 WHIRLPOOL。
哈希函数的应用
基于哈希函数的加密特性,有两种直接应用。
密码存储
哈希函数为密码存储提供保护。
大多数登录进程都不是以明文形式存储密码,而是将密码的哈希值存储在文件中。
密码文件由一个格式为(用户 ID,h(P))的对表组成。
登录过程如下图所示 −
入侵者只能看到密码的哈希值,即使他访问了密码。 他既不能使用哈希登录,也不能从哈希值推导出密码,因为哈希函数具有抗原像的特性。
数据完整性检查
数据完整性检查是哈希函数最常见的应用。 它用于生成数据文件的校验和。 该应用程序向用户保证数据的正确性。
该过程如下图所示−
完整性检查可帮助用户检测对原始文件所做的任何更改。 然而,它不提供任何关于原创性的保证。 攻击者可以更改整个文件并计算新的哈希值并将其发送给接收者,而不是修改文件数据。 仅当用户确定文件的原创性时,此完整性检查应用程序才有用。