我遇到了一个有趣的问题..似乎ComputeHash()对于"HMACSHA256"哈希不是确定性的行为..如果我使用HashAlgorithm.Create("HMACSHA256")创建两个HashAlgorithm实例..并运行ComputeHash,我得到两个不同的结果..下面是一个展示这种行为的示例静态类.
internal static string HashPassword(byte[] bAll)
{
using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
{
return Convert.ToBase64String(s.ComputeHash(bAll));
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试使调用非静态(实际上它开始非静态,我有双重和三重四重四重检查我的输入数组..它在每次调用时绝对相同..我甚至在immidiate中做过的事情窗口像:
Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)
Run Code Online (Sandbox Code Playgroud)
并通过方法中的断点在immidiates窗口中运行两次返回两个不同的哈希值.
我知道哈希被认为是确定性的.那么是什么给出了什么呢?在调试器中运行是怎么回事?还是其他任何想法?真的,现在这只是两个奇怪的词:-P ..
谢谢乔希
我有以下用例:
增量散列文件不是问题,只需调用TransformBlock和TransformFinalBlock.
问题是我需要多个哈希的数据共享它的起始字节,但在我调用TransformFinalBlock读取Hash第一个n字节后,我不能继续使用相同的对象进行哈希并需要一个新的字节.
在搜索问题时,我发现Python和OpenSSL都可以选择复制散列对象,以实现此目的:
hash.copy()
返回哈希对象的副本("克隆").这可以用于有效地计算共享公共初始子字符串的字符串的摘要.
EVP_MD_CTX_copy_ex()可用于将消息摘要状态从in复制到out.如果要散列的大量数据仅在最后几个字节中有所不同,这非常有用.必须在调用此函数之前初始化out.
正如我可能搜索的那样,我找不到任何包含库存C#HashAlgorithm的东西,它允许我在调用它的方法之前有效地Clone()= =复制这样的对象- 然后继续用克隆散列其余的数据.TransformFinalBlock
我找到了一个MD5的C#参考实现,可以简单地适应支持克隆(*),但是我更倾向于使用那些而不是将这样的东西引入代码库.
(*)实际上,据我所知,任何哈希算法(与加密/解密相反)我都很难检查,因为这种算法所具有的所有状态都是一种摘要形式.
所以我在这里遗漏了一些东西,或者标准的C#/ .NET接口实际上是不是提供了复制哈希对象的方法?
另一个数据点:
微软自己的加密服务原生API 有一个功能CryptDuplicateHash,其中的文档状态,引用:
CryptDuplicateHash函数可用于创建以相同内容开头的两个不同内容的单独哈希.
自Windows XP以来一直存在.: - |
注意wrt.MD5:用例不具有加密敏感性.只是可靠的文件校验和.
从HashAlgorithm派生的对象(如MD5CryptoServiceProvider)具有Dispose()方法,但它是私有的.相反,它有一个Clear()方法,它"释放它所使用的所有资源".
WTF?
这是如何正确处理HashAlgorithm的呢?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
Run Code Online (Sandbox Code Playgroud)
有人想向我解释这个吗?:)
我是一名PHP开发人员,并且在C#中有点偏离我的元素.在PHP中,有一个crc32()函数,它为您传入的任何字符串返回有符号整数.
所以这就是我习惯的:
<?php
echo crc32("test");
// displays -662733300
Run Code Online (Sandbox Code Playgroud)
我想在C#中做同样的事情.我遇到了这个C#类库,但对它几乎一无所知.根据他的指示,我应该这样做:
// first convert string to byte-array
String input = "test";
byte[] bytes = new byte[input.length * sizeof(char)];
System.Buffer.BlockCopy(input.ToCharArray(), 0, bytes, 0, bytes.Length);
// then calculate the value
Crc32 crc32 = new Crc32();
String output = "";
foreach (byte b in crc32.ComputeHash(bytes))
{
output += b.ToString("x2").ToLower();
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个输出字符串27d86d6a.我需要做什么来返回有符号整数?(在这个例子中应该相同-662733300)
我试图了解散列算法的工作原理,特别是SHA3-512.为了了解它是如何工作的,我在Google中搜索了代码并遇到了Hashlib.代码不起作用,因为我没有Hashlib库(不确定应该调用它).我怎样才能得到它,这是在C#中应用SHA3-512的唯一方法吗?
我想知道一些基本的东西,
什么是Hashlib?
它是图书馆吗?
是的输出结果/工作流程/功能Hashlib和System.Security.Cryptography.HashAlgorithm一样吗?如果没有,那么它们之间有什么区别?
编辑:很抱歉从中间删除几个问题.因为我觉得他们不再需要在这里展示了.