Cryptography 在.NET 4中更改了SHA1CryptoServiceProvider

Cryptography 在.NET 4中更改了SHA1CryptoServiceProvider,cryptography,.net-4.0,sha1,Cryptography,.net 4.0,Sha1,我目前正在尝试将我的一个项目从.NET3.5升级到.NET4.0 一切都进行得非常顺利,所有代码都已编译,所有测试都已通过。 然后,在部署到暂存环境时遇到问题。 突然,我的登录不再有效 似乎我的SHA1哈希密码在.NET4中的哈希方式有所不同 我正在使用SHA1CryptoServiceProvider: SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 为了进行测试,我创建了一个新的

我目前正在尝试将我的一个项目从.NET3.5升级到.NET4.0

一切都进行得非常顺利,所有代码都已编译,所有测试都已通过。
然后,在部署到暂存环境时遇到问题。
突然,我的登录不再有效

似乎我的SHA1哈希密码在.NET4中的哈希方式有所不同

我正在使用SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider();
为了进行测试,我创建了一个新的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;
    }
}

听起来可能是字符编码问题。确保要散列的字符串是您期望的编码[utf8、ansi等](如果是,请确保旧环境也是如此。)


-Oisin

其中一条评论引导我在代码中找到了bug。
在创建要散列的字节数组时,我试图用字符串本身的反向版本附加该字符串

例如,给定hash的“password”,我实际上会hash“passworddrowssap”

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

byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
.Reverse()是可以反转字符串的Linq扩展方法。
但是,它不返回字符串,而是返回:

IEnumerable<Char>

可能重复的--solution includeX这与实际情况不同。这与FormsAuthenticationCookies和ViewState有关,只是“如果您运行混合ASP.NET 2.0/ASP.NET 4”时的问题。但该死,我以为这是我的解决方案,你能澄清一下AsymetricHash/Hash的混乱吗?为了安全,亨克,你解决了我的问题。Reverse是一个Linq函数,用于反转字符串。但是,它返回一个IEnumerable。尝试调用“StringValue”.Reverse().ToString()只返回类型名。由于.NET3.5和.NET4.0中的类型名称不同,所以我得到了不同的散列值。对不起.NET4.0,您一直做得很好。谢谢大家的帮助。你应该检查你的用户数据库,确保你没有把它搞砸:D每个人可能都有相同的哈希…:我一直在使用Encoding.Default。我尝试指定一种编码,但以下各项都不起作用:Encoding.ASCII、Encoding.bigendianucode、Encoding.Unicode、Encoding.UTF32、Encoding.UTF7、Encoding.utf8哈希在字节流级别工作-我不确定您是否理解我的意思。您在哪里指定编码?重要的是两个系统都被验证为向sha1类提供相同的字节。请参阅我调用的代码示例。这两个站点运行在完全相同的服务器上,因此我不确定编码将在哪里更改。如何验证两个系统向sha1类提供的字节是否相同?根据我上面的代码示例,我是否可以只检查buffer.Length?Encoding.Default在每个系统上可能不同(而您的用户哈希值显然是不变的)。在每个系统上使用简单的控制台应用程序(或使用powershell)验证默认编码。我的默认编码是windows-1252;其他人的可能不同。(顺便说一句,如果散列是不同的-你必须假设字节流是不同的。sha1算法在不同的框架之间没有变化)
byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray()));