2009-11-17 14 views
27

Sto usando sha256 per crittografare la password. Posso salvare la password crittografata sha256 in mysql. Ma non riesco ad accedere con la stessa clausola.Come usare sha256 in php5.3.0

Inserire il codice:

<?php 
error_reporting(E_ALL^E_NOTICE); 
$username = $_POST['uusername']; 
$passcode = $_POST['ppasscode']; 
$userflag = $_POST['uuserflag']; 
//$passcodeen = hash('sha256',$passcode); 
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode)); 
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error()); 
mysql_select_db("sessiondb"); 
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')"; 

Selezionare il codice:

<?php 
error_reporting(E_ALL^E_NOTICE); 

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error()); 
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error()); 
    //get user input 
    $username = $_POST['username']; 
    $ppasscode = $_POST['ppasscode']; 
    //$passcodeen = hash('sha256', $ppasscode); 
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode)); 
    //get session value from mysql 
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error()); 

C'è qualcosa che non va? Sono molto confuso. Grazie.

+2

Si sta utilizzando un campo VARCHAR per memorizzare la password? Perché la dimensione massima su varchars è di 255 caratteri ... – davethegr8

+0

Puoi pubblicare un campione dell'hash come memorizzato nel database rispetto a come appare nel codice? –

+1

Per sha256, è necessario un VARCHAR di almeno 64 caratteri. –

risposta

40

Potrebbe essere un errore di battitura? (Due Ps in ppasscode, destinato?)

$_POST['ppasscode']; 

vorrei fare in modo e fare:

print_r($_POST); 

e assicurarsi che i dati siano accurati lì, e quindi eco di che cosa si dovrebbe essere simile:

echo hash('sha256', $_POST['ppasscode']); 

Confrontare questa uscita con quello che si ha nel database (manualmente). In questo modo si sta esplorando i punti possibili di guasto:

  1. Ottenere password dalla forma
  2. hashing la password
  3. memorizzata la password
  4. confronto tra i due.
+0

@jeremy, Grazie, sì, 'ppasscode' è inteso. –

+0

come usare il sale? – mofidul

11

Prima di tutto, sha256 è un algoritmo di hashing, non un tipo di crittografia. Una crittografia richiederebbe un modo per decrittografare le informazioni al loro valore originale (collisioni a parte).

Guardando il codice, sembra che dovrebbe funzionare se si fornisce il parametro corretto.

  • Provare a utilizzare una stringa letterale nel codice prima, e verificarne la validità invece di utilizzare il $_POST[] variabile

  • Provare a spostare il confronto dal query di database al codice (ottenere l'hash per il dato utente e confrontare con l'hash che avete appena calcolato)

Ma soprattutto prima di distribuire questo in qualsiasi tipo di moda pubblica, ricordatevi di disinfettare gli ingressi. Non consentire l'inserimento di SQL arbitrario nelle query. L'idea migliore sarebbe utilizzare query parametrizzate.

+1

+1 per consigli sulla convalida dell'input. Le query parametrizzate forniscono un grande controllo per la codifica extra. –

+0

@Yannick, grazie per il tuo buon consiglio. –

-1

Un modo migliore soluzione è quella di utilizzare solo lo script di compatibilità eccellente da Anthony Ferrara:

https://github.com/ircmaxell/password_compat

prega, e anche, al momento del check la password, aggiungere sempre un modo (preferibilmente asincrono, quindi non influisce sul processo di controllo per gli attacchi di temporizzazione) per aggiornare l'hash se necessario.