[英]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.