Вопрос

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

Это было полезно?

Решение

Как пишет " МК", Стандартными являются SHA1 или MD5, наряду с SHA2.


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


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

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

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

Другие советы

MD5 или SHA1 + соль.

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

В C # это несложно:

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

Джеффа Вероятно, вы неправильно храните пароли статья является отличным чтением на эту тему.

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

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

Мы назвали это Довольно Безопасными Хэшированными паролями или ФШП короче говоря.Реализовал его на Python, Ruby, PHP5 и передал в общественное достояние.Доступно для употребления в пищу, разветвляется, поджаривается или выплевывается на GitHub по адресу http://github.com/bdd/fshp

FSHP - это упрощенная реализация итеративного хэширования паролей.

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

Безопасность:

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

РЕАЛИЗАЦИИ:

  • Питон:Протестировано с 2.3.5 (w / hashlib), 2.5.1, 2.6.1
  • Рубин :Протестировано с 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==

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

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

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

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

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

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

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

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

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

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

Подробная информация: Как правильно выполнить хэширование пароля

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top