2013-09-06 21 views
8

Tworzę system logowania do aplikacji internetowej. Do przechowywania haseł w DB, mam szyfrowanie haseł za pomocą SHA256 następująco:Dekodowanie hash szyfrowanie sha256, znając sól

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

w bazie mam przechowywania użytkownika, hasło użytkownika i sól używana do mieszania i zatwierdź logowanie użytkownika. Teraz wykonuję tę funkcję, aby wysłać do użytkownika wiadomość e-mail z Twoim hasłem, ale gdy użytkownik otrzyma wiadomość e-mail, ponieważ jest ona przechowywana w zaszyfrowanym haśle sha256, użytkownik otrzymuje długi ciąg znaków, a nie hasło, które powinien mieć użytkownik. wiedzieć.

Moje pytanie jest takie, że mogę wysłać ci faktyczne hasło użytkownika, a nie szyfrowanie hasła, tzn. Jest jakiś sposób, aby zrobić odwrotność sha256, jeśli znam sól. Jeśli nie jest to możliwe, jaka metoda szyfrowania jest zalecana, aby ukończyć odwrotność klucza szyfrowania i wysłać rzeczywiste hasło do użytkownika w wiadomości e-mail.

+7

Cały punkt skrótu jest taki, że nie można go odwrócić, aby uzyskać oryginalną wartość; nie powinieneś też wysyłać oryginalnego hasła do użytkownika, który go zapomniał - wyślij im jednorazowy, ograniczony w czasie link do resetowania hasła. –

+1

Hash ma być nieodwracalny (przynajmniej w idealnym świecie). Jeśli opierasz system odzyskiwania hasła na cofaniu własnych skrótów, powinieneś przemyśleć to, co robisz. Zasadniczo próbujesz się włamać. +1 na pytanie, ponieważ inne osoby mogą mieć takie same wątpliwości, a twoje pytanie jest bardzo przydatne. – Renan

+0

@Renan Niekoniecznie użytkownik musi znajdować się w DB, a hasło jest wysyłane na osobistą wiadomość e-mail użytkownika. – franvergara66

Odpowiedz

7

Jak wspomniano w komentarzach do twojego pytania, cofnięcie skrótu nie jest tak naprawdę opcją.

Co jednak można zrobić, i to samo robi każdy. W swoim kodzie rejestracyjnym (np. Register.php), który zamieszczasz w formularzu, możesz sprawić, że skrypt PHP wyśle ​​hasło w wiadomości e-mail, a następnie zaszyfruje je i zapisze w bazie danych.

Przypuszczam, że masz jakiś formularz rejestracyjny, a ten formularz rzekomo umieszcza nowe informacje o użytkowniku w innym (lub tym samym) skrypcie php, czyż nie?

Na przykład, jeśli moja forma powiedział coś <form method="post" action="register.php">

I register.php bym wtedy coś

<?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)") 

z grubsza przykładowy kod. Mam nadzieję, że to pomoże!

+0

dobre rozwiązanie .. dzięki – franvergara66

+0

Przyjemność jest cała moja :) –

1

NIGDY nie należy wysyłać haseł w postaci zwykłego tekstu za pośrednictwem poczty e-mail. Zamiast tego wyślij ograniczone czasowo, jednorazowe łącze "zresetuj hasło", zgodnie z sugestiami w komentarzach.

Powinieneś nie użyć prostego skrótu zgodnie z sugestią @Henrika. Użyj standardowego hasła do pracy z regulacją KDF (PBKDF2, bcrypt, scrypt)

Jeśli możesz używać PHP 5.5, użyj standard password hashing functions. Istnieją hosty, które obsługują PHP 5.5, ale musisz je wyszukać i poprosić o nie.

Istnieje wiele miejsc w Internecie, które wyjaśniają, jak to zrobić poprawnie (na przykład https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication) i wiele z nich wyjaśnia, jak zrobić to niepoprawnie. PROSZĘ poświęcić trochę czasu na zbadanie tego, zanim zdecydujesz się na roll własnego systemu uwierzytelniania.

+0

Dodanie https://github.com/ircmaxell/password_compat do PHP 5.3.7 jest łatwiejsze niż wcześniej sądziłem - prawdopodobnie łatwiejsze niż przeniesienie się do hosta PHP 5.5. –