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

Kurulum ve Gereksinimler

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
}
versiyon: 4.0