我最近遇到了一个加密库的问题,它产生了错误的md5输出。而不是32位数,它返回30。
由于我们不使用单元测试,这个问题很难解决...因为我们假设md5字符串是正确的,并在其他地方寻找错误。
这让我意识到单元测试的真正价值(首先是单元测试,之后是tdd)。
但我不确定如何充分测试加密方法。你如何得到适当的期望值?
编辑:感谢您的回答,我想我没有解释清楚。
问题在于第三方工具产生了糟糕的md5输出。那么,你如何获得断言价值?我知道它一定不能改变,只是我不知道如何从可靠的来源获得它。
答案 0 :(得分:22)
加密算法的已知正确数据通常称为测试向量。因此谷歌“MD5测试向量”可以为您的测试获得大量良好的输入数据。
测试向量的最权威资源当然是定义算法的文档。大多数标准文件将包括一组测试向量。例如,RFC 1321包含以下一组测试数据:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
= d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890")
= 57edf4a22be3c955ac49da2e2107b67a
答案 1 :(得分:4)
编码的MD5将始终具有相同的值。因此,您可以通过编码字符串来执行断言,并且您知道的值是合适的。
assert_equals encode("str"), "341be97d9aff90c9978347f66f945b77"
“str”的编码值应始终为“341be97d9aff90c9978347f66f945b77”。
如果您的编码返回该值,则效果很好。否则,就会出现问题。
答案 2 :(得分:1)
单元测试的基本前提是运行一个包含一些数据的方法,事先知道输出是什么。
因此,要测试加密方法,您需要生成一些匹配的输入和输出数据对。拿一个数据字符串,说“这是一些测试数据”。使用第三方加密工具或库对其进行加密,以获得“Guvf vf fbzr grfg qngn”。
现在你有一对带有预期输出的输入数据。
编写单元测试以传入输入数据,并验证输出是否符合您预期的预期。您的输入和预期输出数据可以作为字符串硬编码到单元测试中(如果您想要进行大量配对,则可以从数据库中读取)。
与一般编程最佳实践相反,通常认为仅使用预定的,计划的和可重复的数据运行单元测试是一种好的做法。使用随机生成的字符串运行单元测试被认为是不好的做法,因为这意味着您的单元测试不可重复。
显然,MD5方法的理论是相同的,只需获取一些样本数据,通过第三方MD5哈希工具运行它,然后使用输入/输出数据对来验证您的方法是否提供了正确的输出。 / p>
答案 3 :(得分:0)
正如其他人已经提到的,发布的测试向量或已发布的参考实现应该是可靠测试值的良好来源。
我还想补充一点:如果可能的话请不要使用MD5。已经存在很多已知的安全问题,维护与旧系统的兼容性是唯一的有人想在新代码中使用它。
如果可以,请使用SHA-256(在FIPS-180-2中定义,包括一组测试向量)。如果您不需要256位哈希值,将其截断为128,那么您将拥有更安全的MD5替代方案。