【问题标题】:Comparing hash passwords比较哈希密码
【发布时间】:2023-03-29 03:04:01
【问题描述】:

我正在使用 .net 3.5。这里的问题是我似乎无法让密码匹配。我已经尝试在两者上使用 ComputeHash 方法,但它会生成不同的哈希。因为它们现在是数组的大小不同。 (显然它们基于相同的字符串)。我做错了什么? (“密码”是用户输入的 byte[] 参数)

object dataPassword = database.ExecuteScalar("GetUserPassword", new object[] {userName});
if(dataPassword != null && !(dataPassword is DBNull))
{
    SHA1Managed hashProvider = new SHA1Managed();
    byte[] hashedPassword = (byte[])dataPassword;                    
    byte[] hash = hashProvider.ComputeHash(password);
    result = hashedPassword.Equals(hash);

}

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    你不能像这样比较byte[]。它只是比较参考。您应该使用循环或使用IEnumerable<T>.SequenceEqual 扩展方法:

    result = hashedPassword.SequenceEqual(hash);
    

    旧方式(LINQ 之前):

    static bool ArrayEquals<T>(T[] first, T[] second) {
        if (first == null && second == null) return true;
        if (first == null || second == null) return false;
        if (first.Length != second.Length) return false;
        for (int i = 0; i < first.Length; ++i)
           if (first[i] != second[i]) return false;
        return true;
    }
    

    【讨论】:

    • 如何扩展字节以便它可以使用它?
    • @JonasB:你能详细说明一下吗?为什么要扩展任何东西?由于您使用的是 .NET 3.5,因此只需使用 SequenceEquals 行而不是 result = hashedPassword.Equals(hash);。除非您也有其他问题,否则这应该可以解决问题。
    • @Mehrdad:我已经仔细检查了 .NET FW 版本。检查智能感知显示没有 SequenceEquals,并且我收到一个编译器错误,说它在 System.Array 中不存在。
    • @JonasB:你的源文件上面有using System.Linq吗?
    • @Mehrdad:是的,不编译
    【解决方案2】:

    这可能与编码有关。尝试使用UTF8Encoding 类并使用GetBytes 方法对字符串进行编码。

    你也可以看看一组hashing classes I made for password verification at Google Code

    【讨论】:

      【解决方案3】:

      在这两种情况下打印哈希输入的内容。我的意思是打印字节 [],而不是字符串。如果它们匹配,那么哈希也应该匹配。我对 .net 一无所知,但字符串可能有不同的编码,比如使用 ASCII 和另一种 UTF-8?

      【讨论】:

        猜你喜欢
        • 2016-09-13
        • 1970-01-01
        • 2016-09-29
        • 2017-03-01
        • 1970-01-01
        • 2022-01-24
        • 2019-11-11
        • 2021-09-27
        • 1970-01-01
        相关资源
        最近更新 更多