代码之家  ›  专栏  ›  技术社区  ›  MaLKaV_eS

如何测试密码学方法

  •  5
  • MaLKaV_eS  · 技术社区  · 15 年前

    我最近遇到了一个加密库的问题,它产生了坏的MD5输出。它返回30,而不是32位数字。

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

    这使我认识到单元测试的真正价值(单元测试先,TDD后)。

    但我不知道如何足够好地测试加密方法。如何获得正确的期望值?

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

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

    4 回复  |  直到 8 年前
        1
  •  21
  •   Rasmus Faber    8 年前

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

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

    MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
    MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
    MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
    MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
    MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
    MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
      = d174ab98d277d9f5a5611c2c9f419d9f
    MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") 
      = 57edf4a22be3c955ac49da2e2107b67a
    
        2
  •  4
  •   Damien MATHIEU    15 年前

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

    assert_equals encode("str"), "341be97d9aff90c9978347f66f945b77"
    

    “str”的编码值应始终为“341be97d9aff90c9978347f66f945b77”。
    如果您的编码返回该值,它会很好地工作。否则,就会有问题。

        3
  •  1
  •   Simon P Stevens    15 年前

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

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

    现在您有了一对具有预期输出的输入数据。

    编写单元测试来传递输入数据,并验证输出是否符合预定的期望。您的输入和期望的输出数据可以作为字符串硬编码到单元测试中(如果您想做很多对,也可以从数据库中读取)。

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

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

        4
  •  0
  •   Kris    15 年前

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

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

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