【问题标题】:Hash test failed because input string is not in a correct format哈希测试失败,因为输入字符串的格式不正确
【发布时间】:2015-08-28 19:02:00
【问题描述】:

我正在测试我在此 article 上找到的一些代码来散列密码,但是在尝试使用以下方法验证密码时:

    /// <summary>
    /// Validates a password given a hash of the correct one.
    /// </summary>
    /// <param name="password">The password to check.</param>
    /// <param name="correctHash">A hash of the correct password.</param>
    /// <returns>True if the password is correct. False otherwise.</returns>
    public static bool ValidatePassword(string password, string correctHash)
    {
        // Extract the parameters from the hash
        char[] delimiter = { ':' };
        string[] split = correctHash.Split(delimiter);
        int iterations = Int32.Parse(split[ITERATION_INDEX]);
        byte[] salt = Convert.FromBase64String(split[SALT_INDEX]);
        byte[] hash = Convert.FromBase64String(split[PBKDF2_INDEX]);

        byte[] testHash = PBKDF2(password, salt, iterations, hash.Length);
        return SlowEquals(hash, testHash);
    }

我收到以下错误:

结果消息:
测试方法 UT.UnitTestUsuario.TestMethodValidatePassword 抛出异常: System.FormatException:输入字符串的格式不正确。

结果堆栈跟踪:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)

在 System.Number.ParseInt32(String s, NumberStyles 样式, NumberFormatInfo 信息) 在 System.Int32.Parse(String s) 在 Entities.PasswordHash.ValidatePassword(String password, String correctHash)

我想通过的测试是这样的:

        [TestMethod]
    public void TestMethodValidatePassword()
    {

        string password = PasswordHash.CreateHash("12345");

        User user = gestor.validateUser("somemail@mail.com", password);

        bool match = PasswordHash.ValidatePassword("12345", user.Password);

        Assert.IsTrue(match);

    }

删除 user.Password 属性并将其替换为从数据库中获取的正确哈希也不起作用。在 User 中,Password 是 String 类型,据我所知,该方法需要一个字符串而不应该有问题。

当我发送“12345”和刚刚散列的密码变量时,测试也通过了。

谁能看到我可能遗漏的东西?

编辑:

我用相同密码的其他用户仔细检查过,hash每次都在变化,例如:

测试 1 将“12345”散列到 1000:XV9IJ3tPys3B6PR

测试 2 个哈希“12345”到 1000:gqry9xl8HKavXvu

用户 1 和 2 具有对应于第一个和第二个测试的密码的数据库条目。一个简单的控制台打印显示数据被完整且正确地提取。

这是否意味着无法实际使用该方法来比较密码?

【问题讨论】:

  • Wellllll int32 解析失败。在解析之前尝试调试和/或写出值,看看是否以错误的格式给出了某些内容。然后您可能必须返回该密码的来源以查看问题是否存在。就目前而言,我认为我们没有足够的代码来深入分析它。
  • @benKnoble 我已经尝试写入密码的值,我还检查了存储的哈希是否正确以及 user.Password 的值是否正确
  • 你的哈希方法可能不正确吗?
  • @BenKnoble 似乎很可能,每次我对相同的密码进行哈希处理都会产生不同的结果,我对此主题了解不多,但我很确定这使得无法比较。
  • 好吧,一个具有 5000000 个不同哈希值的字符串可以是其中任何一个。我不确定哈希算法应该是多么精确,但我假设它们必须只产生一个哈希。否则它更像是一个哈希码,它有冲突和东西。身份证。

标签: c# hash


【解决方案1】:

你的问题是你的user.Password 没有返回与你从PasswordHash.CreateHash 收到的相同的值。难怪它不能被验证——它无效的。您需要找出为什么它没有返回正确的值并修复它。

也不必担心哈希值每次都不同。如果您花时间真正阅读和理解您链接的文章,这就是重点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2022-01-23
    • 2013-08-22
    相关资源
    最近更新 更多