Итак, я хочу защитить веб-сервис 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)
Добавление соли для всего сайта - в случае, если кто-то создал радужные таблицы для общих имен пользователей.
Этот подход кажется безопасным?