簡體   English   中英

SHA1(c#) - 與 .Net 3 和 .Net Core 不同的結果

[英]SHA1(c#) - different result from .Net 3 and .Net Core

我在數據庫中有哈希值。 這是在 Asp Web Form(可能是 .Net 3)中創建的。 這是舊代碼:

string hash = SHA1(SHA1(pass.Trim() + number.Trim()));

這些是數據示例:

 pass = AGent24022 
 number = 24022
 hash = 2cdfaec91e938eaa7f432fd606745c23399cc3b8

我需要從 Asp Net Core 中的這些數據生成這個哈希。 但我無法得到這個值。 這些是我的一些實現的示例。

 //1
    static string Hash2(string input)
    {
      return string.Join("",SHA1CryptoServiceProvider.Create().ComputeHash(Encoding.UTF8.GetBytes(input)).Select(x => 
     x.ToString("x2")));
    }
 
       //2
     static string Hash1(string input){ 
      using (var sha1 = new SHA1Managed())
      {
           return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(input)));
      }
    }

        //3
        static string Hash0(string input)
        {
            var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
            return string.Concat(hash.Select(b => b.ToString("x2")));
        }

這是我的用途:

 string input = pass.Trim() + number.Trim();
 var res = Hash0(Hash0(input);
 //var res = Hash1(Hash1(input);
 //var res = Hash2(Hash2(input);
 

也許原因是實現方式的改變。 任何建議,我將不勝感激。

.NET 字符串默認為 UTF-16,因此在舊實現中會使用該字符串。

如果您采用Hash2實現並將Encoding.UTF8更改為Encoding.Unicode (編碼為 UTF-16),那么它應該可以工作。

class Program
{
    static string Hash(string input)
    {
        using (var sha1 = new SHA1Managed())
        {
            return string.Join("", SHA1CryptoServiceProvider.Create().ComputeHash(Encoding.Unicode.GetBytes(input)).Select(x => x.ToString("x2")));
        }
    }

    static void Main(string[] args)
    {
        var result = Hash(Hash("AGent2402224022"));
        Console.Write(result); // outputs "2cdfaec91e938eaa7f432fd606745c23399cc3b8"
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM