Подскажите пожалуйста, как на данный момент лучше всего осуществлять шифровку паролей, в книге по которой я обучался (2010 г. издания) написано что крайне не рекомендовано держать пароли в БД в не зашифрованном виде и там рекомендуют использовать функцию sha1(), но тут http://php.ru/manual/function.sha1.html написано что не рекомендовано, т.к. на данный момент не сложно подобрать этот пароль. Я нашел такую функцию как crypt(), принимает 2 параметра, непосредственно пароль и текст на основе которой будет зашифрован пароль, возвращает пароль в зашифрованном виде. Как вы считаете нормально ли будет шифровать пароль при помощи crypt(), а потом еще полученный зашифрованный пароль шифровать еще раз при помощи sha1()? или это лишнее извращение? Еще несколько вопросов насчет crypt() и sha1(): sha1() - возвращает зашифрованный пароль длинной 40 символов, а если изначально допустим пароль будет больше 40 символов, это нормально будет? "не сломается" данная функция? crypt() - возвращает каждый раз разные по длине пароли, а есть ли какой-нибудь придел по длине? crypt() - если у меня будет переносится проект с одного компьютера на другой, разные операционные системы, то данная функция будет выдавать одинаковые пароли? при использовании одинаковой "соли". и еще вопрос про пароли в целом, есть ли какие то рекомендованная длинна пароля? интересует ДО скольких символов?
Код (PHP): function enc($enc) { return base64_encode(pack('H*',sha1(utf8_encode($enc)))); } 28 длина, не важно какие символы.
Автор, почитай, что такое СОЛЬ. И поймешь, почему совершенно не важно, какой там у пользователя пароль. Если у тебя соль 40-значная и уникальная для каждого паса, хитро смешанная с паролем, то пароль может быть хоть два символа - он будет составлять лишь малую часть от каши, которую нельзя будет восстановить даже после однократного md5. У меня, например, генерится хитрая соль неопределенной длины, хитро комбинированная с паролем. Вот как это выглядит в БД: hash1 6f81287bee475daa7c65a35dbeb926d5 hash2 dK@Qb:IMx4$rW7%Ghc(Gzb:i-GRL-xn59z:?[%43? Представь, что ты спер мою БД и нашел там вот это. Это реальная строка. С реальным паролем. Мой пароль от форума идентичен тому, что тут запрятан. Го, ломай )
Нет, пределов на длину пароля нет. Будет, если версия PHP везде 5.3 и выше. Совершенно лишнее извращение, которое, кроме того, вообще работать не будет, ибо в строке которую возвращает crypt кроме хеша пароля еще куча открытой информации: алгоритм, соль, параметры алгоритма. Без этого вы не сможете проверить пароль. Добавлено спустя 2 минуты 45 секунд: 10 знаков в разных регистрах с цифрами и спец-символами (типа %$&@#) на сегодня достаточно. Вот только советую внимательно изучить crypt по документации - в частности, какие там есть алгоритмы, и какие параметры там есть на усложнение расчета хеша.
как это не будет, при добавлении в БД пароля я пишу так: Код (Text): $pass = 'qwerty'; $pass = sha1 ( crypt ($pass, 'asd') ); // далее добавляю в БД $pass //в итоге у меня в БД в поле pass будет: ac484effbfbfc70a66f88c23b0d03885a29d9f5f Код (Text): // потом пользователь вводит свой qwerty: $login = 'qwerty'; // из БД я получаю пароль и засовываю его в переменную $pass, т.е.: // $pass = 'ac484effbfbfc70a66f88c23b0d03885a29d9f5f'; //потом я проверяю: if ( sha1 ( crypt ($login, 'asd') ) == $pass ) { echo 'OK'; } else { echo 'Not OK!'; } или я как обычно что то не понимаю?
Соль должна быть уникальна для каждого пароля, иначе ее смысл теряется. Смотрите примеры на странице описания crypt как правильно использовать.
Шифрировать – c("memo1")->Text = Base64_EnCode( c("memo1")->Text ); • Разшифрировать – c("memo1")->text = Base64_DeCode( c("memo1")->Text ); • Копировать – c("memo1")->SelectAll(); c("memo1")->CopyToClipBoard(); c("memo1")->Set_SelLength(0);
Ваши ответы меня пугают, т.к. я ни чего толком не понимаю. можно тогда последний наверное вопрос, если шифровать пароль при помощи sha1 при этом пароль будет 40 символов и более, то это нормально? нормально функция будет работать?
Читайте описание функции: http://php.ru/manual/function.sha1.html Никакого ограничения для длину аргумента нету. Хоть мегабайт.
Такой еще вопрос возник, а вот что бы узнать пароль зашифрованный sha1(), это выполняется методом подбора? или по другому? допустим если я буду шифровать пароль таким образом (ну или что то типа такого): Код (Text): $psw = sha1 ( sha1( sha1($psw) ) ); поможет это или нет?
Для хранения паролей следует использовать crypt. Или http://ru2.php.net/manual/en/function.password-hash.php (для версии 5.5+, для младших версий есть PHP реализация - там же ссылка есть в "смотрите также"). Ничего больше использовать нельзя если вы ничего не понимаете в криптографии.
Код (Text): $hash1 = md5($_POST['reg_password']); $salt = uniqid(mt_rand(), true); $hash2 = md5($hash1.$salt); В базу данных для каждого пользователя пишу $salt и $hash2
какой смысл? как было сказано выше "..спер мою БД..", в таком случае у злоумышленника будут все данные, вроде как пустой лишний шаг. или я как обычно чего то не понимаю?
спер бд не значит спер все вооообще Шаг не лишний, а правильный. Я, в примере спертого пароля, выложил то же самое - соль и финальный хэш. Ну дал я их, а что толку? Не зная правил засола, ничего не вытащить из этой каши.
помоему в моем коде есть смысл 100%тный, даже если сопрут мою базу, то пароли они не получат, а получат то только долгим долгим перебором (перебором все ломается) допустим у нас имеется обратная таблица md5? ну что-то вроде: k5bkh4b36vyc456v36hj7n5l6 -> password kj5hb6g45v6i3u6vi34u5hb64 -> mypassword sd54kj6hb63v6u35rc6t5c6t5 -> mybirthday19800101 такие таблицы небольшие и содержат часто используемые пароли, в этом случае при спёртой БД пароли вскрываются у большинства пользователей использующих адекватные пароли типа mysecretpassword, но такие таблицы врядли содержат обратные пароли к oib32vu2vu24oniwneiowit3o45o32ij4n534 - а такие пароли бывают, у Артемия Лебедева например. как раз, в моём случае при спёртом бд они должны получить следующее oihfeifnfww3iom6o67bu5o6 -> aks4h5biu3v36i6v75iu67vu5b5ub556k45j6bh7iu4v6i4u64ibu4 и только потом, зная мой алгоритм (я надеюсь они у вас только БД поперли а не весь сайт со скриптами) они должны вычесть из aks4h5biu3v36i6v75iu67vu5b5ub556k45j6bh7iu4v6i4u64ibu4 соль, получить aks4h5biu3v36i6v75iu67vu и уже от этого ещё раз прогонять обратную таблицу. Этих "засаливаний" можно сделать несколько 5 - 6 - 32 - 64, и тогда чтобы восстановить пароль потребуются годы. те статьи которые вы читали говорят о том, что нынешние суперкомпьютеры способны перебрать практически полную обратную таблицу md5, согласен) можно заморочится несимметричным шифрованием =) и вообще увлечься криптографией и больше не писать сайты вообще ) Правило криптографии: грубой силой (перебором) можно сломать любой пароль (это аксиома), а настоящая цель шифрования - увеличить время которое необходимо для взлома. Добавлено спустя 5 минут 53 секунды: Я уже точно не помню почему соль должна быть динамической, почему перед засаливанием сам пароль необходимо мдпятить, где то прочитал... А про соль кратко почитать тут (ВИКИ) http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0% ... 0%B8%D1%8F)