Разъяснение по аутентификации HMAC с WCF
Я следил за парой статей, касающихся веб-сервисов RESTful с WCF и, более конкретно, как проходить аутентификацию в них. Основная статья, на которую я ссылался, - это RESTful Web Services Аарона Сконнарда с WCF 3.5. Еще одна статья, специально посвященная аутентификации HMAC, - это статья Itai Goldstiens, основанная на статье Skonnards.
Меня смущает "Ключ пользователя", на который ссылаются в обеих статьях. У меня есть клиентское приложение, которое потребует от пользователя иметь имя пользователя и пароль.
- Значит ли это, что ключ, который я использую для инициализации класса System.Security.Cryptography.HMACMD5, является просто паролем пользователя?
Учитывая метод, использованный для создания Mac в статье Itai (показанной ниже), я прав, думая, что
key
пароль пользователя иtext
является ли строка, которую мы используем, подтверждает, что детали на самом деле верны?public static string EncodeText(byte[] key, string text, Encoding encoding) { HMACMD5 hmacMD5 = new HMACMD5(key); byte[] textBytes = encoding.GetBytes(text); byte[] encodedTextBytes = hmacMD5.ComputeHash(textBytes); string encodedText = Convert.ToBase64String(encodedTextBytes); return encodedText; }
В моем примере text
Параметр будет представлять собой комбинацию URI запроса, общего секрета и метки времени (которые будут доступны в качестве заголовка запроса и будут использоваться для предотвращения атак воспроизведения).
Приличная ли эта форма аутентификации? Я наткнулся на другую ветку, которая предполагает, что метод, определенный в приведенных выше статьях, - это "..a (sic) безобразный хак". Автор не предлагает, почему, но это обескураживает, учитывая, что я потратил несколько часов, чтобы прочитать об этом и заставить его работать. Тем не менее, стоит отметить, что принятый ответ на этот вопрос говорит о пользовательской схеме авторизации HMAC, так что вполне возможно, что уродливая ссылка на хакерство - это просто ее реализация, а не использование самих алгоритмов HMAC.
Диаграмма ниже, если из статьи Википедии о коде аутентификации сообщений. Я чувствую, что это должен быть безопасный путь, но я просто хочу убедиться, что я правильно понимаю, что он используется, а также убедиться, что это не просто какой-то устаревший механизм, который был превзойден чем-то намного лучшим.
1 ответ
Ключом может быть пароль пользователя, но вам абсолютно не следует этого делать.
- Во-первых, ключ имеет оптимальную длину, равную размеру выходного хэша, и пароль пользователя редко будет равен этому.
- Во-вторых, в этих байтах никогда не будет достаточно случайности (энтропии для использования технического термина), чтобы быть адекватным ключом.
- В-третьих, несмотря на то, что вы предотвращаете повторные атаки, вы позволяете кому-либо потенциально подписывать любые запросы, предполагая, что они также могут получить общий секрет (передается ли он сервером в определенный момент или выводится только на клиент и сервер? В случае трансляции атака "человек посередине" может легко захватить и сохранить это - высота паранойи, да, но я думаю, вы должны подумать об этом), если пользователь не изменит свой пароль.
- Четвертое - прекратить использование HMACMD5 - использовать как минимум HMAC-SHA-256.
Этот ключ должен, по крайней мере, представлять собой серию байтов, которые генерируются из пароля пользователя - обычно с использованием чего-то вроде PBKDF2 - однако вы должны также включить что-то временное, основанное на сеансе и которое, в идеале, не может быть известно взломщик.
Тем не менее, многие люди могут сказать вам, что я слишком параноик.
Лично я знаю, что я не эксперт в аутентификации - это очень деликатный баланс - поэтому я полагаюсь на проверенные и проверенные технологии. Например, SSL (в данном случае аутентификация через клиентские сертификаты) может иметь свои слабые стороны, но большинство людей используют его, и если одна из моих систем будет эксплуатироваться из-за слабости SSL, это не будет моей ошибкой. Однако, если эксплойт происходит из-за какой-то слабости, которую я не был достаточно умен, чтобы идентифицировать? Я бы выбил себя из парадной двери.
Кстати, для моих служб отдыха я теперь использую SCRAM для аутентификации, используя SHA512 и 512 бит случайной соли для операции растяжения (многие люди скажут, что это чрезмерно, но мне не придется менять ее некоторое время!), А затем используйте безопасный токен (подписанный с помощью HMAC и зашифрованный с помощью AES), полученный из аутентификации и другой информации, известной только серверу, для сохранения аутентифицированного сеанса. Токен не имеет состояния так же, как куки-файлы проверки подлинности форм Asp.Net.
Обмен паролями действительно работает очень хорошо, безопасен даже без SSL (для защиты пароля) и имеет дополнительное преимущество аутентификации как клиента, так и сервера. Постоянство сеанса может быть настроено на основе сайта и клиента - токен несет в себе собственные значения срока действия и абсолютного срока действия, и их можно легко настроить. Зашифровывая информацию идентификатора клиента также в этом токене, можно предотвратить дублирование на другом компьютере, просто сравнивая дешифрованные значения из предоставленных клиентом значений. Единственное, что от этого зависит, - это следить за информацией об IP-адресе, да, она может быть подделана, но, прежде всего, вы должны учитывать законных пользователей в роуминговых сетях.