Рано или поздно все задумываются о хранении паролей пользователей. Многие останавливаются на алгоритме md5. Двойном md5, солёном md5 (salt md5) и других его разновидностях… Да, хорошая, длинная соль(salt) и не стандартная комбинация пароль+соль+md5 делает хеш достаточно сложным, что бы его нельзя было найти в базах. Но, если ваш сайт\сервер будет взломан, и будет получен доступ к базе данных и к файлам – брутфорс паролей не станет проблемой.
.
Как же с этим бороться?
.
Есть несколько простых правил:
.
1) Пароль пользователя должен содержать цифры, буквы в разном регистре и спец символы. Кончено заставить пользователей это сделать – не реально. Но у нас есть соль. И она должна содержать спец символы.
.
2) Использование разных алгоритмов хеширования. Не нужно зацикливаться на одном md5. Есть куча других алгоритмов, даже если вы думаете, что они не надёжны – оборачивайте их в md5!
.
3) Хеширование пароля должна быть максимально медленной. Используйте медленные алгоритмы, например md2. Но так как он не надёжен – оборачивайте его в так полюбившийся всем md5. Перебор 1000 паролей на компьютере средней мощности должен занимать больше 1 секунды.
.
4) И, в продолжение п.1, в комментариях подсказывают, что соль должна содержать все символы x00-xFF. С такой солью брут будет длиться много дольше, особенно, если она не известна.
.
5) Сделайте модуль для веб-сервера, который хеширует пароль. Даже имея доступ к вашей базе и файлам, при грамотной настройке прав – до модулей злоумышленник не доберётся.
.
Итак, использование этих простых советов поможет вам сохранить пароли ваших пользователей.
Похожие записи:
- None Found
августа 17, 2009 at 19:35
Отличная небольшая статейка… хорошо подмечены некоторые ньюансы, а как показывает практика за счет ньюансов мы и выживаем!!!
августа 28, 2009 at 11:30
Ты печенька ^__^ хотя нет… ты КРЕКЕР! Хаха))
октября 29, 2009 at 19:35
Гуд!
апреля 25, 2010 at 15:02
Чтобы заставить пользователей использовать сложные пароли, оптимальный вариант генерировать их самому и не позволять пользователю установить собственный.
мая 23, 2010 at 11:50
Да уж…
1) Соль должна быть последовательностью символов из алфавита [\x00-\xFF], размером в 2N бит, где N – условный уровень безопасности вашей системы.
2) Во-первых, md5 давно вломан. Во-вторых, оборачивание ничего не даёт – вы получаете уровень безопасности более слабой функции
mr.The: md5 взломан? анука, скажи мне, милый друг, что захешированно этим хешем – bd5a9061a2d35f4d95e84aeb72a6b9b5
3)
> Генерация пароля должна быть максимально медленной.
Ну что же, в этом есть рациональное зерно, если речь не про генерацию пароля, а хеша от него.
> Используйте медленные алгоритмы, например md2.
А это бред
mr.The: функция вида md5($salt1.md2($pass).md2($salt2.$pass).$pass..*энное_кол-во_итераций*..); вполне криптостойкая. Хотя, если ты реверснешь хеш приведённый мною выше – то я приношу свои извинения.
> Но так как он не надёжен — оборачивайте его в так полюбившийся всем md5.
Смотри второй пункт
> Перебор 1000 паролей на компьютере средней мощности должен занимать больше 1 секунды.
И снова проблеск рационального.
4) Смотри первый пункт.
5) Ну и что, пусть доберется. Ваш модуль должен выдавать случайные пароли, используя множественные источники энтропии, а не полагаться на какой-то свой супер-секретный алгоритм, знание которого скомпрометирует всю систему.
mr.The: опять, же, мы говорим не про выдачу случайных паролей пользователям(что, безусловно, очень хорошо и полезно), а хеширование тех, которые установят сами пользователи. А при выдаче паролей пользователю, наш друг и товарищ /dev/random.
мая 23, 2010 at 20:30
> mr.The: md5 взломан?
Да, md5 взломан с тех пор, как найдены атаки, более эффективные, чем прямой полный перебор 2**128 значений или 2**64 в случае использования парадокса дней рождения.
Этот хеш никому не нужен.
> mr.The: функция вида md5 ($salt1.md2 ($pass).md2 ($salt2.$pass).$pass…*энное_кол-во_итераций*…); вполне криптостойкая.
Эта функция обладает такой же криптостойкостью (или даже меньшей), как если бы в ней не использовался md5.
Я вижу, что ты скорее практик, потому поясню на простом примере:
Скажем, мы взяли вместо md2 очень небезопасную функцию – у нее множество выходных значений будет размером в 2 элемента, 1 и 0. В итоге, результирующее множество значений (да-да, уже после применения “безопасной” md5) сократится ровно до такого же количества – до двух элементов, поэтому коллизию будет найти очень просто. Ты спросишь, а как же соль, и т. п. Так вот она ничуть не помешает, она предназначена для другой цели. Получаешь уровень безопасности md2, может даже меньше из-за сокращения алфавита.
mr.The: ок. С примером функции привёдённой выше получим:
Допустим, пользователь имеет пароль “qwe”. В конце концов мы получаем пароль вида “qwe10101001010100110″ (где 1 и 0 результаты той самой небезопасной функции), и тут уже оборачиваем в md5. Длинна пароля стала больше, соответственно брутить его, даже с применением последних достижений в криптологии и в вычислительных мощностях – на порядок дольше, при условии, что злоумышленнику не известен алгоритм, кроме последнего md5. Да и не в md5 дело(можно использовать sha1 или любой другой, более криптостойкий алгоритм), а в том, что бы брутфорс был невозможен без знания алгоритма, а даже со знанием – занимал слишком много времени.
> mr.The: опять, же, мы говорим не про выдачу случайных паролей пользователям(что, безусловно, очень хорошо и полезно), а хеширование тех, которые установят сами пользователи. А при выдаче паролей пользователю, наш друг и товарищ /dev/random.
Тогда непонятно, если речь идет о хешировании, почему там написано “генерирует пароль” и зачем прятать в какой-то модуль функцию хеширования
mr.The: оу. Это моя ошибка, конечно же имелось в виду хеширование. исправил. Спасибо. А прятать – что бы не был известен алгоритм. Если злоумышленник уведя базу увидит хешированный пароль длинной 66 символов x00-xFF, то он будет в замешательстве.
Да, и ещё. У тебя есть твиттер\блог\жаббер\другие контакты? Ты меня заинтересовал.
мая 23, 2010 at 22:32
Для начала определимся, что первоначальный тезис с простым оборачиванием ненадёжной функции в md5 был неверен и это не делает её автоматически безопасной.
> Длина пароля стала больше, соответственно брутить его, даже с применением последних достижений в криптологии и в вычислительных мощностях — на порядок дольше.
Этот новый пароль, qwe10101001010100110, алгоритмически полностью определен первым. Однако дополнительное включение пароля в чистом виде теоретически дает нам уровень безопасности внешней хеш-функции (что хорошо). Целесообразно ли в таком случае использовать внутри что-то другое – неясно.
> при условии, что злоумышленнику не известен алгоритм, кроме последнего md5
В мире криптографии алгоритм всегда известен. В реальном – не всегда, конечно, но идеальных хеш-функций у нас тоже нет.
Приостановим на этом дискуссию :)