Merhaba,

Bugün size PHP'de Password Hashing işlevlerinden bahsedeceğim.

Password Hashing nedir?
- Şifre üretmeye yarayan bir işlevdir. Bu işlevler ile şifreler oluşturabilir, şifrelerin doğruluğunu kontrol edebiliriz.

Password Hashing fonksiyonları nelerdir?
- Password Hashing işlevlerinde; password_ hash, password_ get_ info, password_ verify, password_ needs_ rehash

Password Hashing fonksiyonları nasıl kullanılır?
- password_hash fonksiyonunun alabileceği değerler şöyledir;
-> password (İşlevde kullanılacak olan şifre),
-> algo (İşlevide kullanılacak olan algoritma),
-> options (İşlevde kullanılacak olan ekstra ayarlar)

Örnek 1 (password_hash);

# En basit haliyle işlevin kullanımı
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
?>


Yukarıdaki örneğin çıktısı;
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Örnek 2 (password_hash);

# İşlevin CPU'da ne kadar harcayabileceğini belirtiyoruz
# Not; cost değeri 4'den küçük 31'den büyük olamaz.
$options = [
'cost' => 12
];
# İşlevi çalıştırıyoruz
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>


Yukarıdaki örneğin çıktısı;
$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Örnek 3 (password_hash);

# İşlevin CPU'da ne kadar harcayabileceğini belirtiyoruz
# İşlevin salt değerini rastgele bir şekilde oluşturuyoruz
# Not; cost değeri 4'den küçük 31'den büyük olamaz.
# Uyarı; salt değeri statik girmeniz önerilmez, rastgele değer alması daha iyidir.
$options = [
'cost' => 12,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
# İşlevi çalıştırıyoruz
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>


Yukarıdaki örneğin çıktısı;
$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.



- password_get_info fonksiyonunun alabileceği değerler şöyledir;
-> password (İşlevin oluşturduğu hash değeri),

Örnek 1 (password_get_info);

# İşlevin oluşturduğu hash değeri hakkında bize bilgi verir.
print_r(password_get_info('$2y$12$Gp0AmzuPibCtSZ2aPV2Yk.kA/cX/iP3XQWj2qMFHL0S8jMSPCi4oO'));
?>


Yukarıdaki örneğin çıktısı;
Array
(
[algo] => 1
[algoName] => bcrypt
[options] => Array
(
[cost] => 12
)

)



- password_verify fonksiyonunun alabileceği değerler şöyledir;
-> password (İşlevin oluşturma esnasında kullandığı şifre),
-> hash (İşlevin oluşturduğu hash değeri)

Örnek 1 (password_verify);

# İşlevin oluşturduğu hash değeri ile girilen şifreyi karşılaştırır.
# Eğer eşleştirme doğru sonuçlanırsa true yanlış sonuçlanırsa false döndürür.
var_dump(password_verify('http://www.***.net/', '$2y$12$Gp0AmzuPibCtSZ2aPV2Yk.kA/cX/iP3XQWj2qMFHL0S8jMSPCi4oO'));
?>


Yukarıdaki örneğin çıktısı;
bool(true)



- password_needs_rehash fonksiyonunun alabileceği değerler şöyledir;
-> hash (İşlevin oluşturduğu hash değeri),
-> algo (İşlevde kullanılmış olan algoritma),
-> options (İşlevde kullanılmış olan ekstra ayarlar)

Örnek 1 (password_needs_rehash);

/*
password_needs_rehash işlevi oluşturulan hash değerin
yeniden oluşturulup oluşturulmamasını bize belirtir.

Eğer yeniden oluşturulması gerekiyorsa true gerekmiyorsa
false değerlerini döndürür.
*/

# İşlevde kullanılacak olan şifre
$password = 'http://www.***.net/';
# İşlevde kullanılacak olan ekstra ayarlar
$options = [
'cost' => 12,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
# Hash değerimizi üretiyoruz
$password_hash = password_hash($password, PASSWORD_DEFAULT, $options);
# Hash değerimizin yeniden oluşturulmaya gerek duyup duymadığını öğreniyoruz
$needs_rehash = password_needs_rehash($password_hash, PASSWORD_DEFAULT, $options);
# Eğer yeniden oluşturulması gerekip gerekmediğini ekrana yazdırıyoruz
if($needs_rehash == true) {
echo 'Hash değeri yeniden oluşturulması gerekmiyor.';
} else {
echo 'Hash değeri yeniden oluşturulması gerekiyor.';
}
?>


Yukarıdaki örneğin çıktısı;
Hash değeri yeniden oluşturulması gerekiyor.



Password Hashing işlevleri PHP'nin kaçıncı sürümde dahil edildi?
- Password Hashing işevleri PHP 5.5 sürümünde dahil edildi.

Password Hashing işlevlerini PHP 5.5 sürümünden önceki sürümlerde kullanabilir miyim ?
- Evet, password_compact paketi ile bu fonksiyonları PHP 5.5 sürümünden önceki sürümlerde kullanabilirsiniz.

Bir sonraki konumda görüşmek üzere sağlıcakla kalın. Bu arada konuyu okudaktan sonra bi' teşekkürü çok görmezsiniz umarım :)