并行计算大文件的哈希码

2024-03-25

我想提高散列大文件的性能,例如大小为数十 GB 的文件。

通常,您使用散列函数(例如 SHA-256,尽管我很可能会使用 Skein)顺序对文件的字节进行散列,因此与从 [ 读取文件所需的时间相比,散列会更慢快]SSD)。我们将此称为方法 1。

这个想法是在 8 个 CPU 上并行散列文件的多个 1 MB 块,然后将连接的散列散列为单个最终散列。我们将此称为方法 2。

描述此方法的图片如下:



我想知道这个想法是否合理,以及与在整个文件范围内执行单个哈希相比,损失了多少“安全性”(就碰撞可能性更大而言)。

例如:

我们使用 SHA-2 的 SHA-256 变体,并将文件大小设置为 2^34=34,359,738,368 字节。因此,使用简单的单遍(方法 1),我将获得整个文件的 256 位哈希值。

将此与以下内容进行比较:

使用并行哈希(即方法 2),我会将文件分成 32,768 个 1 MB 的块,使用 SHA-256 将这些块哈希为 256 位(32 字节)的 32,768 个哈希,连接哈希并进行最终哈希由此产生的串联 1,048,576 字节数据集以获得整个文件的最终 256 位哈希值。

就碰撞可能性更大和/或更有可能而言,方法 2 是否比方法 1 更不安全?也许我应该将这个问题改写为:方法 2 是否使攻击者更容易创建一个散列到与原始文件相同的散列值的文件,当然除了一个简单的事实,即暴力攻击会更便宜,因为hash可以在N个cpu上并行计算吗?

Update:我刚刚发现我在方法 2 中的构造与 a 的概念非常相似哈希表 http://en.wikipedia.org/wiki/Hash_list。然而,前一句中的链接引用的维基百科文章并没有详细说明哈希列表与方法 1 相比在冲突机会方面的优劣,方法 1 是文件的普通旧哈希,当仅top hash使用哈希列表。


基于块的哈希(方法 2)是一种众所周知的技术,已在实践中使用:

  • 哈希树、Merkle树、Tiger树哈希 http://en.wikipedia.org/wiki/Hash_tree
  • eDonkey2000 文件哈希(单级树,块大小约为 9 MiB)

就像您正在做的一样,这些方法获取块哈希列表并再次哈希,直到单个短哈希。由于这是一种行之有效的做法,我认为它与顺序散列一样安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行计算大文件的哈希码 的相关文章

  • 如何使用 Node JS 对包含小数/尾随零的数据生成哈希

    在尝试验证 Node JS 中的 Authorize net webhook 通知时 我遇到了以下与小数 尾随零有关的问题 Authorize net 使用 HMAC SHA512 以及 Webhook 通知正文和商家的签名密钥形成哈希 该
  • 在 C# 中解析 Cryptocompare API Json 数据

    我正在加载数据 这是返回 Response Success Type 100 Aggregated false Data time 1504979760 high 14 26 low 14 26 open 14 26 volumefrom
  • 许可证密钥模式检测? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这不是真实情况 请忽略您可能认为适用的法律问题 因为它们并不适用 假设我有一组 200 个已知的有效许可证密钥 用于假设的软件许可算法
  • 签署程序集“<程序集名称>.dll”时出现加密失败 –“提供程序版本错误”

    我从知名提供商处购买了身份验证证书 现在我想对程序集进行强命名 然后对其进行数字签名 这是我到目前为止所做的 通过运行 sn exe p keypair pfx key snk 从 pfx 中提取公钥 选中项目属性签名选项卡上的 对程序集进
  • hashlib 和 urandom 哪个更随机?

    我正在和一个朋友一起开发一个项目 我们需要生成随机哈希 在我们有时间讨论之前 我们都提出了不同的方法 并且因为他们使用不同的模块 我想问你们大家什么会更好 如果有这样的事情的话 hashlib sha1 str random random
  • 在节点上生成 AES 密钥

    我正在处理一个使用自定义协议来加密通信的遗留应用程序 随机 AES 密钥在旧版 Java 应用程序中生成 如下所示 keygen KeyGenerator getInstance AES keygen init 128 keygen gen
  • 无需动态分配的RSA实现

    典型的 RSA 实现包含一个多精度整数库 典型的多精度整数库使用动态分配将大整数表示为大小合适的机器字数组 我预计当使用多精度整数仅使用 RSA 2048 来加密或解密已知长度的消息 通常是对称加密密钥 时 可能会遇到数学整数的限制 并且它
  • 使用对称密钥 (AES -128) 签名和验证消息

    我想知道对称密钥可以用来签署消息吗 我们可以使用共享密钥进行加密 另外 当使用对称密钥进行签名时 JAVA 中可以使用什么 API 来加载密钥并对消息进行签名 如果我使用 java security 中的 Signature 它有一个 ap
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

    我接到一项任务 要删除我们产品的一个 dll 并将其替换为纯 C 的 dll 旧的 DLL 是 NET 2 0 托管 C C CLI 它包装了对 Win32 本机加密 API 的调用 新的 DLL 应公开具有相同名称和方法的新对象 但应使用
  • 有没有办法在Python中使用非openssl md5作为hashlib?

    我生成 md5 内容哈希值用于上传验证 但最近我注意到 对于在启用 FIPS 的计算机上运行的任何用户来说 这都会失败 FIPS 禁用 openssl md5 导致ValueError当我尝试初始化 hashlib 时 通常我会使用 SHA
  • 是否有用于 AES 的纯 Perl 模块?

    是否有用于 AES 的纯 Perl 模块 地穴 Rijndael PP http search cpan org dist Crypt Rijndael PP Rijndael 是底层算法AES https secure wikimedia
  • 非加密用途的最快哈希值?

    我本质上是在准备要放入数据库的短语 它们可能格式错误 所以我想存储它们的简短散列 我将简单地比较它们是否存在 所以散列是理想的 我假设 MD5 在处理 100 000 个请求时相当慢 所以我想知道散列短语的最佳方法是什么 也许推出我自己的散
  • NodeJS 在目录中递归地哈希文件

    我能够实现目录中的递归文件遍历 即探索目录中的所有子目录和文件 为此我使用了answer https stackoverflow com questions 5827612 node js fs readdir recursive dire
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 为什么AES java解密返回额外的字符?

    请原谅我英语不好 我使用 mcrypt 我从这里得到它用于 php 和 java 的 MCrypt https snipt net raw ee573b6957b7416f28aa560ead71c3a2 nice 在我的android应用
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • crypto createHMAC 输出根据 Nodejs 版本而有所不同

    我在升级节点版本时遇到加密模块问题 创建的HMAC取决于节点的版本 您将在下面找到重现该问题的代码片段 如果我将密钥编码为 BASE64 或任何 HMAC 不依赖于 node js 版本 如果我将其编码为二进制 则当我更改 Node js

随机推荐