【发布时间】:2010-05-31 20:40:39
【问题描述】:
我目前正在尝试将我的一个项目从 .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;
}
}
【问题讨论】:
-
Login fails after upgrade to ASP.net 4.0 from 3.5 的可能重复项——包括解决方案
-
不幸的是,情况并非如此。这是关于 FormsAuthenticationCookies 和 ViewState 的,只是“如果您运行混合的 ASP.NET 2.0/ASP.NET 4”的问题。但是当我认为这是我的解决方案
-
你能解决 AsymetricHash/Hash 的混淆吗?只是为了安全。
-
Henk,你在这里解决了我的问题。 String.Reverse 是一个反转字符串的 Linq 函数。然而,它返回一个 IEnumerable
。尝试调用 "StringValue".Reverse().ToString() 只会返回类型名称。由于这些在 .NET 3.5 和 .NET 4.0 中的类型名称不同,因此我得到了不同的散列值。对不起.NET 4.0,你一直做得很好。感谢大家的帮助 -
呃。你应该检查你的用户数据库以确保你没有搞砸它:D每个人都可能有相同的哈希......:D
标签: cryptography .net-4.0 sha1