C# 如何使用TDD(测试优先)实现密码哈希?

C# 如何使用TDD(测试优先)实现密码哈希?,c#,unit-testing,language-agnostic,hash,tdd,C#,Unit Testing,Language Agnostic,Hash,Tdd,我有点自相矛盾 在构建实现之前,我尝试使用TDD为我的密码散列方法构建测试。但我不知道如何事先提出预期值,而不首先构建实现 当然,通过简单的哈希实现,我可能会找到一个基于已知密码/salt创建期望值的站点 我打赌解决方案是对TDD破例,放弃先构建测试。相反,构建我的实现以获得适当的salt/hash值,然后根据这些值构建测试以防止回归 但我想我会发布这篇文章,看看是否有我没有想到的解决方案 或者,可能有人可以在他们的头脑中生成哈希,以便首先构建测试。因此,在进行TDD时,基本上您应该知道“预期”

我有点自相矛盾

在构建实现之前,我尝试使用TDD为我的密码散列方法构建测试。但我不知道如何事先提出预期值,而不首先构建实现

当然,通过简单的哈希实现,我可能会找到一个基于已知密码/salt创建期望值的站点

我打赌解决方案是对TDD破例,放弃先构建测试。相反,构建我的实现以获得适当的salt/hash值,然后根据这些值构建测试以防止回归

但我想我会发布这篇文章,看看是否有我没有想到的解决方案


或者,可能有人可以在他们的头脑中生成哈希,以便首先构建测试。

因此,在进行TDD时,基本上您应该知道“预期”输出。在您的例子中,预期的输出是散列函数的结果

如果您正在实现已知的哈希算法,那么从他们的站点获取测试结果或手动生成测试结果都不是问题


如果您正在开发自己的算法。您还应该通过实现算法实现的原型来了解预期的输出。即使您不知道它们是否正确,您也只是假设它们正确,并在测试中使用值。如果更改了哈希函数的实现,这些测试将变为红色。

我不知道您是否正在编写自己的哈希函数,如sha-1(在本例中,请不要这样做),或者您正在使用外部哈希和随机函数生成salt等。在第二种情况下,您不必知道输出。您只需模拟您的哈希和随机提供程序,并检查它们是否在您的输入和/或部分结果中被调用

您打算发明一种新的哈希算法吗?如果没有,你可以使用“现有技术”来计算这些数据。很多事情都需要对密码进行哈希运算。例如,许多人使用:一些随机生成的值存储w/user+一些静态编译文本值+密码。然后,当使用RFC2898时,哈希可以根据迭代次数进行更改。如果这些变量中的任何一个发生变化,身份验证就会中断(因此,单元测试也应该中断)。如果你不能先编写测试,你怎么知道你编写的代码是正确的呢?你会接受“正确”的意思是“不管这个算法的第一个版本产生了什么”?这里没有其他的正确性标准可以用来编写测试吗?你会说你什么时候解决了这个问题?这些测试只是对“需要做什么”的可执行的重新表述。因此,像函数这样的规范应该为一组n个输入生成唯一的哈希值&在0.5秒内运行可以作为一个自动测试来编写,以启动。。。你怎么做是“内在的”,只要测试没有中断,就可以根据口味进行调整。这实际上是我最终采用的方法,只是从来没有跟进过。