Бложек теперь на old.mrThe.name. Следите за обновлениями.

Рано или поздно все задумываются о хранении паролей пользователей. Многие останавливаются на алгоритме md5. Двойном md5, солёном md5 (salt md5) и других его разновидностях… Да, хорошая, длинная соль(salt) и не стандартная комбинация пароль+соль+md5 делает хеш достаточно сложным, что бы его нельзя было найти в базах. Но, если ваш сайт\сервер будет взломан, и будет получен доступ к базе данных и к файлам – брутфорс паролей не станет проблемой.
.
Как же с этим бороться?
.
Есть несколько простых правил:
.
1) Пароль пользователя должен содержать цифры, буквы в разном регистре и спец символы. Кончено заставить пользователей это сделать – не реально. Но у нас есть соль. И она должна содержать спец символы.
.
2) Использование разных алгоритмов хеширования. Не нужно зацикливаться на одном md5.  Есть куча других алгоритмов, даже если вы думаете, что они не надёжны – оборачивайте их в md5!
.
3) Хеширование пароля должна быть максимально медленной. Используйте медленные алгоритмы, например md2. Но так как он не надёжен – оборачивайте его в так полюбившийся всем md5. Перебор 1000 паролей на компьютере средней мощности должен занимать больше 1 секунды.
.
4) И, в продолжение п.1, в комментариях подсказывают, что соль должна содержать все символы x00-xFF. С такой солью брут будет длиться много дольше, особенно, если она не известна.
.
5)  Сделайте модуль для веб-сервера, который хеширует пароль. Даже имея доступ к вашей базе и файлам, при грамотной настройке прав – до модулей злоумышленник не доберётся.
.
Итак, использование этих простых советов поможет вам сохранить пароли ваших пользователей.

Похожие записи:

    None Found

7 комментариев к “Как хранить пароли пользователей”

  1. t0wer Пишет:

    Отличная небольшая статейка… хорошо подмечены некоторые ньюансы, а как показывает практика за счет ньюансов мы и выживаем!!!

  2. ~Desu^2 Пишет:

    Ты печенька ^__^ хотя нет… ты КРЕКЕР! Хаха))

  3. Melkiy Пишет:

    Гуд!

  4. TiamatInc Пишет:

    Чтобы заставить пользователей использовать сложные пароли, оптимальный вариант генерировать их самому и не позволять пользователю установить собственный.

  5. evil Пишет:

    Да уж…
    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.

  6. evil Пишет:

    > 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, то он будет в замешательстве.

    Да, и ещё. У тебя есть твиттер\блог\жаббер\другие контакты? Ты меня заинтересовал.

  7. evil Пишет:

    Для начала определимся, что первоначальный тезис с простым оборачиванием ненадёжной функции в md5 был неверен и это не делает её автоматически безопасной.

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

    Этот новый пароль, qwe10101001010100110, алгоритмически полностью определен первым. Однако дополнительное включение пароля в чистом виде теоретически дает нам уровень безопасности внешней хеш-функции (что хорошо). Целесообразно ли в таком случае использовать внутри что-то другое – неясно.

    > при условии, что злоумышленнику не известен алгоритм, кроме последнего md5

    В мире криптографии алгоритм всегда известен. В реальном – не всегда, конечно, но идеальных хеш-функций у нас тоже нет.

    Приостановим на этом дискуссию :)

Оставить комменатрий: