我目前正在尝试将我的项目从.NET 3.5升级到.NET 4.0
一切都很顺利,所有代码都编译好,所有测试都通过了 然后我遇到了部署到我的临时环境的问题 突然,我的登录不再有效了。
在.NET 4中,我的SHA1哈希密码似乎有所不同。
我正在使用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;
}
}
答案 0 :(得分:2)
其中一条评论让我发现了我的代码中的错误 在创建要进行哈希处理的字节数组时,我试图用自身的反转版本附加字符串。
E.g。给“哈希”密码我实际上会哈希“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()));
答案 1 :(得分:0)
听起来可能是字符编码问题。确保被散列的字符串在您期望的编码[utf8,ansi等]中(如果是,请确保旧环境也是如此。)
-Oisin