Unit testing 如何测试加密方法

Unit testing 如何测试加密方法,unit-testing,cryptography,Unit Testing,Cryptography,我最近遇到了一个加密库的问题,它会产生糟糕的md5输出。它返回的不是32位,而是30位 由于我们不使用单元测试,这个问题很难解决。。。因为我们假设md5字符串是正确的,并在其他地方查找bug 这使我认识到单元测试的真正价值(首先是单元测试,然后是tdd) 但我不确定如何充分测试加密方法。如何获得适当的期望值 编辑:谢谢你的回答,我想我解释得不够 问题在于第三方工具产生了糟糕的md5输出。那么,如何获得断言值呢?我知道它不能改变,只是我不知道如何从可靠的来源获得它 编码的MD5将始终具有相同的值。

我最近遇到了一个加密库的问题,它会产生糟糕的md5输出。它返回的不是32位,而是30位

由于我们不使用单元测试,这个问题很难解决。。。因为我们假设md5字符串是正确的,并在其他地方查找bug

这使我认识到单元测试的真正价值(首先是单元测试,然后是tdd)

但我不确定如何充分测试加密方法。如何获得适当的期望值

编辑:谢谢你的回答,我想我解释得不够


问题在于第三方工具产生了糟糕的md5输出。那么,如何获得断言值呢?我知道它不能改变,只是我不知道如何从可靠的来源获得它

编码的MD5将始终具有相同的值。因此,您可以通过对字符串进行编码来执行断言,并且您知道的值是合适的

assert_equals encode("str"), "341be97d9aff90c9978347f66f945b77"
“str”的编码值应始终为“341BE97D9AF90C9978347F66F945B77”。

如果编码返回该值,则效果良好。否则,就有问题了。

单元测试的基本前提是使用一些数据运行一个方法,在这个方法中,您预先知道输出将是什么

因此,要测试加密方法,您需要生成一些匹配的输入和输出数据对。取一个数据字符串,说“这是一些测试数据”。使用第三方加密工具或库对其进行加密,以获得“Guvf vf fbzr grfg qngn”

现在您有了一对输入数据及其预期输出

编写单元测试以通过输入数据,并验证输出是否符合预定的预期。您的输入和预期的输出数据可以作为字符串硬编码到单元测试中(如果您想进行大量成对测试,也可以从数据库中读取)

与一般的编程最佳实践相反,通常认为只使用预定的、计划的和可重复的数据运行单元测试是一种好的实践。使用随机生成的字符串运行单元测试被认为是不好的做法,因为这意味着单元测试不可重复


显然,MD5方法的原理是相同的,只需获取一些样本数据,通过第三方MD5哈希工具运行它,然后使用输入/输出数据对验证您的方法是否给出了正确的输出。

已知的加密算法正确数据通常称为测试向量。所以谷歌“MD5测试向量”可以为你的测试获取大量好的输入数据

测试向量最权威的资源当然是定义算法的文档。大多数标准文件将包括一组测试向量。例如,包含以下一组测试数据:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
  = d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") 
  = 57edf4a22be3c955ac49da2e2107b67a

正如其他人已经提到的,发布的测试向量或发布的参考实现应该是可靠测试值的良好来源

我还想补充一点:如果可能的话,请不要使用MD5。MD5已经存在很多已知的安全问题,因此要在新代码中使用它,唯一的原因就是要保持与某些旧系统的兼容性


如果可以,请使用SHA-256(在中定义,包括一组测试向量)。如果您不需要256位的散列,请将其截断为128位,您将有一个更安全的MD5替代方案。

Ralph可以计算基本MD5或sha:请记住,加密软件可能会以您不容易检测到的方式失败。如果您必须测试第三方软件的准确性,请不要重复,不要将其用于任何您真正希望保持安全的内容。如果您丢弃了一半的散列结果,您不是大大增加了散列冲突的可能性吗?为什么我在上一个案例MD5中得到了不同的结果(“123456789012345671345678901234567890123456789012345678901234567890123456789012345678901234567890”)我得到了另一个哈希,它是b0dbf7a0bfd6a153ccfc2bf78b501aff,可能是因为\n@umitems格式设置在6和7之间插入了一个空格。测试向量中不应该有空格(或新行)。我已经修复了格式设置以避免混淆。