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);- password_get_info fonksiyonunun alabileceği değerler şöyledir;
<?php # 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);
<?php # İş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);
<?php # İş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 (İşlevin oluşturduğu hash değeri),
Örnek 1 (password_get_info);- password_verify fonksiyonunun alabileceği değerler şöyledir;
<?php # İş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 (İşlevin oluşturma esnasında kullandığı şifre),
-> hash (İşlevin oluşturduğu hash değeri)
Örnek 1 (password_verify);- password_needs_rehash fonksiyonunun alabileceği değerler şöyledir;
<?php # İş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('https://www.r10.net/', '$2y$12$Gp0AmzuPibCtSZ2aPV2Yk.kA/cX/iP3XQWj2qMFHL0S8jMSPCi4oO')); ?>Yukarıdaki örneğin çıktısı;
bool(true)
-> 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 Hashing işlevleri PHP'nin kaçıncı sürümde dahil edildi?
<?php /* 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 = 'https://www.r10.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ş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