Parola Hashing
Kullanıcılarımızın güvenliğini yönetmek için, şifrelerini asla düz metin biçiminde saklamıyoruz, bunun yerine şifrenin özetini saklıyoruz. Hashing tersine çevrilebilir bir işlem değildir, parola kurtarılamaz. Ancak parola kırılabilir ve kırmayı mümkün olduğunca zorlaştırmak için güvenli bir algoritma kullanmamız gerekir. Nette\Security\Passwords sınıfı bize bu konuda yardımcı olacaktır.
Çerçeve, DI konteynerine security.passwords
adı altında otomatik olarak bir
Nette\Security\Passwords
hizmeti ekler ve bunu bağımlılık enjeksiyonu kullanarak
geçirirsiniz:
use Nette\Security\Passwords;
class Foo
{
public function __construct(
private Passwords $passwords,
) {
}
}
__construct ($algo=PASSWORD_DEFAULT, array $options=[]): string
Hashing için hangi güvenli algoritmanın kullanılacağını ve bunun nasıl yapılandırılacağını seçer.
Varsayılan değer PASSWORD_DEFAULT
olduğundan algoritma seçimi PHP'ye bırakılmıştır. Algoritma, daha yeni
ve daha güçlü hash algoritmalarının desteklendiği yeni PHP sürümlerinde değişebilir. Bu nedenle, elde edilen hash'in
uzunluğunun değişebileceğinin farkında olmalısınız. Bu nedenle, elde edilen hash'i yeterli karakteri saklayabilecek
şekilde saklamalısınız, 255 önerilen genişliktir.
Bu, bcrypt algoritmasını nasıl kullanacağınızı ve varsayılan 10'dan maliyet parametresini kullanarak karma hızını nasıl değiştireceğinizi gösterir. 2020 yılında, maliyet 10 ile bir parolanın hashlenmesi yaklaşık 80 ms, maliyet 11 160 ms, maliyet 12 ise 320 ms sürer, ölçek logaritmiktir. Ne kadar yavaş olursa o kadar iyidir, maliyet 10–12 çoğu kullanım durumu için yeterince yavaş kabul edilir:
// şifreleri bcrypt algoritmasının 2^12 (2^maliyet) iterasyonu ile hash edeceğiz
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]);
Bağımlılık enjeksiyonu ile:
services:
security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])
hash (string $passwords): string
Parolanın özetini oluşturur.
$res = $passwords->hash($password); // Parolayı karma hale getirir
Sonuç $res
, hash'in kendisine ek olarak kullanılan algoritmanın tanımlayıcısını, ayarlarını ve
kriptografik tuzu (aynı parola için farklı bir hash oluşturulmasını sağlayan rastgele veriler) içeren bir dizedir. Bu
nedenle geriye dönük olarak uyumludur, örneğin parametreleri değiştirirseniz, önceki ayarlar kullanılarak saklanan
karmalar doğrulanabilir. Bu sonucun tamamı veritabanında saklanır, bu nedenle tuzu veya ayarları ayrı olarak saklamaya gerek
yoktur.
verify (string $password, string $hash): bool
Verilen parolanın verilen hash ile eşleşip eşleşmediğini bulur. Veritabanından $hash
adresini kullanıcı
adı veya e-posta adresine göre alır.
if ($passwords->verify($password, $hash)) {
// Doğru şifre
}
needsRehash (string $hash): bool
Hash'in yapıcıda verilen seçeneklerle eşleşip eşleşmediğini bulur.
Örneğin hash parametrelerini değiştirirken bu yöntemi kullanın. Parola doğrulama, hash ile birlikte saklanan
parametreleri kullanır ve needsRehash()
true değerini döndürürse, hash'i bu kez güncellenmiş parametrelerle
yeniden hesaplamanız ve tekrar veritabanında saklamanız gerekir. Bu, kullanıcılar oturum açarken parola özetlerinin
otomatik olarak “yükseltilmesini” sağlar.
if ($passwords->needsRehash($hash)) {
$hash = $passwords->hash($password);
// $hash'i veritabanına kaydet
}