Web uygulamalarında kullanıcı şifrelerinin güvenliği en kritik konulardan biridir. Şifrelerin düz metin (plain text) olarak veritabanında tutulması, sistemin ele geçirilmesi durumunda tüm kullanıcı hesaplarının tehlikeye girmesine neden olur.
Bu nedenle PHP uygulamalarında:
Şifreleme (Encryption) ve Hashleme (Hashing) Arasındaki Fark
Verileri şifrelemek için HASHING yöntemi dışında md5($sifre); sha1($sifre); hash('sha256', $sifre); yöntemleri kullanılır.
| Özellik |
Encryption |
Hashing |
| Geri döndürülebilir mi? |
Evet |
Hayır |
| Anahtar gerekir mi? |
Evet |
Hayır |
| Şifre saklama için uygun mu? |
❌ |
✅ |
Şifreler asla geri çözülebilir şekilde saklanmamalıdır. Bu yüzden php hashleme yöntemi tercih edilmelidir..
Güvensiz Yöntemler
md5($sifre); sha1($sifre); hash('sha256', $sifre); gibi yöntemler Salt anahtarı olmadığı, Rainbow table saldırılarına açık oldukları ve çok hızlı çalışıtıkları için HASHING yöntemibne nazaran güvensizdir.
❌ Modern uygulamalarda kesinlikle kullanılmamalıdır
PHP’de Güvenli Şifre Hashleme (Önerilen Yöntem)
PHP, şifre güvenliği için özel fonksiyonlar sunar:
✔ password_hash()
✔ password_verify()
Bu fonksiyonlar:
password_hash() ile Şifre Kaydetme
password_hash() fonksiyonu ile gelen şifre verisi, HASH yöntemi ile şifrelenir..
Kullanıcı Kayıt Örneği (PDO)
$sifre = $_POST['sifre'];
$hashliSifre = password_hash($sifre, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (username, password) VALUES (:username, :password)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':username' => $_POST['username'],
':password' => $hashliSifre
]);
PASSWORD_DEFAULT:
Algoritma Seçenekleri
a) Bcrypt
password_hash($sifre, PASSWORD_BCRYPT);
b) Argon2 (PHP 7.2+)
password_hash($sifre, PASSWORD_ARGON2ID);
***Argon2ID, günümüzde en güvenli kabul edilen algoritmalardan biridir.
Kullanıcı Girişi (Şifre Doğrulama)
Hashing yöntemi ile Şifre karşılaştırılmaz, doğrulanır.
$sql = "SELECT password FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':username' => $_POST['username']
]);
$user = $stmt->fetch();
if ($user && password_verify($_POST['sifre'], $user['password'])) {
echo "Giriş başarılı";
} else {
echo "Hatalı kullanıcı adı veya şifre";
}
password_verify():
Salt Nedir ve Neden Önemlidir?
Salt, her şifreye eklenen rastgele bir değerdir.
Örnek:
123456 + X9#fA
Avantajları:
*** password_hash() bunu otomatik yapar, ekstra işlem gerekmez.
Şifre Güncelleme (Rehash)
Zamanla algoritmalar güçlenebilir. PHP bunu kontrol edebilir:
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$newHash = password_hash($sifre, PASSWORD_DEFAULT);
}
Güvenlik İçin Ek Tavsiyeler
✔ Şifre minimum uzunluk: 8–12 karakter
✔ Büyük harf, küçük harf, rakam, özel karakter
✔ HTTPS kullan
✔ Login deneme sınırı koy
✔ SQL Injection için PDO + prepared statements kullan
Özetle
PHP PDO ile şifre saklarken:
Görüşmek üzere..