Как обезопасить веб-сервис HTTP JSON в .NET WCF - PullRequest
4 голосов
/ 24 ноября 2011

Итак, я хочу защитить веб-сервис http json.

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

Я рассмотрел дайджест-проверку подлинности, поскольку она имеет преимущество в предотвращении атак воспроизведения путем использования случайного «nonce», предоставляемого сервером клиенту, например:

A1 = string.hashMD5 (username + ":" + realm + ":" + password)
A2 = string.hashMD5 (paramTable.method + ":" + paramTable.uri)
requestdigest = string.hashMD5 (A1 + ":" + nonce + ":" + A2)

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

Если бы я не использовал соль, я мог бы добавить еще один шаг на стороне клиента, например (потому что на стороне клиента пароль известен) -

HashedPword = string.hashMD5(password)
A1 = string.hashMD5 (username + ":" + realm + ":" + HashedPword)
A2 = string.hashMD5 (paramTable.method + ":" + paramTable.uri)
requestdigest = string.hashMD5 (A1 + ":" + nonce + ":" + A2)

А затем на стороне сервера я мог бы получить хэшированный пароль из БД для повторного вычисления.

Увы, клиент должен был бы знать соль также, чтобы сделать это должным образом, который был бы, например.

HashedSaltedPword = string.hashMD5(password+salt)
A1 = string.hashMD5 (username + ":" + realm + ":" + HashedSaltedPword)
A2 = string.hashMD5 (paramTable.method + ":" + paramTable.uri)
requestdigest = string.hashMD5 (A1 + ":" + nonce + ":" + A2)

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

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

Что вы, ребята, думаете? Имеет ли значение воздействие солей или наличие известного механизма соления? Есть еще мысли?

Меня не очень беспокоит недостаток дайджест-аутентификации - то есть, что клиент не знает, общается ли он с «реальным» сервером или нет. Потому что это не значит, что пароль клиента будет раскрыт с помощью этого метода, и я не прошу клиента ничего конфиденциального по этой ссылке, например, кредитной карты. То есть материал, который я хочу защитить, находится на моем сервере, и сервер не будет запрашивать у клиента какую-либо ИХ защищенную информацию.

Edit: хм, на самом деле я только что прочитал эту ссылку Соль, пароли и безопасность , что в основном подтвердило мне, что знание соли не имеет значения. Так что я думаю о реализации своего рода хэш вроде:

HashedSaltedPword = string.hashMD5(password+username+siteWideSaltExistingOnlyInCode)

Добавление соли для всего сайта - в случае, если кто-то создал радужные таблицы для общих имен пользователей. Этот подход кажется безопасным?

1 Ответ

0 голосов
/ 24 ноября 2011

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

В первом случае требуются сохраненные пароли в базе данных, и если вы хотите защитить их, вам следует использовать шифрование на уровне базы данных / приложения.В последнем случае требуется защищенный транспорт (HTTPS, VPN и т. Д.), Поскольку пароли передаются в читаемой форме.

...