c# - SHA1(c#) - 与 .Net 3 和 .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"
}
}
推荐阅读
- python - 如何从熊猫数据框中制作字典?
- sql - 根据我的理解,当两者实际上服务于相同目的时,主键与唯一键有何不同?
- rabbitmq - 工人可以根据主题消费吗?
- c# - 使用方法的BMI计算器
- dump - 从 STM8 微控制器转储固件
- postgresql - 在 postgresql 等级上的每个组上获取不同的 LIMIT
- django - (内部错误)Ngnix + uwsgi +django:没有名为 django 的模块
- javascript - 基于具有新索引的数组对 JS 数组进行排序
- node.js - 如何在 NodeJS 中的字符串构造函数上设置全局属性?
- javascript - React 中 TypeScript 中的事件类型