c# - 带有 Rfc2898DeriveBytes 的 PBKDF2 为相同的输入产生不同的输出?

标签 c# .net cryptography pbkdf2

我的印象是,基于密码的 key 派生函数的要点是每次都以相同的方式从密码生成加密安全 key 流,因此可以依赖它们从密码生成加密 key 。

根据我在网上阅读的内容,包括 stack overflow ,这似乎是预期用途。

因此,当我为我认为相同的输入生成不同输出时,我假设我使用错误。为了对此进行测试,我为 Rfc2898DeriveBytes 编写了一个测试用例,按照文档建议的方式使用它。

[TestMethod]
public void PBKDF2_Works() {
    var salt = new byte[] { 0x01, 0x01, 0x02, 0x03, 0x05, 0x08, 0x0D, 0x15 };
    var password = "password";
    var iterations = 1000;
    var len = 48;

    var gen1 = new Rfc2898DeriveBytes(password, salt, iterations);
    var gen2 = new Rfc2898DeriveBytes(password, salt, iterations);

    var bytes1 = gen1.GetBytes(len);
    var bytes2 = gen2.GetBytes(len);
    Assert.AreEqual(bytes1, bytes2);
}

这个测试用例失败了,我不知道为什么。我是在误用该功能,还是误解了它的用途?

编辑:好的,上面的测试方法是一个有缺陷的测试,因为我没有使用断言的集合形式。我认为 AreEqual 会在参数上调用 .Equals,并且对于将要实现以比较内容的集合。

我遇到的问题是,我认为 Rfc2898DeriveBytes 的相同参数会为相同的输入产生不同的输出,但输入却略有不同:

我生成了一个16字节的salt存入数据库,但是由于字段长度的原因,当取回salt进行解密的时候,前16个字节是一样的(所以我以为是使用相同的信息)但是这些后面跟着另外 48 个字节的 0,因此输入不同。

最佳答案

MSTest 的 Assert.AreEqual 通常会对集合进行引用相等性比较(除非它是覆盖 Equals 的自定义集合),这通常不是您想要的。尝试使用 CollectionAssert.AreEqual

关于c# - 带有 Rfc2898DeriveBytes 的 PBKDF2 为相同的输入产生不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062558/

相关文章:

c# - 如何为Windows应用程序创建.exe文件

c# - 尝试将装箱的 int 转换为 byte

C#:生成唯一文件名的最快方法是什么?

c# - C#.Net 和 Oracle 加密结果不同

php - Node.js 和 sha1

c# - 是否有很好的教程或示例显示 protobuf-net 和 zeromq 的组合?

c# - 获取 tcp 套接字序列号和 ack 号

c# - 使用 NLog 或 Serilog 时 .NET Core 3.0 应用程序中的内存泄漏

c# - 动态加载 DLL 时 DLL 加载的应用程序特定路径

c# - 我有错误的哈希值? C#密码学