php MySQL हैशिंग फंक्शन कार्यान्वयन




hash passwords (5)

मुझे पता है कि php md5 (), sha1 (), और हैश () फ़ंक्शंस, लेकिन मैं MySQL PASSWORD () फ़ंक्शन का उपयोग कर एक हैश बनाना चाहता हूं। अब तक, एकमात्र तरीका मैं सोच सकता हूँ कि बस सर्वर से पूछताछ करना है, लेकिन मैं एक फ़ंक्शन (प्राथमिक रूप से पीएचपी या पर्ल में) चाहता हूं जो कि एक ही चीज़ को MySQL को क्वेरी किए बिना ही करेगी।

उदाहरण के लिए:

MySQL हैश -> 464bb2cb3cf18b66

MySQL5 हैश -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229

धन्यवाद!


ऊपर PHP क्रियान्वयन के आधार पर, यहां एक पर्ल उदाहरण दिया गया है जो काम करता है।

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

पासवर्ड फ़ंक्शन, MySQL5 PASSWORD () फ़ंक्शन के समान देता है।

"किसी को ऐसा क्यों करना चाहते हैं?" के जवाब में, मैं इसे एसक्यूएल "CREATE USER" स्टेटमेंट बनाने के लिए उपयोग करता हूं जिसमें सादा-पाठ पासवर्ड नहीं होते हैं


यदि आप इस फ़ंक्शन के एल्गोरिदम में रुचि रखते हैं, तो स्रोत कोड डाउनलोड करें और फ़ाइल को देखें / sql / password.c, या यह कार्यान्वयन जांचें।


आप mysql पासवर्ड () फ़ंक्शन का उपयोग क्यों करना चाहते हैं? यहां तक ​​कि MySQL दस्तावेज़ीकरण इसके विरुद्ध सलाह देता है:

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

पासवर्ड () फ़ंक्शन MySQL सर्वर में प्रमाणीकरण सिस्टम द्वारा उपयोग किया जाता है; आपको अपने स्वयं के अनुप्रयोगों में इसका उपयोग नहीं करना चाहिए

आप उदाहरण के लिए एमडी 5 () का उपयोग कर सकते हैं, जो लगभग सभी प्रोग्रामिंग भाषा, पीएचपी और पर्ल में मौजूद है।


हां, बहुत देर हो चुकी है लेकिन मैं उस पृष्ठ पर इस कार्यान्वयन को अभी आया हूं: http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

यहाँ mysql पासवर्ड के बराबर php फ़ंक्शन है;

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

मैं मूल रूप से इस प्रश्न के लिए अपने स्वयं के खोज में दो MySQL पासवर्ड हैशिंग कार्यों के एक PHP कार्यान्वयन के लिए ठोकर खाई। मैं किसी भी लागूकरण को खोजने में असमर्थ था, इसलिए मैं MySQL स्रोत कोड (एसक्यूएल / पासवर्डकोड) से खुद को अनुकूलित किया। निम्नलिखित का परीक्षण और 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 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

उम्मीद है कि किसी और को यह उपयोगी भी मिलेगा :)





passwords