Bir bcrypt hash'i "çözülemez": bir şifrenin doğru olup olmadığını öğrenmek için Doğrula modunu kullanın. Her şey tarayıcınızda hesaplanır ve şifre hiçbir sunucuya gönderilmez.
Güncel sürüm. OpenBSD, Node.js, Python, Go ve Rust bunu üretir.
Maliyetteki her artış hesaplama süresini iki katına çıkarır. OWASP en az 10 önerir; ideal olan, sunucunuzun yaklaşık 250 ms'de hesaplayabildiği en yüksek değerdir.
Nasıl çalışır
bcrypt, şifreleri saklamak için tasarlanmış bir hash fonksiyonudur. Mikrosaniyeler içinde hesaplanan SHA-256 veya MD5'in aksine bcrypt bilerek yavaştır: böylece bir veritabanını çalan kişinin kaba kuvvetle şifre denemesi yıllar sürer.
Her hash, doğrulanması için gereken her şeyi içerir: algoritma sürümü, maliyet ve 128 bitlik rastgele bir salt. Bu yüzden aynı şifre her seferinde farklı bir hash verir ve salt'ı ayrıca saklamaya gerek yoktur.
Maliyet, tur sayısının 2 tabanında logaritmasıdır: maliyet 10 ile 1024 tur, 12 ile 4096 tur hesaplanır. Bir puan artırmak hesaplama süresini iki katına çıkarır; bu da algoritmayı değiştirmeden donanım gücündeki artışa ayak uydurmayı sağlar.
Örnekler
rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aPHP kılavuzundaki password_verify() örneği: bu şifreyle Doğrula moduna yapıştırın, eşleşecektir.abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0iMaliyeti 6 olan bir jBCrypt test vektörü. Maliyetten sonraki ilk 22 karakter salt, kalan 31 karakter sonuçtur.Kullanım senaryoları
- Bir yönetici kullanıcının başlangıç şifresinin hash'ini doğrudan veritabanına eklemek için oluşturmak.
- Bir kullanıcı oturum açamadığında şifrenin kayıtlı hash ile eşleşip eşleşmediğini kontrol etmek.
- Laravel, Spring, Django veya Node.js uygulamalarının fixture, seed veya otomatik testleri için test hash'leri üretmek.
- Sunucuda yapılandırmadan önce uygun değeri seçmek için her maliyetin ne kadar sürdüğünü ölçmek.
- $2y$ önekli bcrypt hash'lerini kabul eden Apache .htpasswd dosyaları için kayıt oluşturmak.
Sık sorulan sorular
Bir bcrypt hash'i çözülebilir mi?
Hayır. bcrypt tek yönlü bir fonksiyondur: hash'ten şifreyi elde etmenin hiçbir yolu yoktur. Yapılabilecek tek şey aday şifreleri deneyip birinin eşleşip eşleşmediğine bakmaktır; bcrypt'in yavaşlattığı da tam olarak budur.
$2a$, $2b$ ve $2y$ arasındaki fark nedir?
Normal şifreler için üçü de aynı sonucu hesaplar. $2a$ orijinal sürümdür; $2y$'yi PHP 2011'de kendi hash'lerini hatalı bir uygulamanınkilerden ayırmak için getirdi; $2b$'yi OpenBSD 2014'te 255 karakterden uzun şifrelerle ilgili başka bir hatayı düzeltirken benimsedi. Neredeyse tüm kütüphaneler doğrulamada üçünü de kabul eder.
Hangi maliyeti kullanmak gerekir?
OWASP en az 10 önerir. İdeal olan, sunucunuzun oturum açma başına yaklaşık 250 ms'de hesaplayabildiği en yüksek değerdir. Spring Security varsayılan olarak 10 kullanır; Laravel 11 ve PHP 8.4 kendi değerlerini 12'ye yükseltti.
bcrypt neden 72 baytı aşan kısmı yok sayar?
Algoritma şifreyi en fazla 72 bayt kabul eden bir Blowfish anahtarı olarak kullanır. Fazlası uyarı vermeden atılır, bu yüzden ilk 72 baytı aynı olan iki şifre aynı hash'i verir. Türkçe karakterler (ç, ğ, ş gibi) veya emojiler iki ila dört bayt kaplar; bu yüzden araç karakterleri değil baytları sayar.
bcrypt mi daha iyi, Argon2 mi?
Argon2id bugün yeni sistemler için önerilen algoritmadır, çünkü yavaş olmasının yanı sıra çok bellek kullanır ve bu da GPU saldırılarını pahalılaştırır. Yine de bcrypt uygun bir maliyetle güvenli olmaya devam eder ve PHP, Laravel, Spring ve Ruby on Rails'te varsayılandır.
Şifrem bir sunucuya gönderiliyor mu?
Hayır. Hash ve doğrulama tarayıcınızda hesaplanır ve şifre cihazınızdan asla çıkmaz; aracı paylaşma bağlantısına da eklenmez.