哈希在这里有什么问题?

时间:2018-06-24 01:56:32

标签: c# cryptography

我创建此单元测试是为了注意到一个奇怪的行为,请您帮忙这里发生的事情吗? 请注意,第二个数组还有一个元素。

 [Fact]
        public void Should_Have_Different_Values()
        {
            byte[] saltedPasswordBytes = new byte[]{5,18,99,52,68,25,32 };
            string hashedPassword1, hashedPassword2;
            using (var sha256 = SHA256.Create())
            {
                hashedPassword1= sha256.ComputeHash(saltedPasswordBytes, 0, 3).ToBase64String();
            }

        saltedPasswordBytes = new byte[] { 5, 18, 99, 52, 68, 25, 32 ,50};
        using (var sha256 = SHA256.Create())
        {
            hashedPassword2 = sha256.ComputeHash(saltedPasswordBytes, 0, 3).ToBase64String();
        }
        Assert.NotEqual(hashedPassword1, hashedPassword2);
    }

我不确定我在哪里弄错了,但是我正在使用它来哈希我的数据,并且看起来无论盐如何它都会返回相同的值。 我做错什么了吗?或哈希未实现或什么?因为Rfc2898DeriveBytes运作良好。

1 个答案:

答案 0 :(得分:6)

不,SHA256实现(在.NET Core / .NET / Mono中)不是“残破的”。通常,不能有效地利用时间来假设数以百万计的人依赖的图书馆已损坏,并且在出现问题时最好避免使用这种单击诱饵标题或“断言”。

问题是您的代码已损坏。

请参阅HashAlgorithm.ComputeHash的文档:

  

计算指定字节数组指定区域的哈希值。

在这种情况下,ComputeHash(dontCare, 0, 3)仅计算数据的前3个字节的哈希。在示例代码中,两个“盐”的前三个字节相同。因此,结果预期相同。

此外,显示的数据并不代表“盐”。在实施密码/安全性之前刷新一下可能会很好。最好使用现有/经过测试的库。

相关问题