密码散列函数 (CHF) 是一种用于验证数据有效性的方程式。密码散列函数也用于保护 区块链 上的交易。这些数学函数接受一个输入,并生成一个对该输入唯一的固定长度的输出。[1][2]
密码学是保护信息和通信的科学和技术,以保证只有信息的目标接收者才能理解和处理信息。散列是将任意长度的明文数据映射到固定长度的唯一密文(称为散列)的过程。执行散列的函数称为散列函数。[1] [9]
散列函数是将给定的数字或字母数字键转换为小的实用整数值的函数。映射的整数值用作散列表中的索引。简单来说,散列函数将一个重要的数字或字符串映射到一个小的整数,该整数可以用作散列表中的索引。该对的形式为 (key, value),其中对于给定的键,可以使用某种将键映射到值的“函数”来查找值。可以使用称为散列函数的函数来计算给定对象的键。[6]
所有密码散列函数都是散列函数,但并非每个散列函数都是密码散列函数。[3][4]
密码散列函数 (CHF) 是一项单向工作,因此极难反向操作以重新创建用于生成它的信息。[1]
区块链上的每个区块都包含前一个区块的散列,从而创建了一个几乎不可能修改的链,并且一个健全的 CHF 还应该能够承受所有已知的对散列方程本身的攻击,并且还应该能够承受侧信道攻击,这意味着攻击不是针对方程本身,而是针对这些方程的实现方式。
密码散列函数的主要应用是确保数据完整性。通过为一段数据生成唯一的散列值,可以轻松检测到对该数据的任何篡改或更改。这在数字签名中尤其重要,在数字签名中,为文档或消息生成散列值,然后使用发送者的私钥对其进行加密。然后,接收者可以使用发送者的公钥解密签名并验证消息的真实性。[8]
密码散列函数 (CHF) 大致分为两类。非密钥散列函数也称为操纵检测代码 (MDC) 或消息身份验证代码 (MAC),具有单个参数——输入消息,以及具有两个不同输入的密钥散列函数——输入消息和一个密钥。通常,术语散列函数是指非密钥散列函数。 以下是密码散列算法的示例。
由美国国家标准与技术研究院 (NIST) 作为美国联邦信息处理标准 (FIPS) 发布。该系列指定了六种不同的散列函数:SHA-0、SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512。前四个对分为 32 位字的 512 位消息块进行操作,后两个对分为 64 位字的 1024 位块进行操作。比特币 是最初的和最大的 加密货币,它使用 SHA-256 散列函数。[3][5]
SHA-256 是 NIST(美国国家标准与技术研究院)推荐并正式批准的标准算法。由于可以在不显示数据内容的情况下验证数据内容,因此它也被包括美国和澳大利亚在内的世界各地的许多政府和公共部门机构使用。[4]
MD 包括由 Ronald Rivest 为 RSA 安全编写的 MD2、MD4、MD5 和 MD6,并被采纳为 Internet 标准 RFC 1321。[3]
一系列密码散列函数,基于 MD4 中使用的设计原则,由 Katholieke Universiteit Leuven 的 COSIC 研究小组的 Hans Dobbertin、Antoon Bosselaers 和 Bart Preneel 开发。RIPEMD-160 生成 160 位(20 字节)的散列摘要。[3]
此散列函数由 Vincent Rijmen 和 Paulo S. L. M. Barreto 设计,基于高级加密标准 (AES) 的大幅修改版本。Whirlpool 生成 512 位(64 字节)的散列摘要。[3]
由 Jean-Philippe Aumasson、Luca Henzen、Willi Meier 和 Raphael C.-W. Phan 提交给 NIST 散列函数竞赛的散列函数。它基于 Dan Bernstein 的 ChaCha 流密码,但在每个 ChaCha 轮之前,都会添加输入块的置换副本,并与轮常量进行异或运算。[3]
以前在 IOTA 签名方案 (ISS) 中使用的散列函数。IOTA 是一种 加密货币,旨在与物联网 (IoT) 和汽车生态系统一起使用。ISS 基于 Winternitz 一次性签名,但与传统的 Winternitz 不同,在 IOTA 中,用户对消息的散列进行签名。因此,ISS 的安全性依赖于其密码散列函数,即 Curl-P-27。[3]
当用户输入其密码时,会对其进行散列,并将结果与公司服务器上存储的散列值列表进行比较。但是,这并不是一种万无一失的做法。黑客创建了常见密码及其散列的数据库,称为彩虹表,这使他们更容易进入帐户。[7]
验证签名是一种用于验证数字文档或消息真实性的数学过程。有效的数字签名(前提条件已满足)为其接收者提供了强有力的证据,证明已知发送者创建了该消息,并且该消息在传输过程中未被更改。数字签名方案通常由三种算法组成:密钥生成算法;签名算法,给定消息和私钥,生成签名;以及签名验证算法。[7]
散列可以确保从发送者传输到接收者的消息和文件在传输过程中不会被篡改。这种做法建立了一条“信任链”。例如,用户可能会发布其数据的散列版本和密钥,以便接收者可以将他们计算的散列值与发布的值进行比较,以确保它们对齐。[7]