在C#中使用SHA1来散列字符串

时间:2015-08-19 09:48:20

标签: c# sha1

如何使C#中的SHA1 hash等同于网站http://www.sha1-online.com/

生成的ClassA

我的示例字符串是

  

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

其哈希字符串是

  

“caed6ade209e95ad973cce8def473f1e39e75c0b”

1 个答案:

答案 0 :(得分:2)

注意: 更新了我的回答,以便在回复评论时更具体地针对手头的问题。

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

我在下面假设使用的是UTF8编码,所以虽然下面的示例代码会生成您在问题中指定的带有相应输入的哈希,但它可能并不总是产生与{{{ 3}}用于其他给定的输入。

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

这些实现之间的主要区别在这里被讨论http://www.sha1-online.com,但我已经习惯了下面的代码片段中的SHA1Managed,因为它完全在托管代码中实现,所以虽然速度较慢,但​​应该更加便携到不同的平台。

散列的输出也是一个字节数组,因此要将散列转换为文本表示,我已将字节转换为十六进制表示并连接起来,因为这似乎是Which one to use: Managed vs. NonManaged hashing algorithms选择的表示形式使用。

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();
}