【发布时间】:2014-11-25 06:00:22
【问题描述】:
我有以下用例:
- 从文件中读取 n 个字节
- 计算这 n 个字节的 (MD5) 哈希
- 从文件中读取接下来的 m 个字节
- 为文件计算 (MD5) 哈希,最多 n+m 个字节
增量散列文件不是问题,just call TransformBlock and TransformFinalBlock。
问题是我需要多个共享其开始字节的数据散列,但是在我调用TransformFinalBlock 来读取第一个n 字节的Hash 之后,我无法继续使用同一个对象进行散列并且需要一个新的。
搜索问题时,我看到Python 和OpenSSL 都可以选择复制散列对象来达到这个目的:
hash.copy()
返回哈希对象的副本(“克隆”)。这可用于有效计算共享公共初始子字符串的字符串摘要。
EVP_MD_CTX_copy_ex() 可用于从 进出。 如果要散列大量数据,这很有用 仅在最后几个字节不同。 out 必须被初始化 在调用这个函数之前。
尽我所能搜索,我找不到任何与股票 C# HashAlgorithm 可以让我有效地 Clone() == 复制这样的对象之前调用它的 TransformFinalBlock 方法-- 然后继续使用克隆对其余数据进行哈希处理。
我发现了一个C# reference implementation for MD5,它可以很容易地适应支持克隆(*),但我更喜欢使用现有的东西,而不是在代码库中引入这样的东西。
(*) 事实上,据我所知,any 哈希算法(与加密/解密相反)我费心检查是可以复制的,因为这种算法的所有状态都是一种摘要形式。
那么我在这里遗漏了什么还是标准 C#/.NET 接口实际上没有提供复制哈希对象的方法?
另一个数据点:
微软自己的原生 API 用于 crypto services 有一个函数 CryptDuplicateHash,其文档引用:
CryptDuplicateHash 函数可用于创建单独的哈希 以相同内容开头的两个不同内容。
自 Windows XP 以来一直存在。 :-|
请注意。 MD5:用例对密码不敏感。只是可靠的文件校验和。
【问题讨论】:
-
一个问题是它不能轻易克隆,一些类可能使用本机资源或调用带有句柄的专用硬件。那些类型的类不会那么容易克隆。
-
@Scott - 谢谢。是的,我想有些课程可能会。尽管如此,那些不的,比如MD5,应该真的是可克隆的。所以没办法?
-
似乎你甚至想要一个浅拷贝,你必须迭代整个东西并自己创建它。
-
@MartinBa 能否使用 TransformFinalBlock 的返回值(System.Byte[] 一个数组,该数组是输入的哈希部分的副本)手动创建副本?
-
@MartinBa 实际上
MD5Cng和MD5CryptoServiceProvider都调用本机代码。如果 .NET 提供了一个MD5Managed类(类似于AesManaged或RijndaelManaged),它在托管代码中完全实现了该算法,它可能很容易,但你必须去第三方来获得它(比如指向您提供的实施)
标签: c# clone md5 hashalgorithm