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 :)