(PHP 5 >= 5.5.0, PHP 7, PHP 8)
password_hash — Parola aşı oluşturur
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.
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.
parola
Kullanıcı parolası.
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.
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: | 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.
|
Ö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
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.