Могу ли я хранить хешированные пароли? - PullRequest
1 голос
/ 05 июля 2011

API аутентификации flickr описан здесь:

http://www.flickr.com/services/api/auth.spec.html

Я реализовал нечто очень похожее для протокола на основе xml-rpc, чтобы разрешать подписывать запросы без использования SSL.

В основном это работает следующим образом:

Для удаленного вызова функции

doSomething(foo='hello', bar='world')

Сначала я сортирую аргумент по имени, давая:

('bar', 'world'), ('foo', 'hello')

затем я делаю конкатенацию строк:

 m = "bar:world;foo:hello"

, затем добавляю секретный ключ:

 m = "bar:world;foo:hello;someSecret"

и, наконец, подпись представляет собой хэш md5 сообщения m.

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

На данный момент пароли хранятся в виде простого текста на стороне сервера.Есть ли способ хранить хешированные пароли вместо этого?

Я предполагаю, что хэш-функции md5 не хватает аддитивности, чтобы это было возможно, но, возможно, она все еще может быть достигнута с помощью некоторой умной конструкции?

Спасибо,

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Краткий ответ: практически, нет.

Длинный ответ: хеширование пароля на обоих концах не помогает, так как хеш-пароль теперь может использоваться злоумышленником для аутентификации.См. этот раздел в статье в Википедии об аутентификации Challenge-Response для получения более подробной информации.

Есть алгоритмы , которые позволяют проверять пароль пользователя без их предоставления.вы или вы храните его, известный как Zero Knowledge Password Proof .Одним из примеров является протокол безопасного удаленного пароля .Однако такие протоколы, как правило, сложны, а их реализация сложна и, вероятно, неразумна.

Более простое решение - использовать криптографию с открытым ключом и выдавать своим пользователям личные ключи, к которым вы знаете общедоступную часть.Затем они могут подписать свои сообщения для аутентификации и идентификации себя.SSL / TLS предоставляют готовые реализации этого.

1 голос
/ 05 июля 2011

Прежде всего, я бы предложил перейти от MD5 к более сильной хеш-функции, такой как семейство SHA2.

Тем не менее, ничто не мешает вам использовать ту же конструкцию, что и у вас выше, где "someSecret""на самом деле хэш пароля.Это заставит вас выполнить две операции хеширования на клиенте и одну на сервере, сохраняя хешированный пароль в хранилище.

Я бы также использовал второе действительное HMAC вместо того, чтобы делать свою собственную конструкцию.Кроме того, вместо хеширования пароля используйте как минимум PBKDF2 с разумным количеством итераций.Поэтому вы заставите своего клиента выполнить HMAC (data, PBKDF2 (someSecret, 1000)), а сервер просто сохранит PBKDF2 (someSecret, 1000), а затем выполнит HMAC (data, StorageResult).

...