Parola Karma Üreteci & Doğrulayıcı

Parolaları bcrypt, scrypt, Argon2id ve PBKDF2 ile tamamen tarayıcınızda karmalayın ve doğrulayın — PHC biçimli dizeler üretin, adayı mevcut bir karmayla denetleyin ve içinde gizlenmiş parametreleri inceleyin. Hiçbir şey yüklenmez.
Yalnızca test parolaları için. Gerçek kullanıcı parolaları hiçbir web sayfasına yapıştırılmamalıdır. Bu araç tamamen tarayıcınızda çalışır — dizeler sekmenizden asla çıkmaz — ama gerçek bir ihlal tek bir yapıştırmayla başlar.
bcrypt maliyeti (2^maliyet tur)
bcrypt varyantı varyant yalnızca öneki değiştirir; karmanın kendisi aynıdır
scrypt N (CPU maliyeti)
scrypt r / p r =   p = blok boyutu 128·r bayt; bellek = 128·N·r bayt (N=214, r=8 → 16 MiB)
Argon2id m (bellek)
Argon2id t / p t =   p = t = geçiş sayısı; p = paralellik (şeritler)
PBKDF2 PRF
PBKDF2 yineleme sayısı  OWASP 2023: HMAC-SHA-256 için 600.000 (SHA-1 için 1.300.000, SHA-384/512 için 210.000)
Çıktı uzunluğu (bayt)  bcrypt çıktısı 23 bayta sabit (31 bcrypt-base64 karakteri)
AlgoritmaParametrelerBellekÇıktı uzunluğuSüre (bu tarayıcı)
bcryptmaliyet 124 KiB23 bayt-
scryptN=214, r=8, p=116 MiB32 bayt-
Argon2idm=19 MiB, t=2, p=119 MiB32 bayt-
PBKDF2HMAC-SHA-256, 600.000 yineleme~032 bayt-
Parametre kopya kağıdı (OWASP Parola Depolama Kopya Kağıdı, 2023 asgari değerleri)
AlgoritmaAsgariNotlar
Argon2idm = 19 MiB (19.456 KiB), t = 2, p = 1tercih edilen; bellek açlığı çeken
scryptN = 214, r = 8, p = 1bellek açlığı (asgari 16 MiB)
bcryptmaliyet = 10yalnızca iş faktörü; 72 baytlık parola sınırı
PBKDF2-HMAC-SHA256600.000 yinelemeyalnızca yineleme sertliği — GPU dostu, son tercih
Bu sayfadaki varsayılanlar her asgari değerin üzerinde veya tam üzerindedir. Üretim için önce Argon2id'yi seçin; kullanılamıyorsa scrypt ya da bcrypt; PBKDF2'yi yalnızca FIPS uyumluluk gerekçeleriyle kullanın.
PHP uyumluluğu — password_hash($pw, PASSWORD_BCRYPT) $2y$10$... üretir: bunu aday parolayla birlikte Doğrula'ya yapıştırın; bu sayfa tam olarak password_verify()'in ne yanıtlayacağını yanıtlar. PASSWORD_ARGON2ID çıktısı ($argon2id$v=19$m=65536,t=4,p=1$...) de doğrulanır. passlib, django-argon2 ve crypto.scrypt sarmalamasından gelen PHC dizeleri de ayrıştırılır.
Öz test
Sayfa motorunu genel vektörlere karşı yeniden çalıştırır: bcrypt için crypt_blowfish test paketi, node/OpenSSL tarafından üretilmiş scrypt ve Argon2id dizeleri, RFC 6070'in PBKDF2 vektörleri ve genel SHA-256 kümesi, ayrıca her algoritmada üret-sonra-doğrula gidiş-dönüşleri ve negatif testler (yanlış parola başarısız olmalı, bozuk dizeler reddedilmelidir). Hiçbir şey hiçbir yere gönderilmez.
Parola karmalama sıfırdan açıklanıyor
Tek cümleyle: bir parola karması bilerek yavaş olur (ve tercihen bellek açlığı çeker); böylece veritabanını çalmak bir saldırganın saniyede milyarlarca tahmin denemesine izin vermez — hızlı bir karma olan SHA-256'nın tersi amaç, o hız için tasarlanmıştır.
Neden parolayı yalnızca SHA-256 ile karmalamıyoruz?

Modern bir GPU'da SHA-256 saniyede milyarlarca tahmin çalıştırır. 8 karakterlik bir parolanın kombinasyon sayısı 1013'ün çok altındadır — saatlerce GPU süresi, büyük bir düzenekte dakikalar. Parola karma fonksiyonları (KDF'ler) bunu maliyet parametreleriyle önler: bcrypt çekirdeğini 2maliyet kez tekrarlar, PBKDF2 HMAC'i yüz binlerce kez yineler, scrypt ve Argon2id ayrıca her tahmin için megabaytlarca bellek ister; böylece GPU'lar (hızlı ama çekirdek başına bellek kıt) avantajlarını yitirir. Tuz — rastgele, karma dizesinin içinde açıkça saklanan — önceden hesaplanmış gökkuşağı tablolarını durdurur ve her tahmini her kullanıcı için yeniden hesaplamaya zorlar.

Bu sayfadaki dört algoritma
AlgoritmaYılSertlikİmza biçimiDikkat edilecekler
bcrypt1999CPU (2maliyet anahtar kurulumu)$2b$12$ + 22 karakterli tuz + 31 karakterli karma72 baytlık parola sınırı (72'den sonrası sessizce yok sayılır); özgün C uygulamasında NUL baytı parolayı bitirir
PBKDF22000 (RFC 2898/8018)CPU (yinelemeler)$pbkdf2-sha256$i=600000$ + tuz + karma (passlib tarzı)bellek maliyeti yok — GPU'lar ve ASIC'ler bunu sever; yalnızca yineleme sayısı ayarlanabilir
scrypt2009 (RFC 7914)CPU + bellek (128·N·r bayt)$scrypt$ln=14,r=8,p=1$ + tuz + karmaN iki kuvveti olmalı; bellek r ile doğrusal büyür
Argon2id2015 (PHC kazananı, RFC 9106)CPU + bellek (m KiB, t geçiş)$argon2id$v=19$m=19456,t=2,p=1$ + tuz + karmaArgon2i (veriden bağımsız) ile Argon2d (veriye bağlı) ile Argon2id (karma) — neden olmadığını bilmiyorsanız her zaman id'yi seçin
Bellek sertliği ile hesaplama sertliği

Bir GPU binlerce çekirdeğe sahiptir ama her çekirdek yalnızca az miktarda hızlı belleğe erişir. Tahmin başına 19 MiB çalışma kümesi isteyen bir KDF, saldırganın paralel tahmin sayısını sahip olduğu 19 MiB'lık bellek parçası sayısıyla sınırlar — bu yüzden 19 MiB'de Argon2id, dizüstü bilgisayarınızda daha az duvar saati süresi almasına rağmen pratikte maliyet 15'teki bcrypt'ten daha güçlü olabilir. PBKDF2'nin buna cevabı yoktur: tek ayarı yineleme sayısıdır ve silikon bunu doğrusal olarak ölçekler.

Bir PHC dizesini okumak

Değiştirilmiş-kripto / PHC biçimi kendini tanımlar: $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... içinde alanlar algoritma, sürüm, parametreler (m = KiB cinsinden bellek, t = geçiş sayısı, p = şerit sayısı), base64 tuz ve base64 karmadır. bcrypt standardından önce gelir ve kendi kompakt biçimini kullanır: $2b$ varyantı, 12 maliyeti, sonra tuz ve karma bcrypt'in özel base64 alfabesinde (./A-Za-z0-9). Bu sayfanın Doğrula bölümü bunların hepsini kabul eder ve ayrıştırılmış alanları gösterir — bulduğunuz herhangi bir karmayı yapıştırın ve neye ayrıştığını görün.

Yaygın hatalar
  • Parolalar için hızlı karma. MD5/SHA-1/SHA-256 parola sütunları, saniyede milyarlarca tahminle sıradan GPU'lara düşer. Dosyalar ve veriler için Karma Üreteci'ni, parolalar için bu sayfanın algoritmalarını kullanın.
  • Tuzu paylaşmak. Tüm kullanıcılar için tek bir tuz, eşit parolaların eşit karmalara sahip olması ve gökkuşağı tablolarının geri dönmesi demektir. Buradaki her karma taze bir 16 baytlık rastgele tuz alır.
  • bcrypt'in 72 baytını yok saymak. "a"*100 ve "a"*72 aynı şekilde karmalanır — kuyruk düşürülür. Bu sayfa parola 72 baytı aştığında giriş kutusunda uyarır. Argon2'de böyle bir sınır yoktur.
  • Karmaları kendi kodunuzda == ile karşılaştırmak. Doğrulama sabit zamanlı olmalıdır; sayfa motoru bunu dahili olarak yapar (saklanan baytları yeniden hesaplar ve karşılaştırır), ama yaklaşımı kopyalarsanız sabit zamanlı bir karşılaştırma kullanın.
  • Parametreleri hızlı bir geliştirme makinesinde ayarlamak. Hedef, iş istasyonunuzda değil, üretim kullanıcılarınızın medyan donanımında yaklaşık 250–500 ms karmalamadır. Kıyaslama düğmesi, bu tarayıcının gerçekte neyi deneyimlediğini gösterir.
  • Her oturum açma denetiminde yeniden karmalamak. Önce doğrulayın; yalnızca başarılı bir doğrulamadan sonra yeniden karmalayın (ör. maliyeti artırmak için) ve yeni dizeyi saklayın. PHP'nin password_needs_rehash() işlevi tam olarak bunun için vardır.
SSS

Hangisini seçmeliyim? En azından OWASP asgarisi olan Argon2id. Çalışma zamanı bunu sunmuyorsa: scrypt, sonra bcrypt (karmalamanın ≥250 ms sürmesi için maliyetle). PBKDF2'yi yalnızca sertifikasyon gerektirdiğinde kullanın.

Neden çıktı dizesinde rastgele bir tuz gösteriliyor? Tuz gizli değildir — bilerek PHC dizesinin içinde açıkça saklanır, bu yüzden doğrulama yalnızca dizeye ve aday parolaya ihtiyaç duyar. Görevi gizlilik değil, benzersizliktir.

Varyant önemli mi ($2a$ / $2b$ / $2y$)? ASCII parolalar için aynı karmaları üretirler; $2a$ 1990'ların özgün biçimidir, $2b$ nadir bir işaret genişletme hatasını düzeltti (2014), $2y$ ise düzeltmenin mevcut olduğunu gösteren PHP işaretidir. Doğrula üçünü de kabul eder.

Bir karma ne kadar sürmeli? Sunucu donanımında oturum açma başına yaklaşık 250–500 ms. 100 ms'nin altında çevrimdışı kırma ucuzdur; 1 sn'nin üstünde ise güvenlik iyileşmeden önce kullanıcılar şikâyet eder.

Başka bir yerde üretilmiş bir karmayı doğrulayabilir miyim? Evet — yapıştırın ve aday parolayı verin. Bilinen iyi biçimler: PHP password_hash (bcrypt $2y$ ve Argon2id), Python passlib, django'nun argon2 karmalayıcısı ve Tarsnap'in scrypt aracının kullandığı scrypt dize biçimi.

"Kıyaslama" düğmesi ne yapar? Mevcut parolayı her algoritma ile sayfa varsayılanı parametrelerle bir kez karmalar ve bu tarayıcıdaki duvar saati süresini bildirir — maliyet farkları için bir his, titiz bir ölçüm değil.