password_hash

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

password_hashParola aşı oluşturur

Açıklama

password_hash(#[\SensitiveParameter] string $parola, string|int|null $algo, array $seçenekler = []): string

password_hash() işlevi güçlü ve tek yönlü bir aşlama algoritması kullanarak yeni bir parola aşı oluşturur.

Desteklenen algoritmalar:

  • PASSWORD_DEFAULT - Bcrypt algoritması kullanılır (PHP 5.5.0'dan itibaren öntanımlıdır). Bu sabitin, PHP'ye yeni ve daha güçlü algoritmalar eklendikçe zamanla değişmek üzere tasarlandığı unutulmamalıdır. Bu sebeple, bu tanımlayıcının kullanımından kaynaklanan sonucun uzunluğu zamanla değişebilir. Bu bakımdan, sonucun 60 karakterden fazla genişleyebilen bir veritabanı sütununda saklanması önerilir (255 karakter iyi bir seçim olacaktır).
  • PASSWORD_BCRYPT - Aş oluşturmak için CRYPT_BLOWFISH algoritması kullanılır. Bu, "$2y$" belirtecini kullanarak crypt() uyumlu standart bir aş oluşturacaktır. Sonuç her zaman 60 karakterlik bir dizge olacaktır, başarısızlık durumunda false döner.
  • PASSWORD_ARGON2I - Aş oluşturmak için Argon2i aşlama algoritması kullanılır. Bu algoritma sadece PHP, Argon2 desteği ile derlenmişse kullanılabilir.
  • PASSWORD_ARGON2ID - Aş oluşturmak için Argon2id aşlama algoritması kullanılır. Bu algoritma sadece PHP, Argon2 desteği ile derlenmişse kullanılabilir.

PASSWORD_BCRYPT için desteklenen seçenekler:

  • salt (string) - Parola aşlanırken kullanmak üzere elle bir tuz sağlamak için kullanılır. Bunun bir tuzun otomatik olarak oluşturulmasını geçersiz kılıp önleyeceği unutulmamalıdır.

    Belirtilmezse, aşlanan her parola için password_hash() tarafından rasgele bir tuz üretilir. Bu amaçlanan çalışma kipidir.

    Uyarı

    salt seçeneğinin kullanımı önerilmemektedir. Artık öntanımlı olarak üretilen tuzun kullanımı öneriliyor. PHP 8.0.0 ve sonrasında elle sağlanan tuz yok sayılmaktadır.

  • cost (int) - Kullanılması gereken algoritmik maliyeti belirtir. Bu değerin örnekleri crypt() işlevinde bulunabilir.

    Belirtilmezse, 10 öntanımlı değeri kullanılır. Bu iyi bir temel maliyettir, ancak donanımınıza bağlı olarak arttırılabilir.

PASSWORD_ARGON2I ve PASSWORD_ARGON2ID için desteklenen seçenekler:

Bağımsız Değişkenler

parola

Kullanıcı parolası.

Dikkat

Algoritma olarak PASSWORD_BCRYPT kullanımı parola bağımsız değişkeninin 72 bayttan kırpılmasına sebep olur.

algo

Parolaya karıştırma uygulamak için kullanılacak algoritmayı belirten parola algoritması sabiti.

seçenekler

Seçenekleri içeren ilişkisel bir dizi. Her algoritma için desteklenen seçenekler parola algoritması sabitleri bölümünde bulunabilir.

Belirtilmezse, rasgele bir tuz oluşturulur ve öntanımlı maliyet kullanılır.

Dönen Değerler

Başarılı olursa aşlanmış parola döner.

Kullanılan algoritma, maliyet ve tuz aşın parçası olarak döndürülür. Bu bakımdan aş, doğrulanması için gereken tüm bilgiyi içermiş olur. Böylece, password_verify() işlevinin aşı doğrulamak için ayrı bir yerde saklanmış tuz ve algoritma bilgisine ihtiyacı olmaz.

Sürüm Bilgisi

Sürüm: Açıklama
8.0.0 password_hash() başarısız olduğunda artık false döndürmüyor, onun yerine parola aşlama algoritması geçersizse ValueError, bilinmeyen bir hatadan dolayı parola aşlanamazsa Error istisnası oluşuyor.
8.0.0 algo bağımsız değişkeni artık null olabiliyor.
7.4.0 algo için artık bir dizge gerekiyor, ancak geriye uyumluluk için hala tamsayılar kabul ediliyor.
7.4.0 Argon2 parolalar için artık sodium eklentisi de bir diğer gerçeklenim olarak kullanılabiliyor.
7.3.0 PASSWORD_ARGON2ID kullanan Argon2id parolaları için destek eklendi.
7.2.0 PASSWORD_ARGON2I kullanan Argon2i parolaları için destek eklendi.

Örnekler

Örnek 1 - password_hash() örneği

<?php
/**
* Sadece mevcut öntanımlı algoritmayı kullanarak parolayı aşla.
* Bu şu anda BCRYPT'dir ve 60 karakterlik bir sonuç üretecektir.
*
* Öntanımlının zamanla değişebileceğine dikkat.
* Saklama alanı 60 karakterden fazlasını alabilmeli (255 iyidir)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Örnek 2 - Maliyet belirtilen password_hash() örneği

<?php
/**
* BCRYPT için öntanımlı maliyet 12'ye çıkarılmak isteniyor.
* BCRYPT için 60 karakter gerektiğine dikkat.
*/
$seçenekler = [
'cost' => 12,
];
echo
password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $seçenekler);
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Örnek 3 - password_hash() iyi bir maliyet bulma örneği

<?php
/**
* Bu kod, karşılanabilir maliyetin ne kadar yüksek olduğunu
* belirlemek için sunucuyu sınayacaktır. Sunucuyu çok yavaşlatmadan
* atanabilecek en yüksek maliyetin belirlenmesi isteniyor. 10 iyi
* bir başlangıçtır ve sunucular yeterince hızlıysa fazlası daha iyidir.
* Aşağıdaki kod, etkileşimli oturum açılabilen sistemler için iyi bir sınır
* olarak ≤ 350 milisaniyelik süreyi hedeflemektedir.
*/
$süreHedefi = 0.35; // 350 milisaniye

$maliyet = 10;
do {
$maliyet++;
$ilk = microtime(true);
password_hash("test", PASSWORD_BCRYPT, ["cost" => $maliyet]);
$son = microtime(true);
} while ((
$son - $ilk) < $süreHedefi);

echo
"Yaklaşık maliyet bulundu: " . $maliyet;
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

Yaklaşık maliyet bulundu: 12

Örnek 4 - Argon2i kullanılan password_hash() örneği

<?php
echo 'Argon2i aş: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

Argon2i aş: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0

Notlar

Dikkat

Bu işlev için kendi tuzunuzu oluşturmamanız şiddetle tavsiye edilir. Tuz belirtilmezse, otomatik olarak güvenli bir tuz oluşturulur.

Yukarıda belirtildiği gibi, PHP 7.0'da salt seçeneğinin belirtilmesi, bir kullanımdan kaldırma uyarısı üretecektir. El ile tuz sağlama desteği, PHP 8.0'da kaldırıldı.

Bilginize:

Bu işlevin sunucularda sınanması ve cost bağımsız değişkeninin, işlevin etkileşimli sistemlerdeki çalışma süresinin 350 milisaniyeden daha az olmasını sağlayacak şekilde ayarlanması önerilir. Yukarıdaki örnek kod, donanım için iyi bir maliyet değeri seçilmesine yardımcı olacaktır.

Bilginize: Bu işlev tarafından desteklenen algoritmalarda yapılan güncellemeler (veya öntanımlı algoritmada yapılan değişiklikler) aşağıdaki kurallara uymalıdır:

  • Herhangi bir yeni algoritma, öntanımlı duruma gelmeden önce PHP'nin en az 1 tam sürümü için çekirdek kodda olmalıdır. Dolayısıyla, örneğin 7.5.5'te yeni bir algoritma eklenirse, 7.7'ye kadar öntanımlı olması uygun olmayacaktır (çünkü 7.6 ilk tam sürüm olacaktır). Ancak 7.6.0'da farklı bir algoritma eklenmişse, 7.7.0 öntanımlılık için uygun olacaktır.
  • Öntanımlı, düzeltme sürümünde değil, yalnızca tam sürümde (7.3.0, 8.0.0 vb.) değişmelidir. Bunun tek istisnası, geçerli öntanımlıda kritik bir güvenlik açığı bulunduğunda ortaya çıkan aciliyet durumudur.

Ayrıca Bakınız