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