Реализация функции хеширования MySQL

Я знаю, что в php есть функции md5 (), sha1 () и hash (), но я хочу создать хеш с помощью функции MySQL PASSWORD (). Пока что единственный способ, который я могу придумать, - это просто запросить сервер, но мне нужна функция (желательно на php или Perl), которая будет делать то же самое, вообще не запрашивая MySQL.

Например:

Хеш MySQL -> 464bb2cb3cf18b66

Хеш MySQL5 -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229

Спасибо!

Я не понимаю. Вы хотите использовать функцию ПАРОЛЬ MySQL, но в Perl / php? В чем смысл?

JesperE 04.11.2008 01:54

Дело в том, что он, вероятно, хочет попробовать взломать сервер mysql и каким-то образом получить дамп хэш-кодов, поэтому он пытается использовать взломщик паролей, чтобы вернуть оригиналы.

Zak 04.11.2008 02:35

Почему так важно, в чем дело? Это простой вопрос. Я также хотел бы увидеть реализацию каждой функции паролей MySQL в PHP.

defines 09.10.2009 16:19

Добавлены мои реализации PHP :)

defines 09.10.2009 17:46

Пример использования в реальном мире: мне нужно обновить старую базу данных, в которой использовалась система хеширования MySQL. Я переношу пользователей на систему хеширования паролей PHP, но для проверки существующего пароля потребуется вызов базы данных. Это превращало мой чистый код в кошмар странных интерфейсов и спагетти. Хешировать пароль в PHP намного проще.

user1864610 26.09.2014 02:33

Определенно Только использует mysql323 для целей временной миграции. Формат хэша mysql323 крайне неустойчив к атакам методом грубой силы в автономном режиме. По состоянию на август 2016 года hashcat может работать быстрее всего с хешем - его проще подобрать, чем даже NTLM или MD4!

Royce Williams 08.08.2016 07:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
15
6
20 985
7

Ответы 7

Почему вы хотите использовать функцию 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

jakber 04.11.2008 02:18

Начальник потока просто хотел создать хеш и не сказал, что будет использовать его для хранения паролей, поэтому я не возражал против силы алгоритма md5.

Davide Gualano 04.11.2008 02:22

Почему вам все равно, для чего ему нужна эта функция? Он не сказал, что использует его в приложении, а конкретно заявил, что не хочет использовать MD5.

Keith Palmer Jr. 07.10.2009 16:18

Если вас интересует алгоритм этой функции, скачайте исходный код и посмотрите файл sql / password.c или проверьте реализацию это.

Я не знаю, почему за вас не проголосовали больше, вы единственный в теме, кто на самом деле ответил на вопрос ребят ... вперед!

Keith Palmer Jr. 07.10.2009 16:17

Верно. Я тоже пришел сюда в поисках настоящего алгоритма. Этого нет в документации MySQL. Спасибо CMS.

Omniwombat 01.05.2010 22:35

Первоначально я наткнулся на этот вопрос в своем собственном поиске 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.

x2. 21.10.2009 08:12

У меня были некоторые проблемы на старом Linux-сервере с PHP 5.1.6, я отследил проблему ((1 << 31) - 1) с вычислением 0x80000000 вместо 0x7FFFFFFF. Я не стал исследовать, является ли это ошибкой 5.1 или чем-то еще. Тем не менее, я заменил назначения $ out_a и $ out_b и работал отлично. Спасибо!

Pete 30.07.2011 00:44

Да, это ошибка конкретной версии с целочисленным переполнением, насколько я могу судить.

defines 01.08.2011 19:06

Основываясь на реализации 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);
}

Другие вопросы по теме