gpt4 book ai didi

cryptography - SHA1CryptoServiceProvider 已在 .NET 4 中更改

转载 作者:行者123 更新时间:2023-12-04 04:54:35 25 4
gpt4 key购买 nike

我目前正在尝试将我的一个项目从 .NET 3.5 升级到 .NET 4.0

一切都很顺利,所有代码都编译通过,所有测试都通过了。
然后我在部署到我的临时环境时遇到了问题。
突然间,我的登录名不再有效。

似乎我的 SHA1 散列密码在 .NET 4 中以不同方式散列。

我正在使用 SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider();

为了进行测试,我创建了一个带有 2 个控制台应用程序的新 Visual Studio 项目。
第一个针对 .NET Framework 3.5,第二个针对 4.0。
我在两者中运行了完全相同的散列代码,并产生了不同的结果。

为什么会发生这种情况,我该如何解决?
考虑到我不知道它们是什么,我显然无法更新我所有的用户密码。

任何帮助将不胜感激。

代码示例
public static class SHA1Hash
{

public static string Hash(string stringToHash)
{
return (Hash(stringToHash, Encoding.Default));
}

public static string Hash(string stringToHash, Encoding enc)
{
byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse());
var cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer));
return hash;
}
}

最佳答案

其中一条评论让我找到了代码中的错误。
创建要散列的字节数组时,我试图将字符串附加到其自身的反向版本。

例如。给“密码”散列我实际上会散列“passworddrowssap”

但是我的代码有一个小错误:

byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 

.Reverse() 是一个可以反转字符串的 Linq 扩展方法。
但是它不返回字符串,它返回:
IEnumerable<Char>

在这种类型上调用 .ToString() 实际上返回:

System.Linq.Enumerable+d__99`1[System.Char]



在 .NET 4.0 中做同样的事情会返回

System.Linq.Enumerable+d__a0`1[System.Char]



因此我的密码被不同地散列。
我应该做的由字节数组创建的是:
byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray()));

关于cryptography - SHA1CryptoServiceProvider 已在 .NET 4 中更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com