Какой в ​​настоящее время наиболее безопасный алгоритм одностороннего шифрования? - PullRequest
55 голосов
/ 25 февраля 2010

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

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

Я использую MD5 почти исключительно уже много лет, и мне интересно, стоит ли мне что-то еще делать. Должен ли я рассмотреть другой алгоритм?

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

Ответы [ 7 ]

58 голосов
/ 25 февраля 2010

Предупреждение: С тех пор, как этот пост был написан в 2010 году, графические процессоры широко использовались для хэширования паролей. Умеренные цены на GPU может работать десять миллиардов MD5s в секунду. Это означает, что даже полностью произвольный 8-значный буквенно-цифровой пароль (возможно 62) персонажи) могут быть грубо вынуждены за 6 часов. SHA-1 только слегка медленнее, это заняло бы один день. Пароли вашего пользователя намного слабее, и (даже с засолкой) будет падать со скоростью тысяч паролей за второй. Хэш-функции предназначены для быстрой . Ты не хочешь этого для паролей. Используйте scrypt, bcrypt или PBKDF-2.

MD5 был признан слабым еще в 1996 году, и больше не должен использоваться для криптографических целей. SHA-1 является широко используемой заменой, но имеет аналогичные проблемы . Семейство SHA-2 хеш-функций является текущей заменой SHA-1. Члены SHA-2 в отдельности называются SHA-224, SHA-256, SHA-384 и SHA-512.

На данный момент несколько хеш-функций конкурируют, чтобы стать SHA-3 , следующим стандартизированным алгоритмом криптографического хеширования. Победитель будет выбран в 2012 году. Ни один из них еще не должен использоваться!

Для хеширования пароля вы также можете использовать что-то вроде bcrypt . Он разработан так, чтобы быть достаточно медленным, чтобы сделать крупномасштабные атаки грубой силой невозможными. Вы можете настроить медленность самостоятельно, поэтому она может быть сделана медленнее, когда компьютеры становятся быстрее.

Предупреждение: bcrypt основан на более старом алгоритме двустороннего шифрования Blowfish, для которого сегодня существуют лучшие альтернативы. Я не думаю, что криптографические свойства хеширования bcrypt полностью понятны. Кто-то поправит меня, если я ошибаюсь; Я никогда не нашел надежного источника, который обсуждает свойства bcrypt (кроме его медленности) с криптографической точки зрения.

Может быть несколько обнадеживает то, что риск коллизий менее важен для хеширования пароля, чем для криптографии с открытым ключом или цифровых подписей. Использование MD5 сегодня - это ужасная идея для SSL, но не менее пагубно для хеширования паролей. Но если у вас есть выбор, просто выберите более сильный.

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

10 голосов
/ 25 февраля 2010

Отличный вопрос! Эта страница хорошо читается. В частности, автор утверждает, что MD5 не подходит для хеширования паролей:

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

Скорость - это именно то, что вам не нужно в хэш-функции пароля.

Далее в статье объясняются некоторые альтернативы и рекомендуется Bcrypt в качестве «правильного выбора» (его слова, а не мои).

Отказ от ответственности: я вообще не пробовал Bcrypt. Считайте, что это дружеская рекомендация, но не то, что я могу подкрепить своим собственным техническим опытом.

6 голосов
/ 25 февраля 2010

Для повышения надежности пароля вы должны использовать более широкий спектр символов. Если у вас есть 8-10 символов в пароле, его довольно сложно взломать. Хотя увеличение его длины сделает его более безопасным, только если вы используете числовые / буквенные / другие символы.

SHA1 - это другой алгоритм хеширования (одностороннего шифрования), он медленнее, но имеет более длинный дайджест. (закодированное сообщение) (160 бит), где MD5 имеет только 128 бит.

Тогда SHA2 еще более безопасен, но используется меньше.

3 голосов
/ 25 февраля 2010

Учитывая, что компьютеры продолжают работать быстрее, и что математики все еще разрабатывают эти алгоритмы

Шифрование RSA безопасно в том смысле, что оно опирается на действительно большое число hard к фактору.В конце концов, компьютеры станут достаточно быстрыми, чтобы вычислить число за разумное время.Чтобы оставаться впереди кривой, вы используете большее число.

Однако для большинства веб-сайтов цель хеширования паролей состоит в том, чтобы неудобно для кого-либо, имеющего доступ к базе данных, прочитать пароль, а не для обеспечения безопасности.Для этой цели хорошо подходит MD5 1 .

Здесь подразумевается, что если злонамеренный пользователь получает доступ ко всей вашей базе данных, ему не нужен пароль.(Замок на входной двери не помешает мне войти в окно.)


1 То, что MD5 «сломан», не означает, что вы можете просто повернуть вспятьэто когда хочешь.

3 голосов
/ 25 февраля 2010

солить пароль - это всегда дополнительный уровень защиты

$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp';
$hashed = md5( $userPassword . $salt );
1 голос
/ 25 февраля 2010

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

По нашим оценкам, на современном (2009 г.) оборудовании, если на вычисление производного ключа затрачивается 5 секунд, стоимость аппаратной атаки методом "грубой силы" против scrypt примерно в 4000 раз превышает стоимость аналогичной атаки против bcrypt (до найти тот же пароль), и в 20000 раз больше, чем аналогичная атака на PBKDF2.

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

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

0 голосов
/ 25 февраля 2010

В настоящее время NIST проводит конкурс на выбор нового алгоритма хеширования, так же как и на алгоритм шифрования AES. Так что ответ на этот вопрос, вероятно, будет другим через пару лет.

Вы можете посмотреть представленные материалы и самостоятельно изучить их, чтобы узнать, не хотите ли вы их использовать.

...