class OpenSSL::Digest

OpenSSL::Digest 允许你计算任意数据的消息摘要(有时也互换地称为“哈希”),这些摘要在密码学上是安全的,即 Digest 实现了一个安全的单向函数。

单向函数提供了一些有用的属性。例如,给定两个不同的输入,两者产生相同输出的概率非常低。结合每个消息摘要算法都有一个固定长度的输出(只有几个字节)这一事实,摘要通常用于为任意数据创建唯一的标识符。一个常见的例子是为存储在数据库中的二进制文档创建唯一的 ID。

单向函数的另一个有用的特性(因此得名)是,给定一个摘要,没有任何关于产生它的原始数据的指示,即识别原始输入的唯一方法是通过暴力破解所有可能的输入组合。

这些特性使得单向函数也成为公钥签名算法的理想伴侣:不必签署整个文档,而是先使用速度快得多的消息摘要算法生成文档的哈希,然后只需使用较慢的公钥算法签署其输出的几个字节。要验证已签名文档的完整性,只需重新计算哈希并验证它是否与签名中的哈希相等即可。

你可以在终端中运行以下命令来获取系统支持的所有摘要算法的列表

openssl list -digest-algorithms

OpenSSL 1.1.1 支持的消息摘要算法中,包括

可以使用名称实例化这些算法中的每一个

digest = OpenSSL::Digest.new('SHA256')

“破解”消息摘要算法意味着违背其单向函数特性,即产生冲突或找到一种比暴力破解等更有效的方式来获取原始数据。大多数支持的摘要算法在这种意义上可以被认为是破解的,即使是非常流行的 MD5 和 SHA1 算法也是如此。如果安全是您最关心的问题,那么您可能应该依赖 SHA224、SHA256、SHA384 或 SHA512。

哈希文件

data = File.binread('document')
sha256 = OpenSSL::Digest.new('SHA256')
digest = sha256.digest(data)

一次哈希多个数据块

data1 = File.binread('file1')
data2 = File.binread('file2')
data3 = File.binread('file3')
sha256 = OpenSSL::Digest.new('SHA256')
sha256 << data1
sha256 << data2
sha256 << data3
digest = sha256.digest

重用 Digest 实例

data1 = File.binread('file1')
sha256 = OpenSSL::Digest.new('SHA256')
digest1 = sha256.digest(data1)

data2 = File.binread('file2')
sha256.reset
digest2 = sha256.digest(data2)