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)