MySQL Kıyımlama Fonksiyon Uygulama

6 Cevap php

Php md5 olduğunu biliyorum (), sha1 () ve hash () işlevleri, ama ben MySQL ŞİFRE () işlevini kullanarak bir karma oluşturmak istiyorum. Şimdiye kadar, aklıma tek yolu sadece sunucusunu sorgulamak için, ama ben de tüm MySQL sorgulama olmadan aynı şeyi yapacak bir işlev (tercihen php veya Perl) istiyorum.

Örneğin:

MySQL karma -> 464bb2cb3cf18b66

MySQL5 karma -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229

Teşekkürler!

6 Cevap

Bu işlevin algoritması istiyorsanız, kaynak kodu indirmek ve dosya sql / password.c görmek, veya this uygulanmasını kontrol.

Ben aslında iki MySQL şifre karma fonksiyonları bir PHP uygulama için kendi arayışı içinde bu soruya rastladım. Ben herhangi bir uygulamaları bulamadı, bu yüzden MySQL kaynak kodu (sql / password.c) benim kendi uyarlanmıştır. Test edilir ve aşağıdaki PHP 5.2 çalışan:

// 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 Rev. Dustin 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 Rev. Dustin 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

Umarım başkası da bu yararlı bulacaksınız :)

Why do you want to use mysql password() function? Even the Mysql documentation advises against this:

http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_password

ŞİFRE () fonksiyonu MySQL Server kimlik doğrulama sistemi tarafından kullanılır; Eğer kendi uygulamalarında kullanmak gerekir

Örneğin md5 () kullanabilirsiniz, wich hemen hemen her programlama dili, PHP ve Perl dahil mevcuttur.

Evet, çok geç oldu ama sadece o sayfada bu uygulama geldi: http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

Burada mysql şifresi eşdeğer php fonksiyonu;

function mysql_41_password($in) {
    $p = sha1($in, true);
    $p = sha1($p);
    return '*'. strtoupper($p);
} 

Bad boys yapmak sha1sum ile bash ;)

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^^}"

OT, ama yine de ... :)

Yukarıdaki PHP uygulanmasına dayanan, burada çalışan bir Perl örnek.

use Digest::SHA1 qw(sha1 sha1_hex);
sub password { "*".uc(sha1_hex(sha1($_[0]))) }

Parola işlevi MySQL5 ŞİFRE () fonksiyonu olarak aynı döndürür.

"Neden kimse bunu yapmak istersiniz?" Cevap olarak, ben düz metin şifreleri içermeyen ifadeleri "KULLANICI OLUŞTURMA" SQL oluşturmak için kullanabilirsiniz.