Простое шифрование пароля - PullRequest
16 голосов
/ 27 августа 2008

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

Ответы [ 14 ]

14 голосов
/ 27 августа 2008

Как говорит mk, SHA1 или MD5 являются стандартными, наряду с SHA2 .


Обновление. По мере того, как процессоры с годами становились все быстрее, хэши стали более грубыми. Теперь рекомендуется использовать bcrypt.


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

К сожалению, только потому, что ваши пароли хешируются, не освобождает вас от необходимости очень стараться, чтобы сохранить хешированные версии в безопасности. Слишком много людей будут использовать слабые пароли, которые могут быть уязвимы для атаки методом "грубой силы" в автономном режиме.

Редактировать - несколько человек уже указали на важность использования соли. Соль - это постоянное значение, которое вы смешиваете с входным значением перед использованием хеш-функции. Наличие уникальной соли не позволяет злоумышленникам, работающим в автономном режиме, использовать предварительно вычисленные таблицы общих паролей (радужные таблицы), чтобы перебирать ваши пароли еще быстрее.

10 голосов
/ 27 августа 2008

Легко: BCrypt .

10 голосов
/ 27 августа 2008

Если вы используете MD5 или SHA1, используйте соль, чтобы избежать взлома радуги.

В C # это легко:

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );
10 голосов
/ 27 августа 2008

MD5 или SHA1 + соль.

5 голосов
/ 27 августа 2008

Jeff's Вы, вероятно, неправильно храните пароли Статья отлично подходит для чтения по этой теме.

4 голосов
/ 02 января 2009

Это была моя проблема пару недель назад. Мы развертывали большой проект MIS в 975 различных географических точках, где наше собственное хранилище учетных данных будет использоваться в качестве средства проверки подлинности для различного набора уже реализованных и используемых приложений. Мы уже предоставили сервис аутентификации на основе REST и SOAP, но заказчик настаивал на том, чтобы иметь возможность получить доступ к хранилищу учетных данных пользователя из других приложений, используя только соединение с БД для просмотра связанной таблицы или представления только для чтения. Вздох ... (это очень связанное плохое проектное решение - предмет другого вопроса).

Это заставило нас сесть и преобразовать нашу соленую и итеративно хешированную схему хранения паролей в спецификацию и предоставить несколько разных языковых реализаций для легкой интеграции.

Мы назвали его «Защищенные хешированные пароли» или FSHP , короче говоря. Реализовал его в Python, Ruby, PHP5 и выпустил в Public Domain. Доступно для потребления, разветвления, воспламенения или плевки на GitHub на http://github.com/bdd/fshp

FSHP - это реализация хеширования пароля с итеративным хэшированием.

Принцип конструкции аналогичен спецификации PBKDF1 в RFC 2898 (a.k.a: PKCS # 5: спецификация шифрования на основе пароля, версия 2.0.) FSHP позволяет выбрать длину соли, количество итераций и лежащая в основе криптографическая хеш-функция среди SHA-1 и SHA-2 (256, 384, 512). Самоопределение мета-префикса в начале каждого вывода делает его переносимым, позволяя потребителю выбирать собственный базовый уровень безопасности хранения пароля.

БЕЗОПАСНОСТЬ

По умолчанию FSHP1 использует 8-байтовые соли с 4096 итерациями хеширования SHA-256. - 8-байтовая соль делает атаки на радужные таблицы нецелесообразными, умножая необходимое место с 2 ^ 64. - 4096 итераций приводят к довольно дорогим атакам методом перебора - Нет известных атак против SHA-256, чтобы найти столкновения с вычислительное усилие менее чем 2 ^ 128 операций во время этот выпуск.

реализации:

  • Python: протестировано с 2.3.5 (с hashlib), 2.5.1, 2.6.1
  • Ruby: протестировано с 1.8.6
  • PHP5: протестировано с 5.2.6

Каждый может создать недостающие языковые реализации или отполировать текущие.

ОСНОВНЫЕ ОПЕРАЦИИ (с Python) :

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True

НАСТРОЙКА КРИПТА:

Давайте ослабим нашу схему хеширования паролей. - Уменьшить длину соли с 8 до 2. - Уменьшить цикл итерации с 4096 до 10. - Выберите FSHP0 с SHA-1 в качестве основного алгоритма хеширования.

>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==
3 голосов
/ 27 августа 2008

Используйте односторонний алгоритм хеширования SHA вместе с уникальной солью. Это основной алгоритм, который я использую для хранения своих паролей в базе данных.

0 голосов
/ 25 марта 2011

Я заметил много недоразумений по поводу того, как правильно хешировать пароли, особенно в stackoverflow. Итак, я написал страницу, которая должна все прояснить. Это немного больше, чем использование простого хэша.

Подробнее: Как правильно хешировать пароль

0 голосов
/ 02 января 2009

Если вы хотите использовать свое решение на будущее, я бы порекомендовал SHA256 или SHA512. Криптографический geekworld вызывает дрожь около MD5 и, в несколько меньшей степени, SHA1.

Или, если можете, дождитесь SHA-3

0 голосов
/ 02 января 2009

Для необратимого шифрования я бы определенно выбрал SHA256 или SHA1. У MD5 сейчас довольно много коллизий, и много усилий было потрачено на его устранение, поэтому его не стоит использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...