2015-08-19 64 views
-4

我怎样才能获得SHA1 hash在C#中相当于通过现场制作http://www.sha1-online.com/在C#中使用SHA1哈希计算字符串

我的样本串

“20150819100015.test.1002-4-2015.978.GBP”

其散列字符串

“caed6ade209e95ad973 cce8def473f1e39e75c0b”

+1

请勿使用SHA-1。它被打破了,走开了。 –

+0

@Fred肯定,但有时您需要与传统或维护不当的系统进行交互。 – CodeCaster

+0

@CodeCaster,true。只是警告,以防万一。 –

回答

1

注:更新我的回答更具体手头反射后到的意见的问题。

哈希值是字节数组上的计算机,由于字符串的字节数组表示形式取决于您使用的文本编码,因此可能无法回答您的问题。这是因为我们不确切知道http://www.sha1-online.com使用哪种文本编码。

我在下面做了一个假设,那就是使用UTF8编码,所以虽然我的示例代码将在相应的输入中产生您在问题中指定的散列,但它可能并不总是产生与其他散列相同的散列http://www.sha1-online.com给定输入。

.NET Framework提供了SHA1的3个类实现,即SHA1Cng,SHA1CryptoServiceProvider和SHA1Managed。

这些实现之间的主要区别在这里讨论Which one to use: Managed vs. NonManaged hashing algorithms,但我已经习惯了SHA1Managed在下面的代码片段中,因为它完全在托管代码中实现,所以尽管速度较慢,但​​应该可能更容易移植到不同的平台。

散列的输出也是一个字节数组,因此把散列成文本表示我已转换的字节,以它们的十六进制表示,然后连接起来它们作为这似乎是http://www.sha1-online.com选择使用的表述。

static void Main(string[] args) 
{ 
    var sha1 = new System.Security.Cryptography.SHA1Managed(); 
    var plaintextBytes = Encoding.UTF8.GetBytes("20150819100015.test.1002-4-2015.978.GBP"); 
    var hashBytes = sha1.ComputeHash(plaintextBytes); 

    var sb = new StringBuilder(); 
    foreach (var hashByte in hashBytes) 
    { 
     sb.AppendFormat("{0:x2}", hashByte); 
    } 

    var hashString = sb.ToString(); 
} 
+1

这个答案有什么不对?如果没有留下评论为什么它没有用,请不要投票。 – DanL

+1

“这里,我写了你的代码”没有任何解释就没有被认为是一个很好的答案。 – CodeCaster

+0

Ops的问题是“我怎样才能在C#中获得相当于由网站生成的SHA1哈希”。正如你建议的“在这里,我写了你的代码”不是一个好方法,但它并不会使这种方法失效。我相信我的方法是有保证的,因为它是一个相对简单的任务,而操作系统是语言特定的,所以这样一个简单的代码片段就能满足所需的目的。 如果Op自己尝试了一些东西,但没有得到相同的答案(例如,因为他使用了错误的编码),那么我的答案就有理由作出解释。但简明性很有用。 – DanL