2013-05-01 13 views
5

Ho uno script PHP login con sale sul database, ma nel mio script registro vedo:Come posso aggiornare la mia sicurezza nel mio script di accesso da MD5 a qualcosa di più sicuro?

$qry = "INSERT INTO accounts(username, firstname, lastname, password) " . 
VALUES('$username','$fname','$lname','" . md5($_POST['password']) . "')"; 

e per il login:

$qry="SELECT * FROM accounts WHERE username='$username' AND password='" . 
md5($_POST['password']) . "'"; 

c'è qualche codice che può sostituire il MD5 ? Qualcosa di più sicuro?

Ho sentito parlare di SHA1 o qualcosa del genere.

+1

1. Utilizzare una libreria di autenticazione in uscita 2. Utilizzare un'autenticazione esistente .. ci sono più problemi che sono battuti alla morte in SO - cercare ["php hash password"] (http://stackoverflow.com/search? q = php + hash + password) e buona lettura: SQL injection; scelta hash inappropriata (anche SHA-1 non è appropriato); senza sale (nonostante ciò che è richiesto); altre questioni altrove ..? – user2246674

+0

Ive ha letto che l'MD5 è orribile, Sha256 e il sale sono stati consigliati, ma darò un'occhiata a quello che hai pubblicato e fai qualche ricerca. grazie per il punto nella giusta direzione, signore. –

+1

MD5 non deve essere utilizzato per l'hashing della password; ma lo stesso identico motivo per cui non si applica a SHA-1. [L'hashing MD5 non può * essere * fattibile "senza fruscii"] (http://stackoverflow.com/a/13446272/2246674) - tuttavia, * sia MD5 che SHA-1 sono vulnerabili alla forzatura bruta perché sono entrambi molto veloci e può essere parallelizzato *. L'uso di sale può prevenire gli attacchi della tabella arcobaleno (e non usare salt è una password hash senza valore a causa degli attacchi rainbow table), ma non può prevenire gli attacchi brute force, motivo per cui SHA-1 non è * più adatto * di MD5 per questa particolare attività. – user2246674

risposta

3

Risposta breve

Usa bcrypt non md5 o sha1

Più rispondere

utilizzando il crypt() è difficile. C'è una nuova API di PHP password di hashing venire in PHP versione 5.5, è possibile leggere su di esso qui:

https://gist.github.com/nikic/3707231

utilizza bcrypt e rende l'intero processo molto semplice. Naturalmente php 5.5 non è ancora pronto, così nel frattempo v'è una biblioteca per fornire questa nuova API in questo momento:

https://github.com/ircmaxell/password_compat

Edit: Vedere questo thread per una risposta molto più approfondita sulla argomento:

How do you use bcrypt for hashing passwords in PHP?

+0

quindi posso semplicemente scambiare l'md5 con bcrypt e dovrebbe adattarsi da solo? –

+0

@DxVermakaXeno No, non puoi semplicemente scambiarlo. Leggi i documenti PHP su crypt() che ho collegato sopra. E leggere il thread SO che ho appena aggiunto a un link, ha un sacco di codice di esempio. – jszobody

+0

Ho apprezzato la lettura [RFC] (https://wiki.php.net/rfc/password_hash) per la nuova API di hashing della password. –

1

In considerazione della posta @jszbody, si dovrebbe aggiornare anche il campo della password per dire che si desidera schema che si sta utilizzando.

Dove si dispone di un hash MD5 ora, si potrebbe avere solo "BAC232BC1334DE" o qualcosa del genere.

Quando si passa a SHA o qualsiasi altra cosa, è necessario cambiarlo in: "SHA: YOURSHAHASHHERE".

Perché non è possibile modificare nessuna delle password esistenti in questo momento. Ciò renderà più compatibile con le versioni precedenti, dal momento che ora è possibile supportare entrambi i regimi.

Poiché si ottiene la password originale durante l'accesso, è possibile aggiornare dinamicamente le password in posizione mentre le persone accedono.

Ottieni il record utente, controlla la password. Se non esiste uno schema, utilizzare MD5 e confrontare le password. Se sono corretti (cioè possono accedere), è possibile aggiornare la loro vecchia password MD5 alla nuova password SHA.

Inoltre, sembra che tu non stia salando le tue password. Devi salare le tue password in modo che quando Mary Sue utilizza "ilovekittens" per la sua password e Big Jake Mahoney utilizzi "ilovekittens" come sua password, non si ottiene lo stesso comportamento con password identiche.

È possibile memorizzare il sale anche nella password: "SHA: RANDOMSALTCHARACTERS: YOURSALTEDHASHHERE".

La salatura è altamente raccomandata. Senza regole, praticamente non importa molto quale schema usi.

+0

*** Non c'è alcun vantaggio nell'usare SHA-1 su MD5 per gli hash delle password ***. In tutti i casi dovrebbe essere usato un buon valore salato (o un equivalente) o l'hashing è * inutile * a causa delle tabelle arcobaleno e dei compromessi tempo/spazio - direi quindi "Salatura obbligatoria". – user2246674

0

Provare a usare la seguente classe:

<?php 
    class PassHash { 

     // blowfish 
     private static $algo = '$2a'; 

     // cost parameter 
     private static $cost = '$31'; 

     // mainly for internal use 
     public static function unique_salt() { 
      return substr(sha1(mt_rand()),0,22); 
     } 

     // this will be used to generate a hash 
     public static function hash($password) { 

      return crypt($password, 
         self::$algo . 
         self::$cost . 
         '$' . self::unique_salt()); 

     } 
     // this will be used to compare a password against a hash 
     public static function check_password($hash, $password) { 

      $full_salt = substr($hash, 0, 29); 

      $new_hash = crypt($password, $full_salt); 

      return ($hash == $new_hash); 

     } 

    } 

?> 

includere nella tua pagina con il seguente:

include_once('passhash.class.php'); 

hash della password da:

PassHash::hash("test"); 

e controllarlo con:

if (PassHash::check_password($databasepassword, $formpassword)){ 
    // do stuff 
} 

Questa funzione utilizza la crittografia Blowfish. Per ulteriori informazioni su Blowfish goto PHP.net/crypt

Blowfish è considerato il modo più efficace e più potente di crittografare le password. Non usare MD5 o SHA1 senza usare sale!

+0

Non utilizzare affatto MD5 o SHA1 (per questo)! – user2246674

+0

sono d'accordo, tuttavia. Per i sistemi di sicurezza di piccole dimensioni è possibile utilizzare md5 con un sale. Finché mantieni il sale lontano dalla tua directory httpd. Altrimenti non vedo ancora perché non dovresti usare MD5. Dal momento che non è reversibile però ... –

+0

* Né * MD5 né SHA1 sono adatti (con o senza sale) perché * possono essere forzati brute *. Vedi i miei commenti sul post principale. Sono completamente d'accordo con bcrypt (come mostrato) perché è resistente agli attacchi di forza bruta. (Questa risposta mostra anche una * buona * funzione di generazione di sale.) – user2246674