PHP
password_needs_rehash()
password_needs_rehash() ile eskimiş hash'leri yeni algoritmaya yükseltmeyi öğrenirsin.
password_needs_rehash ne işe yarar?
password_needs_rehash() fonksiyonu, saklanan bir hash'in daha güçlü bir algoritma veya daha yüksek maliyet ile yeniden hesaplanması gerekip gerekmediğini denetler. PHP yükseltildikten veya cost artırıldıktan sonra eski hash'ler hâlâ password_verify ile doğrulanır ama yeni varsayılana göre zayıftır.
Başarılı girişte password_needs_rehash çağrılır; true dönerse password_hash ile yeniden hesaplanıp veritabanına yazılır. Bu desene şeffaf yükseltme (transparent rehash) denir; kullanıcı fark etmeden hash sessizce göçer. Tuz ($salt) her çağrıda otomatik üretilir, ayrıca üretmen gerekmez.
bcrypt cost ve argon2id
PASSWORD_BCRYPT maliyet tabanlı bir algoritmadır; cost seçeneği her çağrının ne kadar yavaş olacağını belirler. Varsayılan cost 10'dur; her artış süreyi ikiye katlar. PASSWORD_ARGON2ID ise hafıza sert (memory-hard) bir algoritmadır; memory_cost, time_cost ve threads parametreleriyle ayarlanır. Yeni sistemler için önerilen seçim argon2id'dir.
password_needs_rehash, eski hash'in algoritma veya seçeneklerini mevcut ayarlarla karşılaştırır; uyuşmazsa true döner. Böylece bcrypt'ten argon2id'ye geçiş veya cost 10'dan 12'ye atlama sıradan bir giriş akışında yapılır.
Uygulama Şeffaf yükseltme fonksiyonu yaz
rehashIfNeeded($password, $hash) fonksiyonu tanımla. İçinde password_verify($password, $hash) çağır; false ise -1 döndür. true ise password_needs_rehash($hash, PASSWORD_BCRYPT, ["cost" => 10]) çağır; true dönerse 1, false ise 0 döndür. $storedHash değişkeni cost=4 ile tanımlı. rehashIfNeeded("gizli123", $storedHash) ve rehashIfNeeded("wrong", $storedHash) çağır; sonuçları echo ile yazdır.
Örnek çözümü göster
0; } yaz. $storedHash cost=4 ile tanımlı olduğundan needs_rehash true döner; iki çağrı yap ve echo ile yazdır.
Örnek çözüm:
<?php
$storedHash = password_hash("gizli123", PASSWORD_BCRYPT, ["cost" => 4]);
function rehashIfNeeded($password, $hash) {
if (!password_verify($password, $hash)) {
return -1;
}
return password_needs_rehash($hash, PASSWORD_BCRYPT, ["cost" => 10]) ? 1 : 0;
}
echo rehashIfNeeded("gizli123", $storedHash) . "\n";
echo rehashIfNeeded("wrong", $storedHash) . "\n";
Kendini test et
-
Ne zaman password_needs_rehash çağrılmalı?
- Her sayfa yüklendiğinde, kullanıcıdan bağımsız
- Başarılı girişten sonra, password_verify true ise
- Yalnızca parola değiştirildiğinde
- Hiçbir zaman; PHP bunu otomatik yapar
Cevabı göster
Başarılı girişten sonra, password_verify true ise — Doğru. Başarılı giriş sonrası çağrılmalı; kullanıcı fark etmeden hash yükselir.
-
password_needs_rehash çağrısını tamamla
$needsRehash = ____($hash, PASSWORD_DEFAULT, $options);
Cevabı göster
$needsRehash = password_needs_rehash($hash, PASSWORD_DEFAULT, $options);
-
password_needs_rehash kavramlarını eşleştir
- password_needs_rehash
- Yükseltme gerekli mi?
- PASSWORD_ARGON2ID
- Hafıza sert algoritma
- cost
- bcrypt maliyeti
- transparent_rehash
- Girişte sessiz yükseltme
Sıradaki ders: Rate limiting (hız sınırlama)