Şifre Karma İşlemi
Kullanıcılarımızın güvenliğini sağlamak için şifrelerini okunabilir biçimde saklamıyoruz, yalnızca özetlerini (hash olarak adlandırılır) saklıyoruz. Özeten orijinal şifreyi geri oluşturmak mümkün değildir. Özeti oluşturmak için güvenli bir algoritma kullanmak önemlidir. Nette\Security\Passwords sınıfı bu konuda bize yardımcı olur.
Framework, DI konteynerine otomatik olarak security.passwords
adı altında Nette\Security\Passwords
türünde bir servis ekler, buna dependency
injection kullanarak erişebilirsiniz.
use Nette\Security\Passwords;
class Foo
{
public function __construct(
private Passwords $passwords,
) {
}
}
__construct ($algo=PASSWORD_DEFAULT, array $options=[]): string
Hash oluşturmak için hangi güvenli algoritmanın kullanılacağını seçer ve parametrelerini yapılandırırız.
Varsayılan olarak PASSWORD_DEFAULT
kullanılır, yani algoritma seçimi PHP'ye bırakılır. Daha yeni, daha
güçlü karma algoritmaları ortaya çıkarsa, algoritma daha yeni PHP sürümlerinde değişebilir. Bu nedenle, sonuçta ortaya
çıkan hash'in uzunluğunun değişebileceğinin farkında olmalısınız ve yeterli karakter alabilecek bir şekilde
saklamalısınız, 255 önerilen genişliktir.
Bcrypt algoritmasının karma hızını cost parametresini değiştirerek ayarlama örneği: (2020'de varsayılan 10'dur, şifre karma işlemi yaklaşık 80ms sürer, cost 11 için yaklaşık 160ms, cost 12 için yaklaşık 320ms, ne kadar yavaşsa o kadar iyi koruma, 10–12 hızı zaten yeterli koruma olarak kabul edilir)
// şifreleri bcrypt algoritmasının 2^12 (2^cost) iterasyonuyla karma yapacağız
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]);
Dependency injection kullanarak:
services:
security.passwords: Nette\Security\Passwords(::PASSWORD_BCRYPT, [cost: 12])
hash (string $passwords): string
Şifrenin hash'ini oluşturur.
$res = $passwords->hash($password); // Şifreyi hash'ler
$res
sonucu, hash'in kendisinin yanı sıra kullanılan algoritmanın tanımlayıcısını, ayarlarını ve
kriptografik tuzu (aynı şifre için farklı bir hash oluşturulmasını sağlayan rastgele veriler) içeren bir dizedir. Bu
nedenle geriye dönük uyumludur, örneğin parametreleri değiştirirseniz, önceki ayarları kullanarak saklanan hash'ler bile
doğrulanabilir. Tüm bu sonuç veritabanına kaydedilir, bu nedenle tuzu veya ayarları ayrı ayrı kaydetmeye gerek yoktur.
verify (string $password, string $hash): bool
Verilen şifrenin verilen özete karşılık gelip gelmediğini kontrol eder. $hash
'i, girilen kullanıcı adına
veya e-posta adresine göre veritabanından alın.
if ($passwords->verify($password, $hash)) {
// doğru şifre
}
needsRehash (string $hash): bool
Hash'in yapıcıda belirtilen seçeneklere karşılık gelip gelmediğini kontrol eder.
Örneğin karma hızını değiştirdiğinizde kullanışlıdır. Doğrulama, saklanan ayarlara göre gerçekleşir ve
needsRehash()
true
döndürürse, hash'i yeni parametrelerle yeniden oluşturmak ve tekrar
veritabanına kaydetmek gerekir. Bu şekilde, saklanan hash'ler kullanıcılar giriş yaptığında otomatik olarak
“yükseltilir”.
if ($passwords->needsRehash($hash)) {
$hash = $passwords->hash($password);
// $hash'i veritabanına kaydet
}