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.

Kurulum ve gereksinimler

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