Как проверить методы криптографии - PullRequest
5 голосов
/ 28 октября 2009

Недавно у меня возникла проблема с криптографической библиотекой, которая выдает некорректный вывод md5. Вместо 32 цифр возвращается 30.

Поскольку мы не используем модульный тест, решить эту проблему было головной болью ... потому что мы предполагали, что строка md5 была правильной, и искали ошибки в других местах.

Это заставляет меня осознать реальную ценность модульных тестов (сначала тестовый модуль, потом - тдд).

Но я не уверен, как достаточно хорошо протестировать криптографические методы. Как получить правильные ожидаемые значения?

РЕДАКТИРОВАТЬ: Спасибо за ответы, я думаю, что я не объяснил это достаточно.

Проблема была со сторонним инструментом, который выдает плохой вывод md5. Тогда как вы получите это значение? Я знаю, что это не должно измениться, просто я не понимаю, как получить его из надежного источника.

Ответы [ 4 ]

22 голосов
/ 29 октября 2009

Известные правильные данные для криптографических алгоритмов обычно называют тестовыми векторами . Таким образом, Google "векторы тестов MD5", чтобы получить массу хороших входных данных для ваших тестов.

Самым авторитетным ресурсом для векторов испытаний является, конечно, документ, определяющий алгоритм. Большинство стандартных документов будут включать набор тестовых векторов. Например, RFC 1321 содержит следующий набор тестовых данных:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
  = d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") 
  = 57edf4a22be3c955ac49da2e2107b67a
4 голосов
/ 28 октября 2009

Закодированный MD5 всегда будет иметь одинаковое значение. Таким образом, вы можете сделать утверждение с помощью кодирования строки и соответствующего значения, которое вы знаете.

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

Кодированное значение "str" ​​всегда должно быть "341be97d9aff90c9978347f66f945b77".
Если ваша кодировка возвращает это значение, оно работает хорошо. В противном случае есть проблема.

1 голос
/ 28 октября 2009

Основная предпосылка модульного тестирования - запустить метод с некоторыми данными, в котором вы заранее знаете, каким будет результат.

Таким образом, чтобы протестировать метод шифрования, вам нужно сгенерировать несколько совпадающих пар входных и выходных данных. Возьмите строку данных, скажите «Это некоторые тестовые данные». Зашифруйте его, используя стороннее средство шифрования или библиотеку, чтобы получить «Guvf vf fbzr grfg qngn».

Теперь у вас есть пара входных данных с ожидаемым результатом.

Напишите свой модульный тест, чтобы передать входные данные, и проверьте, что выходные данные соответствуют вашему заранее заданному ожиданию. Ваши входные и ожидаемые выходные данные могут быть жестко запрограммированы в модульном тесте в виде строк (или считаны из базы данных, если вы хотите выполнить много пар).

Вопреки общепринятым методам программирования, обычно считается хорошей практикой запускать только модульные тесты с заранее определенными, запланированными и повторяемыми данными. Запуск модульных тестов со случайно сгенерированными строками считается плохой практикой, потому что это означает, что ваши модульные тесты не повторяются.

Очевидно, что та же теория для метода MD5, просто возьмите некоторые примерные данные, запустите их через сторонний инструмент хеширования MD5, а затем используйте пары входных / выходных данных, чтобы проверить, что ваш метод дает правильный вывод. 1011 *

0 голосов
/ 01 ноября 2009

Как уже упоминалось другими, либо опубликованные тестовые векторы, либо опубликованная эталонная реализация должны быть хорошим источником надежных тестовых значений.

Еще одна вещь, которую я хотел бы добавить: если это вообще возможно , пожалуйста, не используйте MD5. Уже существует так много известных проблем безопасности, что единственной причиной является поддержание совместимости со старой системой хотелось бы использовать его в новом коде.

Если вы можете, используйте SHA-256 (определено в FIPS-180-2 , включая набор тестовых векторов). Если вам не нужно 256 бит хеша, урежьте его до 128, у вас будет намного более безопасная альтернатива для MD5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...