Приветствую. Сохранил пароль в БД в md5, данные из формы также зашифровываю и потом сравниваю.. $password = md5($password); Вот такая простейшая защита. Но я заметил недостаток который мне очень не понравился.. попробую объяснить на пальцах. Допустим у меня пароль 12345, случайно ввёл 1234 и к моему удивлению получил доступ в админку. Получается что в админку я уже по двум паролям смогу попасть. А если md5 не использовать то только по единственному паролю. В общем косяк какой-то с md5.. Попробовал sha1, тоже по двум паролям в админку захожу. Наверное я неправильно использую шифрование.. как нужно правильно?
С шифрование все в порядке, со скриптом проверки что то не то потому что 12345 не равно 1234, вот где косяк. Да кстати, md5 и sha1 это устаревшее шифрование, в смысле его не сложно взломать (одним словом узнать пароль) надо использовать метод crypt() только внимательно читайте описание к нему, он работает НЕ так как sha1
сдается мне, что пароль 12345678кудах тоже сработает. У вас там ограничение на 4 символа скорее всего. Все, что больше - просто обрезается.
Вот код, никаких ограничений на кол-во символов, пароль только через trim и md5 пропускаю.., в базе varchar 32, я ставил 100 всё равно одно и тоже, в общем уникальность пароля после пропуска через md5 пропадает.. Код (Text): $login = trim(strip_tags(mysql_real_escape_string($_POST['login']))); $password = trim($_POST['password']); if(!empty($login) && !empty($password)) { $query = "SELECT * FROM `users` WHERE users.`login`='$login'"; $result = mysql_query($query); if(!result) { exit('Запрос на выборку данных из базы не прошёл!'); } if(mysql_num_rows($result) > 0) { $f = mysql_fetch_array($result, MYSQL_ASSOC); $password = md5($password); if($f['password'] === $password) { $_SESSION['user'] = TRUE; header("Location:?option=admin"); exit(); } else {exit('Не верный пароль или логин!');} } else { exit('Не верный пароль или логин!'); } } else { exit('Заполните обязательные поля!'); } } Добавлено спустя 30 минут 36 секунд: а из-за неверных настроек хостинга может такое быть?
К делу не относится, но нахрена так делать? Код (Text): $login = trim(strip_tags(mysql_real_escape_string(
пробелы по краям убрать надо? а от кода html очистить ? а кавычки обезопасить? вот и применил соответствующие функции...., может быть strip_tags лишнее, ну а так вроде всё по делу) Добавлено спустя 22 минуты 6 секунд: Код (Text): может версия php с багом? посмотрел, сравнил, похоже так оно и есть, там где вход по двум паролям - Версия PHP: 5.2.17, испробовал на PHP: 5.3.17 - md5 работает нормально, бывает же) Спасибо что помогли найти причину. Но уже загорелось вместо md5 использовать что-то более современное, вот про crypt() почитал а он только восемь символов шифрует, примеры в википедии посмотрел так и не понял как в базу данных зашифрованный пароль поместить, и про соль чё-то запутано)))
Если пользователь вводит свой ник как мудак, с лишними пробелами и "тегами", вместо того чтобы ввести его так, как было сделано при регистрации - это проблемы пользователя, вводящего свой ник как мудак. А если у пользователя ник будет <br>other? Или типа того. Что дальше?
Код (Text): md5($pass . 'ломани меня если сможешь'); например если я соль в базу данных положу то там как её хранить? тоже в зашифрованном виде? или её вообще в базе не хранить?
дабы предотвратить разрастание темы на 100500 страниц из-за обсуждений соли и алгоритмов хеширования, предлагаю просто воспользоваться поиском по форуму. Тут дохрена материала на эту тему.
дежавю http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0% ... 0%B8%D1%8F) Пример на основе справки по crypt() Код (PHP): <?php header('Content-type: text/plain; charset=utf-8'); function saltGen($saltLen) { $abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $abcLen = strlen($abc); $salt = ''; for ($i = 1; $i <= $saltLen; ++$i) { $salt .= $abc{mt_rand(0, $abcLen-1)}; } return $salt; } // what user enter on registration form $password = 'SomePassword'; // random blowfish salt $salt = '$2a$07$' . saltGen(22) . '$'; echo "Salt: {$salt}\n"; // hash is what we've writen to database instead of plain password $hash = crypt($password, $salt); $hashLen = strlen($hash); // 60 echo "Hash: {$hash} ({$hashLen})\n"; // what user enter in login form $new_password = 'SomePassword'; if (crypt($new_password, $hash) == $hash) { echo "password is ok\n"; } else { echo "!!!WRONG!!!\n"; } соль всякий раз разная. в базе храним хеш, который содержит в себе соль. даже если таблица будет украдена, радужные таблицы не помогут, да и вообще подбор смысла не имеет. Код (Text): Salt: $2a$07$hr9JKAQcvSTw5eP71mnO4z$ Hash: $2a$07$hr9JKAQcvSTw5eP71mnO4uenPRYQWcRA4y8V6k3TasBErkoUvN1KW (60) password is ok
artoodetoo, благодарю за пример кода, как котёнка носом тыкнули в миску с молоком..), теперь немного разобрался , вот только у меня что-то не то, скопировал пример и посмотрел результат на локальном сервере - *Open Server*, $hash всего 13 символов получается а не 60 как в примере.. Код (Text): Salt: $2a$07$QMBtxqaXemnTmcN5CH9AcO$ Hash: $2K.jtJyW7epQ (13)
desertFox, даже не знаю. предположу, что у тебя нет поддержки blowfish, поэтому происходит откат на какой-то иной алгоритм. проверь что тебе доступно: здесь видимо "в отсутствие" — это про ствой сервер
Такой вопрос, если я шифрую при помощи crypt, при этом использую в качестве $salt тот же пароль только "подредактированный", например переведу его в нижний регистр, и разверну в обратную сторону, примерно так: Код (Text): $pass = 'qwerty'; $salt = strrev($pass); // превратит $salt = 'ytrewq' $in_db = crypt ($pass, $salt); даст это какой то толк? или так Код (Text): ... $salt = strrev($pass . $pass); ... или вообще так: Код (Text): $pass = 'qwerty'; $salt = strrev( sha1($pass) ); $in_db = crypt ($pass, $salt);
Именно так, причем на DES алгоритм, о котором вообще забыть нужно нынче. С 5.2, да еще на windows - нужно искать другие решения, у лучше сразу убиться об стенку с этим 5.2
Код (Text): Именно так, причем на DES алгоритм, о котором вообще забыть нужно нынче. С 5.2, да еще на windows - нужно искать другие решения, у лучше сразу убиться об стенку с этим 5.2 Open Server обновил, теперь всё нормально), наверное Вы правы, на windows сайт как - то по другому работает, приходится ещё тестить и на хостинге ещё вопрос, - 60 символов это постоянная цифра? от чего зависит кол-во символов если конечно изменить можно?