Простое шифрование пароля

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

14 ответов

Решение

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

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

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

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

Легко: BCrypt.

MD5 или SHA1 + соль.

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

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

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );

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

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

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

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

Принцип проектирования аналогичен спецификации PBKDF1 в RFC 2898 (он же: 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 (w / 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==

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

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

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

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

Вы должны использовать однонаправленный алгоритм хеширования, такой как SHA-1, предложенный выше, с солью. Я бы предложил этот сайт для получения дополнительной информации. Он включает в себя пример кода / реализации. http://www.obviex.com/samples/hash.aspx

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

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

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

Если вы используете SQL Server, есть функция HashBytes:

http://msdn.microsoft.com/en-us/library/ms174415.aspx

Я второй голос за MD5 или SHA с солью. Любой из основных языков веб-разработки имеет встроенные функции для вычисления хэша (например, в PHP пакет mcrypt содержит необходимые функции).

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

Другие вопросы по тегам