switch ($auth_type) { case 1: $md = md5($login.$pass,true); break; case 2: $md = '0x'.md5($login.$pass,false); break; case 3: $md = base64_encode(md5($login.$pass,true)); break; } Не пойму, чего ещё надо, если дали все три варианта... А вы вопрос читаете? Из бд получаю нормальный бинарный код, а через md5 генерируется бинарник со знаками вопросов, соответсвенно они не равны друг другу. Про то что хеш получается от пары логин+пароль - понял давно. Решение найдено: Функция mb_convert_encoding(); $Salt = mb_convert_encoding(md5($row[name].$row[idnumber], true),"UTF-8", "binary");
16 символом мало 1) Это не символы, а байты. 2) Ничего там не мало. Размер хеша 128 бит == 16 байт Но все же, теряется же часть пароля. Выставляю 32 появляются нули - по сути на который насрать. Так хоть пароль не режется, но в клиенте авторизация перестает работать. Меня интересует именно функция md5 почему она отдает вопросики??? Хотя по сути указана кодировка UTF-8. Уже не лезем к БД уже сам PHP не понятен. Код выкладываю: <?php mb_internal_encoding("UTF-8"); //Указал кодировку для PHP $link = mysql_connect('localhost', 'root', '5574793') or die ("Невозможно подключиться"); mysql_select_db ("pw") or die ("Невозможно открыть $db"); mysql_query("SET NAMES 'utf8'"); //Если убрать будут вопросики и все будет работать, но убирать нельзя. $query = "SELECT * FROM users WHERE ID=\"48\""; $result = mysql_query ( $query ); $n = mysql_num_rows ( $result ); for ( $i=0; $i<$n; $i++ ) { $row = mysql_fetch_array($result); $Salt = md5($row[name].$row[idnumber], true); echo "Хеш из БД: $row[passwd]<br>Логин: $row[name]<br>Пароль: $row[idnumber]<br>Сгенерированный хеш: $Salt<br>"; if($row[passwd] == $Salt) { echo "Заебись"; } } mysql_close($link); ?> Ответ: Хеш из БД: vÈçM®M¢Ç³í²‘ÌÒ§£ Логин: admin Пароль: 5574793 Сгенерированный хеш: v��M�M�dz����ҧ�
Сравниваю... Не сходится Убираю из кода "mysql_query("SET NAMES 'utf8'");" все работает как надо 1) Ставим полю с паролем тип BINARY (16) 2) ????? 3) PROFIT!!! Не катит. Теряется часть пароля. 16 символом мало! + если так делаю - в клиенте не авторизироваться. Осталось только разобраться с кодировкой у PHP. MD5 отдает бинарный код с вопросиками � в то время когда из БД с указанием кодировки вытаскивается нормальный код. Есть идеи?
Ладно это уже не главное, с этим что нибудь придумаю. Огромное спасибо за разъяснение с md5. Я даже не знал что там есть второе значение, кроме самого текста. Не второй, а третий параметр. Если уж правильно то не значение и не параметр, а аргумент. с php.net: string md5 ( string $str [, bool $raw_output = false ] ) Вопрос, где тут 3й параметр? 1ый - текст ну и 2ой про который я говорил в посте #21 Или я опять чего то не знаю? function.md5.php (Не реклама)
Что у тебя делают русские символы в бд? Тикеты, группы на сайте и прочая хрень. Но не делать же для проверки пароля отдельный класс подключения к БД Не делать. Библиотека для работы с бд давно существует. Ладно это уже не главное, с этим что нибудь придумаю. Огромное спасибо за разъяснение с md5. Я даже не знал что там есть второе значение, кроме самого текста.
Что у тебя делают русские символы в бд? Тикеты, группы на сайте и прочая хрень. Но не делать же для проверки пароля отдельный класс подключения к БД
Какой кодировке? Это вообще бинарные данные. Аргумент true в md5() заставляет отдать хеш в сыром виде, не преобразовывая в текстовый. О да, это то что надо. Только вот с кодировкой беда теперь точно. т.к. md5(соль,true); отдаем строку "v��M�M�dz����ҧ�" я вытащил хеш из бд не указав кодировку utf-8 все сошлось, но если вытаскивать указав utf-8 (mysql_query("SET NAMES 'utf8'");) то вместо � нужные символы. Вообще вопрос, где я не указал кодировку urf-8 в php (mb_internal_encoding("UTF-8"); есть)? Огромное спасибо всем! Вытаскиваешь из базы данных пароль, клеешь новый пароль — сравниваешь. Я ещё не видел, чтобы руками доставали пароль из бд и в бинарном виде пытались его засунуть как текстовую переменную. о_____О Я так и делаю: <?php mb_internal_encoding("UTF-8"); $link = mysql_connect('localhost', 'root', '5574793'); mysql_select_db ("pw") or die ("Невозможно открыть $db"); mysql_query("SET NAMES 'utf8'"); $query = "SELECT * FROM users WHERE name=\"admin\""; $result = mysql_query ( $query ); $n = mysql_num_rows ( $result ); for ( $i=0; $i<$n; $i++ ) { $row = mysql_fetch_array($result); $Salt = $row[name].$row[idnumber]; $Salt = md5($Salt, true); echo "Хеш из БД: $row[passwd]<br>Пароль: $row[idnumber]<br>Логин+Пароль хеш: $Salt"; } mysql_close ( $link ); ?> Ответ получаю: Хеш из БД: vÈçM®M¢Ç³í²‘ÌÒ§£ Пароль: 5574793 Логин+Пароль хеш: v��M�M�dz����ҧ� Сравниваю... Не сходится Убираю из кода "mysql_query("SET NAMES 'utf8'");" все работает как надо Хеш из БД: v��M�M�dz����ҧ� Пароль: 5574793 Логин+Пароль хеш: v��M�M�dz����ҧ� но убирать это нельзя т.к. будут проблемы с русскими символами из БД
Но проблемка в том что в БД хеш храниться в непонятной мне кодировке или "шифре" который просто не вытащить от туда. Какой кодировке? Это вообще бинарные данные. Аргумент true в md5() заставляет отдать хеш в сыром виде, не преобразовывая в текстовый. О да, это то что надо. Только вот с кодировкой беда теперь точно. т.к. md5(соль,true); отдаем строку "v��M�M�dz����ҧ�" я вытащил хеш из бд не указав кодировку utf-8 все сошлось, но если вытаскивать указав utf-8 (mysql_query("SET NAMES 'utf8'");) то вместо � нужные символы. Вообще вопрос, где я не указал кодировку urf-8 в php (mb_internal_encoding("UTF-8"); есть)? Огромное спасибо всем!
switch ($auth_type) { case 1: $md = md5($login.$pass,true); break; case 2: $md = '0x'.md5($login.$pass,false); break; case 3: $md = base64_encode(md5($login.$pass,true)); break; } Тут пример всех 3-х типов хеша паролей пвшных. Тебе нужен 1-й судя по дампу Это я знаю. Но проблемка в том что в БД хеш храниться в непонятной мне кодировке или "шифре" который просто не вытащить от туда. Если сравнивать все 3 типа с хешем из бд, они просто не подойдут. vÈçM®M¢Ç³í²‘ÌÒ§£ - в основном вопрос как мне вытащить из этой какахи хеш нормальный, или хеш превратить в это. Что бы я мог реализовать авторизацию в ЛК не создавая столбец с обычным хешем. Это был бы выход из ситуации, юзать тот же password_hash(), но считаю что надо делать как то правильнее что ли. Наверное я тут уже всем надоел... Ладно пойду дальше искать решение. p.s. сборка http://mmorpg-devs.ru/threads/pw-1-5-1-full-installation.18745/
Но почему пароли из БД получаю в виде иероглифов, а не хеша?? скрин из пхпмайадмина со строкой этой учетки приложи VALUES ( '48', 'admin', 'vÈçM®M¢Ç³í²‘ÌÒ§£', '0', '0', '0', '5574793', '[email protected]', '192.168.1.2', '0', '0', '0', '0', '0', '0', '0000-00-00 00:00:00', '2016-04-17 01:19:29', '0', '', '', '', NULL , '5ed4701e59816a38bc74870f51fa55ce', 'Евгений', 'Саламатин', '3', '1', '0.00', NULL , NULL ); p.s. после null там где хеш - это уже сам добавлял https://gyazo.com/6aee71666797b42f7fb4c4bcf614c224 https://gyazo.com/b8ce05b4d6f4942641aa9404f4b0f8a2
Кодировка пароля зависит от сервиса authd. Как он читает пароли, так регистрация его и шифрует (если сборка нормальная). Смотри код регистрации, прилагающейся к твоей сборке. По нему изначально и делал. И как бы код который там выдает то значение которое мне нужно, но вот что с ним происходит в самой бд? Как его так крючит. Код прилагается: <div class="clear"></div> <small></small> <div class="clear"></div> <div class="entry"> <? include_once('config.php'); $mysqlhost = $DBHost; //Put your MySQL IP/URL here. (Usually localhost or 127.0.0.1) $mysqluser = $DBUser; //Put your MySQL username here. $mysqlpass = $DBPassword; //Put your MySQL password here. $mysqldb = $DBName; //Put your MySQL database name here. if (isset($_POST['register'])) //If the register button was pressed on the form, execute the below script. { $Link = MySQL_Connect($mysqlhost, $mysqluser, $mysqlpass) or die ("<center>Could not connect to MySQL.</center>"); //Connects to your MySQL server using the parameters you specified above. MySQL_Select_Db($mysqldb, $Link) or die ("Database ".$mysqldb." does not exists."); //Connects to the MySQL database you specified above. $Login = $_POST['login']; $Pass = $_POST['passwd']; $Repass = $_POST['repasswd']; $Email = $_POST['email']; //The above grabs the information entered in the form and puts it to PHP variables. $pass = $_POST['idnumber']; $ip = $_POST['$ip']; $Login = mysql_real_escape_string(StrToLower(Trim($Login))); $Pass = mysql_real_escape_string(StrToLower(Trim($Pass))); $Repass = mysql_real_escape_string(StrToLower(Trim($Repass))); $Email = mysql_real_escape_string(Trim($Email)); //The above strips the information into lower case and adds SQL inject protection. $idnumber = mysql_real_escape_string(StrToLower(Trim($Pass))); $ip = $_SERVER['REMOTE_ADDR']; if (empty($Login) || empty($Pass) || empty($Repass) || empty($Email)) //Checks to make sure all the fields have been entered. { echo "<center><b>Что то забыл, еще разок попробуй.<b></center><br />"; //If the fields haven't been entered, display this message. } else { $Result = MySQL_Query("SELECT name FROM users WHERE name='$Login'") or ("<center>Мы не можем проверить логин, не надо издеваться над системой и так хромает!</center>"); //Checks the entered username against the database for a match. if (MySQL_Num_Rows($Result)) { echo "<center><b>Логин <b>".$Login."</b> уже кто-то использует. Придумай другой.<br /></b></center>"; //If the username already exists, display this message. } elseif ($Pass != $Repass) //Checks the entered passwords against eachother for a match. { echo "<font color='red'><center>Стоп, пароли должны быть одинаковыми. Попробуй еще раз!</center><br />"; //If they don't match, display this message. } else //If there were no errors, continue with registration. { $Salt = $Login.$Pass; $Salt = md5($Salt); $Salt = "0x".$Salt; //Salts the password in md5. MySQL_Query("call adduser('$Login', $Salt, '0', '0', '0', '$idnumber', '$Email', '$ip', '0', '0', '0', '0', '0', '0', '', '0', '')") or die ("Can't execute query."); //Writes the information into the database. echo "<center><b>game username <b>".$Login."</b> created successfully!</b></center><br />"; //Message to say the registration was successful. } } } error_reporting(0) ?> <center><form action="#" method="post"> <center><h4>Логин</h4></center> <input id="username" name="login" size="50" type="text" /> <br><center><h4>Пароль</h4></center> <input id="password" name="passwd" size="50" type="password" /> <br><center><h4>Еще раз пароль</h4></center> <input id="rpassword" name="repasswd" size="50" type="password" /> <br><center><h4>Email</h4></center> <input id="email" name="email" size="50" type="text" /> <br> <input type="submit" name="register" value="Submit" /> </form> </html>
Да, либо $Salt = base64_encode(md5($Login.$Pass, true)); Не то. В PW же по сути utf-8 кодировка используется? pw.sql тоже прошарил, не увидел там ничего похожего на хеширования пароля. Ну ведь игра получает пасс и я логинюсь на аккаунт, а вот создать хеш такой же не могу... Причем заметил что они все разные, хотя на всех 3 акках используется один и тот же пароль. Crypt??? --- добавлено: 25 май 2016 в 01:10 --- Вроде был пост с hex? Но его удалили. Да я забыл про то что логины то разные, по этому и хеши разные. echo "0x".bin2hex(md5($login.$pass)) Вернул: 0x3736633865373464616534646132633762336564623239316363643261376133 Я так понял, что с таким говном я единственный столкнулся. Бред какой-то честн слово.
Что-то с кодировкой в браузере похоже. Зашел с разных браузеров - не помогло. Ведь я правильно понял, что пароли хранятся в виде 0x0287040c474dbf44cdeb17eebb99d828 если через md5 хешируются?
Не понял, причем тут БД, но вот, держи. https://gyazo.com/5adbbe19936ef0de4902eb5a92035ae7 ну вот пароль зашифрованный в БД, я ведь правильно понимаю? Вот как мне хеши сравнивать при авторизации в ЛК, я не могу получить эти иероглифы За чистую БД спасибо:)
Пишу ЛК на PHP, возникли вопросы с БД. Как шифруются пароли? Вот как показалось мне <?php $Hash = "vÈçM®M¢Ç³í²‘ÌÒ§£"; //Хеш из БД $Login = "admin";//Логин пользователя $Pass = "1234567"; //Допустим такой пароль $Salt = $Login.$Pass; $Salt = md5($Salt); $Salt = "0x".$Salt; $vBase = base64_encode($Salt); //Ну мало ли я и так попробовал(хоть и не видел этого в reg.php) echo "$Hash ||| $Pass -> $Salt -> $vBase <br>"; if($Hash == $vBase){ echo "Good! $vBase"; }elseif($Hash == $Salt){ echo "Good! $Salt"; }else{ echo "Них*я не гуд"; } ?> Ответ получаю: vÈçM®M¢Ç³í²‘ÌÒ§£ ||| 1234567 -> 0x0287040c474dbf44cdeb17eebb99d828 -> MHgwMjg3MDQwYzQ3NGRiZjQ0Y2RlYjE3ZWViYjk5ZDgyOA== Них*я не гуд Уже день убил, мне кажется что PhpMyAdmin хеш не правильно показывает, может быть такое? 2. Есть ли у кого-нибудь чистая БД без лишних, не нужных, столбцов? Буду благодарен такой штучке, т.к. удалять методом тыка - не очень. UPD: Скачал регу, в принципе понял по 1 вопросу. Но почему пароли из БД получаю в виде иероглифов, а не хеша??
Имена участников (разделяйте запятой).