Функция MySQL password () для PHP

Я пробовал исследовать это, но у меня пока нет ответа. Программа, которую мой друг разработал, записывает в пароли MySQL db с помощью функции MySQL password ().

Я ищу способ использовать это через веб-интерфейс, который я разработал, но до сих пор не повезло. У кого-нибудь есть предложения?

Пароли выглядят так же, как в этом примере

mysql> SET old_passwords = 0; mysql> SELECT PASSWORD('mypass'); +-------------------------------------------+ | PASSWORD('mypass') | +-------------------------------------------+ | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | +-------------------------------------------+ 

Мне просто нужно выяснить, как превратить это в функцию ie function password_hash

Ниже приведен пример входа в систему для примера

 if (isset($_POST["username"], $_POST["password"], $_POST[$CONF["LOGIN_SIGNAL_TRIGGER"]])) { /* If we got a login signal, a password and a username, we will proceed to check login information. We will first extract the user row from the db. */ $user = myF(myQ(" SELECT `username`,`password`,`id`,`disable_until`,`active` FROM `[x]users` WHERE LCASE(`username`)='".strtolower($_POST["username"])."' ")); if (!$user["id"]) $GLOBALS["LOGIN_FAIL_TYPE"] = "e.user"; elseif ($user["active"] != 1 && $CONF["LOGIN_REQUIRE_ACTIVE"]) $GLOBALS["LOGIN_FAIL_TYPE"] = "e.active"; else { /* If the user's account 'disabled' value is greater than the actual date value, and that the bruteforce protection system is enabled, we will show an error message */ if (($user["disable_until"] > date("U")) && ($CONF["LOGIN_BRUTEFORCE_PROTECT:ENABLE"])) { $GLOBALS["LOGIN_FAIL_TYPE"] = "e.bruteforce"; (isset($_SESSION["loginFailCount"])?session_unregister('loginFailCount'):false); } /* Account is not disabled */ else { if ((isset($_SESSION["loginFailCount"])) && ($_SESSION["loginFailCount"] > $CONF["LOGIN_BRUTEFORCE_FAILCOUNT"])) { myQ("UPDATE `[x]users` SET `disable_until` = ".(date("U")+$CONF["LOGIN_BRUTEFORCE_DISABLE_DURATION"])." WHERE LCASE(`username`)='".strtolower($_POST["username"])."' LIMIT 1" ); (isset($_SESSION["loginFailCount"])?session_unregister('loginFailCount'):false); $GLOBALS["LOGIN_FAIL_TYPE"] = "e.bruteforce"; } else { /* All the information correct, we will proceed to login */ if ($user["password"] == md5(trim($_POST["password"]))) { $_SESSION["id"] = (integer)$user["id"]; session_write_close(); /* Update the last login key */ $me_last_login = me("last_login"); myQ("UPDATE `[x]users` SET `last_login`='".date("U")."' WHERE `id`='".me('id')."'"); /* Route the user */ if (!$GLOBALS["WAP_MODE"]) { header("Location: ".(!$me_last_login?$CONF["LOGIN_FIRST_ROUTE_TO"]:$CONF["LOGIN_ROUTE_TO"])); } else header("Location: {$CONF["WAP_LOGIN_ROUTE_TO"]}"); } else { (isset($_SESSION["loginFailCount"])?$_SESSION["loginFailCount"]++:$_SESSION["loginFailCount"]=1); $GLOBALS["LOGIN_FAIL_TYPE"] = "e.password"; } } } } } if ((isset($_GET[$CONF["LOGOUT_SIGNAL_TRIGGER"]])) && (!isset($_POST[$CONF["LOGIN_SIGNAL_TRIGGER"]]))) { /* Handle admin swapping */ if (isset($_SESSION["swap_id"])) { $_SESSION["id"] = $_SESSION["swap_id"]; session_unregister("swap_id"); header("Location: ?L=admin.index"); } else { (isset($_SESSION["id"])?session_unregister('id'):false); (isset($_SESSION["SELF_USER_DATA"])?session_unregister('SELF_USER_DATA'):false); header("Location: {$CONF["LOGOUT_ROUTE_TO"]}"); } } 

Если я правильно вас понимаю, нет необходимости воспроизводить PASSWORD() в php, сделайте всю свою проверку в один проход на стороне mysql, используя PASSWORD() в своем выборе, подобном этому

 SELECT `username`,`password`,`id`,`disable_until`,`active` FROM `[x]users` WHERE `username` = 'user1' AND `password` = PASSWORD('password') 

Вот демоверсия SQLFiddle

Если вы не используете сортировку с учетом регистра , не используйте LCASE() в столбце username в своих операторах. Это предотвращает использование MySql индекса (индексов), если в этом столбце определен какой-либо параметр, и вызывает полное сканирование в таблице.

На стороне примечание: ваш код уязвим для SQL-инъекций. Подумайте о том, чтобы использовать подготовленные заявления.

ОП спросил, как это сделать в php. Вот как это делается в php:

 function sqlPassword($input) { $pass = strtoupper( sha1( sha1($input, true) ) ); $pass = '*' . $pass; return $pass; } 

Добавлено для потомков (нет причин, по которым вы бы это использовали, используйте его, если mysql решает отказаться от функции PASSWORD ?, только для информационных целей) эквивалент mysql эквивалента php

 SELECT UPPER( CONCAT('*', SHA1(UNHEX(SHA1('password')))) ) 

Также см. Реализацию функции хеширования MySQL

Скопируйте-вставить из интерфейса паролей паролей для приложения Symfony2. Я написал, что он перенесен из старой системы, используя функцию MySQL PASSWORD :

 function mysqlPassword($raw) { return '*'.strtoupper(hash('sha1',pack('H*',hash('sha1', $raw)))); } 

Моя версия кода pre-MySQL 4.1.

 /* PHP implementation of MySQL pre-4.1 password function. Based on Perl Crypt::MySQL C code */ function mysql_old_password_hash($password) { $len = strlen($password); $add = 7; $nr = 1345345333; $nr2 = 0x12345671; $tmp = 0; foreach (str_split($password) as $chr) { if ($chr == " " or $chr == "\t") { continue; } $tmp = ord($chr); $nr ^= ((($nr & 0x3f)+$add)*$tmp) + ($nr << 8); $nr2 += ($nr2 << 8) ^ $nr; $nr2 &= 0xffffffff; # We need to limit this to 32-bit $add += $tmp; } // Strip sign bit $nr &= 0x7fffffff; $nr2 &= 0x7fffffff; return sprintf("%08lx%08lx",$nr,$nr2); } 

Для пост-4.1, до версии 5.7.something, посмотрите ответы sjagr или chiliNUT.

Единственная причина для этого – проверить пароли в базе данных, которая была написана, несмотря на советы MySQL не использовать PASSWORD() для ваших собственных приложений.

сначала используйте mysql_escape_string($_POST['password']) чтобы избежать пароля.

затем используйте это как переменную внутри SQL-запроса в

 WHERE password_field = PASSWORD(USER_SUPPLIED_PASSWORD)