代码之家  ›  专栏  ›  技术社区  ›  WebDude

在.NET 4中更改了SHA1CryptoServiceProvider

  •  5
  • WebDude  · 技术社区  · 14 年前

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

    一切都很顺利,所有的代码都编译好了,所有的测试都通过了。

    突然,我的登录不再有效。

    我使用的是SHA1CryptoServiceProvider:

    SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider();
    

    为了进行测试,我创建了一个带有2个控制台应用程序的新visualstudio项目。
    第一个目标是.NETFramework 3.5,第二个目标是.NETFramework 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 回复  |  直到 14 年前
        1
  •  2
  •   WebDude    14 年前

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

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

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

    .Reverse()是可以反转字符串的Linq扩展方法。

    IEnumerable<Char>
    

    对此类型调用.ToString()实际上返回:

    在.NET4.0中执行同样的操作将返回

    System.Linq.Enumerable+d\u a0`1[System.Char]

    因此,我的密码被散列不同。

    byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray()));
    
        2
  •  0
  •   x0n    14 年前

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