İçindekiler
Parolalar uzun yıllardır dijital dünyanın kapı anahtarlarıydı; ne var ki unutuluyor, tekrar kullanılıyor, oltalama sitelerine yazılıyor ve veri tabanlarından çalınıyorlar. FIDO2 ve WebAuthn ise kullanıcıdan ezberlenebilir bir sır istemek yerine cihazdaki güvenli donanımı ve açık anahtarlı kriptografiyi kullanıyor. Böylece parmak izi, yüz tanıma veya PIN ile onaylanan giriş işlemi sırasında sunucuya biyometrik veri değil, alan adına bağlı kriptografik bir kanıt gönderiliyor. ``
FIDO2 hangi parçalardan oluşur?
FIDO2, tek bir protokolün adı olmaktan çok iki temel bileşenin oluşturduğu bir ekosistemdir:
- WebAuthn: Tarayıcı ile web uygulaması arasındaki standart JavaScript API’sidir.
- CTAP2: Bilgisayar veya telefon ile güvenlik anahtarı gibi harici bir doğrulayıcı arasındaki iletişimi tanımlar.
Doğrulayıcı, cihazın güvenli çipi, telefonun ekran kilidi altyapısı veya USB/NFC güvenlik anahtarı olabilir. Parmak izi burada özel anahtarın kullanılmasına izin veren yerel kilittir. Biyometrik şablon normal şartlarda cihazdan çıkmaz.
| Özellik | Parola | FIDO2/WebAuthn |
|---|---|---|
| Sunucuda tutulan veri | Parola özeti | Açık anahtar |
| Kullanıcının hatırladığı sır | Gerekli | Genellikle gereksiz |
| Oltalama direnci | Düşük | Yüksek, alan adına bağlı |
| Veri sızıntısının etkisi | Çevrimdışı tahmin mümkün | Açık anahtar tek başına kullanılamaz |
| Giriş kanıtı | Paylaşılan sır | Sayısal imza |
Kayıt töreni nasıl çalışır?
Sunucu önce rastgele ve tek kullanımlık bir challenge üretir. Tarayıcı bunu doğrulayıcıya iletir. Doğrulayıcı, ilgili siteyi temsil eden RP kimliği için yeni bir anahtar çifti oluşturur:
Sunucu açık anahtarı kullanıcı hesabıyla ilişkilendirir. Özel anahtar dışarı aktarılmadığı için sunucu veri tabanı ele geçirilse bile saldırgan giriş imzası üretemez. Attestation adı verilen isteğe bağlı mekanizma, anahtarın hangi doğrulayıcı türünde üretildiği hakkında ayrıca kanıt sağlayabilir; ancak gizlilik gereksinimleri nedeniyle her projede zorunlu tutulmaz.
Tarayıcı tarafında kayıt isteği kabaca şöyledir:
const credential = await navigator.credentials.create({
publicKey: {
challenge: challengeFromServer,
rp: { name: "Örnek Uygulama", id: "example.com" },
user: {
id: userIdBytes,
name: "[email protected]",
displayName: "Ada"
},
pubKeyCredParams: [{ type: "public-key", alg: -7 }],
authenticatorSelection: {
residentKey: "preferred",
userVerification: "required"
}
}
});
Bu kod anahtarı doğrudan üretmez; işlemi tarayıcı ve doğrulayıcıya devreder. Gerçek uygulamada ikili alanlar Base64URL biçimine dönüştürülerek sunucuya gönderilir ve kayıt yanıtı mutlaka sunucuda doğrulanır.
Giriş sırasında ne imzalanır?
Girişte sunucu yeni bir challenge yollar. Doğrulayıcı kullanıcı onayından sonra challenge, origin ve diğer bağlam verilerini kapsayan içeriği özel anahtarla imzalar:
\[\sigma = \operatorname{Sign}_{K_{özel}}(H(\text{authenticatorData} \parallel \text{clientDataJSON}))\]Sunucu da kayıtlı açık anahtarla $\operatorname{Verify}{K{açık}}(m,\sigma)$ işlemini gerçekleştirir. Challenge’ın tek kullanımlık olması tekrar saldırılarını; origin ve RP ID denetimleri ise kimlik avını engellemeye yardımcı olur. Sahte site, gerçek alan adına bağlı anahtardan geçerli imza isteyemez.
const assertion = await navigator.credentials.get({
publicKey: {
challenge: challengeFromServer,
rpId: "example.com",
userVerification: "required"
}
});
Sunucu; challenge, origin, RP ID özeti, imza ve kullanıcı doğrulama bayraklarını kontrol etmelidir. Yalnızca tarayıcıdan “başarılı” yanıt gelmesine güvenmek ciddi bir güvenlik hatasıdır.
Passkey bunun neresinde?
Passkey, WebAuthn kimlik bilgilerinin kullanıcı dostu ve gerektiğinde uçtan uca şifreli biçimde cihazlar arasında eşitlenebilen yorumudur. Cihaz kaybına karşı kurtarma kolaylığı sağlar. Yine de hesap kurtarma kanalları, oturum çerezleri ve sunucu güvenliği saldırıya açık kalabilir. FIDO2 sihirli değnek değildir; fakat parolayı ve oltalanabilir paylaşılan sır modelini ortadan kaldırarak kimlik doğrulamanın en kırılgan halkasını güçlü biçimde değiştirir.
Yorumlar