Nasıl benim Gelen POST verileri benim PHPASS-karma saklanan şifre karşılaştırabilirsiniz?

6 Cevap

Burada daha iyi bir örnek sadece basit bir kontrol .. veritabanında saklanan değeri şifre vardır, bulunuyor: fafa (tescil phpass ile karma) ve adı: fafa; i phpass şifre karma framework kullanıyorum

public function demoHash($data) //$data is the post data named password
{

	$hash =new PasswordHash(8, false);
	$query = ORM::factory('user');
	$result = $query
		->select('username, password')
		->where('username', 'fafa')
		->find();
	$hashed = $hash->HashPassword($data);
	$check = $hash->CheckPassword($hashed, $result->password);
	echo $result->username . "<br/>";
	echo $result->password . "<br/>";
	return $check;
}

çek false dönüyor

6 Cevap

Şu anda sizin $hash değişkeni kayıt () işlevi yerel ilan edilir. Her iki fonksiyonları dışında hareket ve yerel bir değişken olarak kapsamında her içeride global $hash düzgün kullanın, ya da her ikisi fonksiyonları ayrı ayrı başlatmamız gerekir.

Düzenleme: Aşağıdaki güncellenen koduna Değişiklikler.

public function demoHash($data) //$data is the post data named password
{

        $hash =new PasswordHash(8, false);
        $query = ORM::factory('user');
        $result = $query
                ->select('username, password')
                ->where('username', 'fafa')
                ->find();
        //$hashed = $hash->HashPassword($data);
        $check = $hash->CheckPassword($data, $result->password);
        echo $result->username . "<br/>";
        echo $result->password . "<br/>";
        return $check;
}

CheckPassword ilk argüman bir karma girişi geçmeyin - kendi üzerinde karma yapmak için tasarlanmıştır.

Aynı parolayı verildiğinde Sizin karma algoritması aynı karma dönmelidir. Bu nedenle, POSTed verilere HashPassword çalışan DAİMA veritabanına kaydedilir karma eşit olmalıdır.

Aynı işleve sahip POSTed parola hash ve önceden kaydedilmiş karma karşılaştırın.

Ben belirlemek için burada yeterli bilgi yoktur emin değilim bir kaç şey-ben bazı değerler ekleyeceğiz ve akış doğru olup olmadığını bana bildirin açıklamak eğer bakın sorunu-sağlar:

function register()
{
// register user
$hash = new PasswordHash(8, FALSE);// hash = abcd1234
$hashed = $hash->HashPassword($hash);// hashed = DF431268

//register logic here
}

function login()
{
// login user
$data = $_POST['password']; // data = abcd1234
$password = // query password here // password = DF431268
$check = $hash->CheckPassword($data, $password); // assuming this function hashes $data through the same $hash->HashPassword($hash) function previously and then returns true if they are the same, check should be true...
return $check // check is returning false!
}

Eğer karma sınıfının CheckPassword yöntemini gönderebilir miyim?

O $ result-> şifre zaten sağlaması olduğunu varsayarsak, bu deneyin:

$check = $hash->CheckPassword($data, $result->password);

Ya da bu:

$check = $hash->HashPassword($data) === $result->password;

Ben CheckPassword ile aynı sorunu () var ve sorun benim veritabanı ile aslında: parola alanı tüm karma parolayı depolamak için yeterince uzun değildi.

Örnekler phpass ile birlikte görünce, ben 60 characters length benim alan şifreyi ayarlı ve şimdi çalışıyor.

Sadece bir uyarı: aynı aynı şifre iki sağlamalarının ARE NOT EQUAL.

$h = new PasswordHash (8, False);

var_dump ($h->HashPassword('pikachu123') == $h->HashPassword('pikachu123'));

Elde edecek:

bool(false)

HashPassword Bir dize karma farklı bir salt her şey yaratır, çünkü budur. Yani veritabanına kaydedilir biri ile gelen şifrenizi bir karma versiyonunu karşılaştırarak will not work.

Dahili zaten sağlaması dizeden tuz kullanarak temiz şifrenizi sağlamalarının CheckPassword fonksiyonu, var bu yüzden.