Подтвердить что ты не робот

Какой рекомендуемый алгоритм хэширования использовать для хранения паролей?

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

Я видел предложения SHA-256 и SHA-512.

Программирование преимущественно в Ruby on Rails и использование PostgreSQL - но другие языки и среды также могут вычислять хэши паролей.

4b9b3361

Ответ 1

SHA-256 и SHA-512 безопасны в обозримом будущем. Они принадлежат к семейству SHA-2, против которых до сих пор не выявлено никаких атак. На этой странице wikipedia говорится, что поставщики Unix и Linux сейчас переходят на SHA-2 для безопасного шифрования паролей. Семейство SHA-3 с еще более сильными алгоритмами разрабатывается, но не будет готово до 2012 года.

P.S: Если вы не скрываете имена секретных агентов от правительств, вы тоже будете в безопасности с SHA-1, но если это не проблема с использованием SHA-2, просто используйте этот вариант.

Ответ 2

Используйте медленную функцию, такую ​​как bcrypt. Здесь - сообщение от парней Phusion.

Ответ 3

Вы должны использовать функцию вывода ключа на основе пароля как результат uid/pwd; наиболее известным является PBKDF2 http://en.wikipedia.org/wiki/PBKDF2, также определяемый как RFC 2898 http://tools.ietf.org/html/rfc2898. PKBDF2 берет ваши секретные данные, а также соль и счетчик итераций. Это стандартный способ решения вашей проблемы.

Если вы программируете в .NET, используйте Rfc2898DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

Ответ 4

Вы должны использовать имя хэша, пароль и соль вместе, например:

hash(length(username)+"_veryuniquesalt4rtLMAO"+username+password)

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

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

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

Независимо от того, что вы выберете, небольшое замедление будет намного лучше, чем ничего, используйте 1 миллисекунду вместо 1 микросекунды, и ваша защита будет в 1000 раз сильнее.

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

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