在.NET 4中更改了SHA1CryptoServiceProvider

时间:2010-05-31 20:40:39

标签: cryptography .net-4.0 sha1

我目前正在尝试将我的项目从.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;
    }
}

2 个答案:

答案 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