Я знаю, что в php есть функции md5 (), sha1 () и hash (), но я хочу создать хеш с помощью функции MySQL PASSWORD (). Пока что единственный способ, который я могу придумать, - это просто запросить сервер, но мне нужна функция (желательно на php или Perl), которая будет делать то же самое, вообще не запрашивая MySQL.
Например:
Хеш MySQL -> 464bb2cb3cf18b66
Хеш MySQL5 -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229
Спасибо!
Дело в том, что он, вероятно, хочет попробовать взломать сервер mysql и каким-то образом получить дамп хэш-кодов, поэтому он пытается использовать взломщик паролей, чтобы вернуть оригиналы.
Почему так важно, в чем дело? Это простой вопрос. Я также хотел бы увидеть реализацию каждой функции паролей MySQL в PHP.
Добавлены мои реализации PHP :)
Пример использования в реальном мире: мне нужно обновить старую базу данных, в которой использовалась система хеширования MySQL. Я переношу пользователей на систему хеширования паролей PHP, но для проверки существующего пароля потребуется вызов базы данных. Это превращало мой чистый код в кошмар странных интерфейсов и спагетти. Хешировать пароль в PHP намного проще.
Определенно Только использует mysql323 для целей временной миграции. Формат хэша mysql323 крайне неустойчив к атакам методом грубой силы в автономном режиме. По состоянию на август 2016 года hashcat может работать быстрее всего с хешем - его проще подобрать, чем даже NTLM или MD4!






Почему вы хотите использовать функцию mysql password ()? Даже документация Mysql не рекомендует этого:
http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_password
The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications
Например, вы можете использовать md5 (), который присутствует почти во всех языках программирования, включая PHP и Perl.
MD5 был сломан. Так и SHA1. NIST рекомендует использовать функцию семейства SHA-2, такую как SHA224, SHA256, SHA384 или SHA512. csrc.nist.gov/groups/ST/toolkit/secure_hashing.html
Начальник потока просто хотел создать хеш и не сказал, что будет использовать его для хранения паролей, поэтому я не возражал против силы алгоритма md5.
Почему вам все равно, для чего ему нужна эта функция? Он не сказал, что использует его в приложении, а конкретно заявил, что не хочет использовать MD5.
Если вас интересует алгоритм этой функции, скачайте исходный код и посмотрите файл sql / password.c или проверьте реализацию это.
Я не знаю, почему за вас не проголосовали больше, вы единственный в теме, кто на самом деле ответил на вопрос ребят ... вперед!
Верно. Я тоже пришел сюда в поисках настоящего алгоритма. Этого нет в документации MySQL. Спасибо CMS.
Первоначально я наткнулся на этот вопрос в своем собственном поиске PHP-реализации двух функций хеширования паролей MySQL. Мне не удалось найти никаких реализаций, поэтому я адаптировал свою собственную из исходного кода MySQL (sql / password.c). Следующие компоненты протестированы и работают в PHP 5.2:
// The following is free for any use provided credit is given where due.
// This code comes with NO WARRANTY of any kind, including any implied warranty.
/**
* MySQL "OLD_PASSWORD()" AKA MySQL323 HASH FUNCTION
* This is the password hashing function used in MySQL prior to version 4.1.1
* By Defines Fineout 10/9/2009 9:12:16 AM
**/
function mysql_old_password_hash($input, $hex = true)
{
$nr = 1345345333; $add = 7; $nr2 = 0x12345671; $tmp = null;
$inlen = strlen($input);
for ($i = 0; $i < $inlen; $i++) {
$byte = substr($input, $i, 1);
if ($byte == ' ' || $byte == "\t") continue;
$tmp = ord($byte);
$nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
$nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
$add += $tmp;
}
$out_a = $nr & ((1 << 31) - 1);
$out_b = $nr2 & ((1 << 31) - 1);
$output = sprintf("%08x%08x", $out_a, $out_b);
if ($hex) return $output;
return hex_hash_to_bin($output);
} //END function mysql_old_password_hash
/**
* MySQL "PASSWORD()" AKA MySQLSHA1 HASH FUNCTION
* This is the password hashing function used in MySQL since version 4.1.1
* By Defines Fineout 10/9/2009 9:36:20 AM
**/
function mysql_password_hash($input, $hex = true)
{
$sha1_stage1 = sha1($input, true);
$output = sha1($sha1_stage1, !$hex);
return $output;
} //END function mysql_password_hash
/**
* Computes each hexidecimal pair into the corresponding binary octet.
* Similar to mysql hex2octet function.
**/
function hex_hash_to_bin($hex)
{
$bin = "";
$len = strlen($hex);
for ($i = 0; $i < $len; $i += 2) {
$byte_hex = substr($hex, $i, 2);
$byte_dec = hexdec($byte_hex);
$byte_char = chr($byte_dec);
$bin .= $byte_char;
}
return $bin;
} //END function hex_hash_to_bin
Надеюсь, кому-то это тоже пригодится :)
Отлично работает! Хорошая реализация php.
У меня были некоторые проблемы на старом Linux-сервере с PHP 5.1.6, я отследил проблему ((1 << 31) - 1) с вычислением 0x80000000 вместо 0x7FFFFFFF. Я не стал исследовать, является ли это ошибкой 5.1 или чем-то еще. Тем не менее, я заменил назначения $ out_a и $ out_b и работал отлично. Спасибо!
Да, это ошибка конкретной версии с целочисленным переполнением, насколько я могу судить.
Основываясь на реализации PHP выше, вот пример Perl, который работает.
use Digest::SHA1 qw(sha1 sha1_hex);
sub password { "*".uc(sha1_hex(sha1($_[0]))) }
Функция пароля возвращает то же самое, что и функция MySQL5 PASSWORD ().
В ответ на вопрос «зачем кому-то это нужно?» Я использую его для генерации операторов SQL «CREATE USER», которые не содержат паролей в виде простого текста.
Да, слишком поздно, но я только что придумал эту реализацию на этой странице: http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html
Вот эквивалентная функция php для пароля mysql;
function mysql_41_password($in) {
$p = sha1($in, true);
$p = sha1($p);
return '*'. strtoupper($p);
}
Плохие парни делают это в bash с помощью sha1sum;)
PHRASE = "password"; P1=`echo -n "${PHRASE}"|sha1sum`; P2 = "*`echo -en $(echo -n ${P1%% *}|sed -E 's/([0-9a-f]{2})/\\\x\1/g')|sha1sum -b`"; PASS = "${P2%% *}"; echo "${PASS^^}"
ОТ, но все равно ... :)
Реализация old_password () в Perl 5 на примере PHP.
sub old_hash_password {
my ($password) = @_;
my $nr = 1345345333;
my $nr2 = 0x12345671;
my $add = 7;
for (my $i = 0; $i < length($password); $i++) {
my $byte = substr($password, $i, 1);
next if ($byte eq ' ' || $byte eq "\t");
my $ord_b = ord($byte);
$nr ^= ((($nr & 63) + $add) * $ord_b) + (($nr << 8) & 0xFFFFFFFF);
$nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
$add += $ord_b;
}
my $out_a = $nr & ((1 << 31) - 1);
my $out_b = $nr2 & ((1 << 31) - 1);
return sprintf("%08x%08x", $out_a, $out_b);
}
Я не понимаю. Вы хотите использовать функцию ПАРОЛЬ MySQL, но в Perl / php? В чем смысл?