password_hash

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

password_hashParola aşı oluşturur

Açıklama

password_hash ( string $parola , mixed $algo , array $seçenekler = ? ) : string|false

password_hash() işlevi güçlü ve tek yönlü bie aşlama algoritması kullanarak yeni bir parola aşı oluşturur. password_hash() işlevi crypt() işlevi ile uyumludur. Bu bakımdan crypt() ile oluşturulan parola aşları password_hash() ile kullanılabilir.

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ı

    PHP 7.0.0 ve sonrasında salt seçeneğinin kullanımı önerilmemektedir. Artık öntanımlı olarak üretilen tuzun kullanımı öneriliyor.

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

  • memory_cost (int) - Argon2 aşını hesaplamakta kullanılabilecek kilobibayt cinsinden azami bellek. PASSWORD_ARGON2_DEFAULT_MEMORY_COST öntanımlıdır.

  • time_cost (int) - Argon2 aşını hesaplamak için gerekebilecek azami süre. PASSWORD_ARGON2_DEFAULT_TIME_COST öntanımlıdır.

  • threads (int) - Argon2 aşını hesaplamak için kullanılacak evre sayısı. PASSWORD_ARGON2_DEFAULT_THREADS öntanımlıdır.

Değiştirgeler

parola

Kullanıcı parolası.

Dikkat

Algoritma olarak PASSWORD_BCRYPT kullanımı parola değiştirgesinin 72 karakterden 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şlı parola, başarısızlık durumunda false 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
7.4.0 algo için artık bir dizge gerekiyor, ancak geriye uyumluluk için hala tamsayılar kabul ediliyor.
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şılayabileceğiniz maliyetin ne kadar yüksek olduğunu
 * belirlemek için sunucunuzu sınayacaktır. Sunucunuzu çok yavaşlatmadan
 * atayabileceğini en yüksek maliyeti belirlemek istiyorsunuz. 8-10 iyi
 * bir başlangıçtır ve sunucularınız 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 ≤ 50 milisaniyelik süreyi hedeflemektedir.
 */
$süreHedefi 0.05// 50 milisaniye

$maliyet 8;
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: 10

Ö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 belirtmezseniz, sizin için otomatik olarak güvenli bir tuz oluşturulacaktır.

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, gelecekteki bir PHP sürümünde kaldırılabilir.

Bilginize:

Bu işlevi sunucularınızda sınamanız ve cost değiştirgesini, işlevin etkileşimli sistemlerdeki çalışma süresinin 100 milisaniyeden daha az olmasını sağlayacak şekilde ayarlamanız önerilir. Yukarıdaki örnek kod, donanımınız için iyi bir maliyet değeri seçmenize 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