У меня есть сообщение, которое я передаю себе, которое подвергнется атакам «человек посередине». В связи с этим меня беспокоит целостность сообщения, которое сохраняется между временем, когда я его отправляю, и временем, когда я получаю его обратно.
Следует предположить, что после того, как я отправлю сообщение себе, никакая информация об отправленном сообщении не будет мне доступна в будущем. Сообщение полностью автономно.
С этой целью я знаю, что следует хэшировать содержимое сообщения и сравнивать хэши до того, как я отправлю сообщение, и после того, как я отправлю сообщение, если они отличаются, то сообщение было подделано.
Конечно, если человек посередине знает, что хеш - это на самом деле просто хеш содержимого сообщения, как есть, тогда, поскольку сообщение является автономным, он может просто создать новое содержимое и применить тот же алгоритм хеширования к содержимому.
Вопрос в том, на какую длину я должен пойти, чтобы рандомизировать содержимое сообщения при генерации хеша? Когда он достигает точки убывающей отдачи?
В этом сценарии у меня есть набор пар ключ / значение. Для этого я должен предпринять следующие шаги:
- Добавьте соль к сообщению. Соль является секретом для остального мира. Он прикрепляется к содержимому сообщения перед хэшированием.
- Закажите пары ключ / значение в согласованном порядке, прежде чем генерировать хеш.
- Хотя это не напрямую и имеет отношение к делу, к содержимому каждого сообщения будет добавлена временная метка перед хэшированием, чтобы предотвратить повторные атаки.
Это дополнительные шаги, которые я рассматриваю:
- Преобразование ключей, прежде чем я их закажу. Я подумал о том, чтобы поменять их, затем упорядочить по количеству / ключу.
- Игра с разделителями, которые разделяют пары ключ / значение (как для разделителя для ключа / значения, так и для разделителя для пары).
Примечание
Конфиденциальность сообщений здесь не является обязательным требованием, поэтому я не ищу шифрование. Значения должны передаваться в виде простого текста.
Наконец, каких алгоритмов хеширования мне следует избегать?
Особенности
У меня есть сайт ASP.NET MVC, на котором у меня есть контроллер, который управляет проверкой и сохранением ввода.
Если (на основе эвристики не важно, какой) вход определяется как автоматическая попытка спама, создается модель IDictionary<string, string>
с входными значениями и ViewResult отправляется на общую страницу CAPTCHA.
В этом представлении в форме, содержащей элемент управления CAPTCHA, содержимое IDictionary<string, string>
будет записано в скрытых полях ввода, а действие формы будет таким же, как и содержимое, которое было первоначально опубликовано. , Таким образом, MVC может получить значения при повторной отправке формы.
Именно по этой причине я не могу зашифровать пары ключ / значение (или, может быть, я могу и должен сказать, почему и как!).
Конечно, мне нужно добавить еще одно значение, которое содержит содержимое хэшированного сообщения. Если это значение есть, то контроллер проверит, что целостность сообщения поддерживается, и разрешит сохранение ввода, если оно есть.
Решение
Я решил использовать класс SignedCms в пространстве имен System.Security.Cyrptography.Pkcs, который представляет собой подписывание и проверку сообщений CMS / PKCS # 7.
Чтобы уточнить, я создал самостоятельно выданный сертификат с помощью MAKECERT.EXE, а затем в своем коде я использую приведенный здесь пример для цифровой подписи данных:
http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx
Теперь необходимо обеспечить безопасность пароля экспортируемого закрытого ключа, а также безопасность на сервере, что уменьшает программирование.
Мне нужно будет добавить дополнительный ключ для метки времени для атак воспроизведения, но это не будет слишком сложно.
Ответ идет к Kalium , не для его первоначального поста , а для его последующих комментариев, которые указали путь к цифровым подписям, и в конечном итоге к моему открытию, как их использовать в .NET.
Спасибо всем, кто внес свой вклад.