在c#中使用SHA1对字符串进行哈希

本文关键字:字符串 哈希 SHA1 | 更新日期: 2023-09-27 18:08:45

如何在c#中获得相当于网站http://www.sha1-online.com/生成的SHA1 hash

我的示例字符串是

" 20150819100015. test.1002-4-2015.978.gbp "

它的哈希字符串是

"caed6ade209e95ad973cce8def473f1e39e75c0b"

在c#中使用SHA1对字符串进行哈希

注: 更新了我的答案,使其更具体地反映了手头的问题。

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

我在下面做了一个假设,即使用UTF8编码,因此,虽然我下面的示例代码将使用相应的输入生成您在问题中指定的哈希值,但对于其他给定的输入,它可能并不总是产生与http://www.sha1-online.com相同的哈希值。

. net框架提供了SHA1的3个类实现,分别是SHA1Cng, SHA1CryptoServiceProvider和SHA1Managed。

这些实现之间的主要区别在这里讨论了使用哪一个:托管与非托管哈希算法,但我在下面的代码片段中使用了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();
}