2013-09-06 10 views
8

Sto creando un sistema di login per un'applicazione web. Per memorizzare le password nel DB, sto crittografia delle password utilizzando sha256 come segue:Decodifica crittografia hash sha256, conoscendo il sale

$salt ="sometext"; 
$escapedPW="userpass"; 
$saltedPW = $escapedPW . $salt; 
$hashedPW = hash('sha256', $saltedPW); 
echo "<center>".$hashedPW."</center>"; 

Nel database sto l'archiviazione l'utente, la password dell'utente e il sale usato per fare hash e convalidare login dell'utente. In questo momento sto facendo la funzionalità per inviare all'utente una e-mail con la tua password, ma quando l'utente riceve l'e-mail, poiché è memorizzata nella password crittografata sha256, l'utente riceve una stringa lunga e non la password che l'utente è supposto sapere.

La mia domanda è un modo in cui posso inviarti la password utente effettiva e non la crittografia della password, cioè, c'è un modo per fare il contrario di sha256 se conosco il sale ?. Se non è possibile, quale metodo di crittografia è consigliato per completare il retro della chiave di crittografia e inviare la password effettiva all'utente in un'email.

+7

L'intero punto di un hash è che non è possibile invertire per ottenere il valore originale; né si deve inviare la password originale all'utente che l'ha dimenticata - si invia loro un collegamento una tantum limitato nel tempo per reimpostare la propria password –

+1

Un hash dovrebbe essere irreversibile (almeno in un mondo ideale). Se stai basando il tuo sistema di recupero della password per invertire i tuoi stessi hash, dovresti ripensare a quello che stai facendo. Stai praticamente cercando di hackerarti. +1 alla domanda, però, dato che gli altri potrebbero avere lo stesso dubbio, e la tua domanda è abbastanza utile. – Renan

+0

@Renan Non necessariamente, l'utente deve essere nel DB e la password viene inviata all'e-mail personale dell'utente. – franvergara66

risposta

7

Come menzionato nei commenti della tua domanda, invertire l'hash non è davvero un'opzione.

Cosa puoi fare comunque, e questo è quello che fanno anche tutti gli altri. Nel tuo codice di registrazione (ad esempio register.php) che il tuo modulo ti invia può far sì che lo script PHP invii la password in una e-mail e poi la cripta e la memorizzi nel database.

Suppongo che tu abbia un modulo di registrazione di qualche tipo, e quella forma dovrebbe postare i dettagli dei nuovi utenti su un altro (o lo stesso) script php, vero?

Per esempio, se la mia forma detto qualcosa come <form method="post" action="register.php">

E in register.php Vorrei quindi avere qualcosa di simile

<?php 
$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); /*cleartext*/ 
$email = mysql_real_escape_string($_POST['email']); 

mail($email,"New account","Your username \"$username\" and your password is \"$password\""); 

$salt ="sometext"; 
$escapedPW="userpass"; 
$saltedPW = $escapedPW . $salt; 
$hashedPW = hash('sha256', $saltedPW); 

mysql_query("INSERT INTO users (username, password, email) VALUES ($username, $hashedPW, $email)") 

qualche esempio di codice di massima. Spero possa essere d'aiuto!

+0

buona soluzione..grazie – franvergara66

+0

Il piacere è tutto mio :) –

1

Non inviare MAI password in chiaro tramite posta elettronica. Piuttosto, invia un link "reset password" monouso a tempo limitato, come suggerito nei commenti.

È necessario non utilizzare un semplice hash come suggerito da @Henrik. Utilizzare una password standard regolabile per lavoro KDF (PBKDF2, bcrypt, scrypt)

Se è possibile utilizzare PHP 5.5, utilizzare standard password hashing functions. Ci sono host che supportano PHP 5.5, ma devi cercarli e chiederglielo.

Ci sono molti posti sul web che spiegano come farlo correttamente (ad esempio https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication) e molti che spiegano come farlo in modo errato. PER FAVORE, dedica del tempo alla ricerca prima di decidere di eseguire il rollover del tuo sistema di autenticazione.

+0

L'aggiunta di https://github.com/ircmaxell/password_compat a PHP 5.3.7 è più facile di quanto pensassi in precedenza - probabilmente più facile che passare a un host PHP 5.5. –