CodeBlanks Logo Icon CodeBlanks

password_needs_rehash()

PHP kursu · Uzman · Ders 29/54

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

  1. 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.

  2. password_needs_rehash çağrısını tamamla

    $needsRehash = ____($hash, PASSWORD_DEFAULT, $options);
    Cevabı göster
    $needsRehash = password_needs_rehash($hash, PASSWORD_DEFAULT, $options);
  3. 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

Uzman bölümündeki tüm dersler