2013-07-20 19 views
6

Ho provato a effettuare una ricerca ma non ho ancora ricevuto risposta. Un programma che il mio amico ha progettato scrive sulle password db MySQL usando la funzione MySQL password().Funzione MySQL password() su PHP

Sto cercando un modo per utilizzare questo attraverso il web front che ho progettato ma ancora non ho fortuna. Qualcuno ha qualche suggerimento?

Le password sono proprio come questo esempio

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

Ho solo bisogno di capire come trasformare questo in una funzione cioè funzione password_hash

Ecco il resto della query di accesso per un esempio

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"]}"); 
    } 
} 
+0

possibile duplicato di [Che tipo di hash utilizza mysql?] (Http://stackoverflow.com/questions/17738034/what-kind-of-hash-does-mysql-use) – Barmar

+1

Usalo per cosa? Se vuoi solo generare l'hash della password usando mysql - esegui la stessa query che è nella domanda – AD7six

+0

Verifica: http://stackoverflow.com/questions/260236/mysql-hashing-function-implementation –

risposta

2

Se ho capito bene, non è necessario riprodurre PASSWORD() in php fai tutta la tua convalida in e continuare a lato mysql con PASSWORD() nel selezionare come questo

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

Ecco SQLFiddle demo

A meno che non si utilizza caso di confronto sensibile non utilizzare LCASE() su username colonna nelle istruzioni. Impedisce a MySql di utilizzare un indice (indici) se ne esiste uno definito su quella colonna e causare una scansione completa sulla tabella.

Nota a margine: il codice è vulnerabile alle iniezioni SQL. Considera di usare dichiarazioni preparate.

+6

C'è una implicazione per la sicurezza di ciò che vale la pena menzionare. In particolare, è possibile registrare query SQL (ad esempio il log delle query lente di MySQL). Se si esegue l'hash all'interno della query, la password potrebbe essere scritta in un file di registro. (Ci sono anche altre implicazioni sulla sicurezza, ma questo è il più urgente.) – Corbin

+0

L'altro problema è che si interromperà se MySQL cambia nuovamente la definizione della funzione 'password', come in MySQL 4.1. –

0

primo utilizzo mysql_escape_string($_POST['password']) per evitare la password.

quindi utilizzare che come variabile all'interno della query SQL in

WHERE password_field = PASSWORD(USER_SUPPLIED_PASSWORD) 
5

OP chiesto come fare questo in php. Questo è come farlo in php:

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

Aggiunto per i posteri (Nessuna ragione si può usare questa, usarlo se mysql decide di disapprovare la funzione PASSWORD ?, solo a scopo informativo) il mysql equivalente del php equivalente

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

vedere anche MySQL Hashing Function Implementation

1

copia-incolla da un interfaccia encoder password per un'applicazione Symfony2 ho scritto che la migrazione da un vecchio sistema utilizzando la funzione di MySQL PASSWORD:

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

La mia versione del codice 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); 
} 

per la post-4.1, le versioni pre-5.7.something, guarda sjagr o le risposte di chiliNUT.

L'unico motivo per utilizzare questo è per controllare le password in un database che è stato scritto nonostante il consiglio di MySQL di non utilizzare PASSWORD() per le proprie applicazioni.

+0

grazie! @Gert mi salvi il culo! http://ftp.nchu.edu.tw/MySQL/doc/refman/5.1/en/password-hashing.html – zx1986

+0

Siamo spiacenti, ho trovato che questo non funzionerà se la mia password è più lunga di 6, ad esempio 'celestelee 'codifica come 7860f0613fdc6000, ma in MySQL sarà 7860f0613fd9e9ec. – zx1986

+1

Hmm ... Interessante ... Funziona fino a 8 caratteri ... Potrebbe essere necessario confrontare ancora Crypt :: MySQL .... –

Problemi correlati