İçeriğe geç
2FAAuth.Work
Dil: Türkçe
9 dk okuma Yazar: 2faauth.work Yayın ilkeleri

TOTP Nasıl Çalışır: 6 Haneli Kodunuzun Matematiği

Zaman tabanlı tek kullanımlık şifre kodlarının nasıl üretildiğini, paylaşılan gizli anahtardan girdiğiniz altı haneye kadar sade bir dille anlatıyoruz.

Bir TOTP Kodu Aslında Nedir

Kimlik doğrulama uygulamanızı açın ve 30 saniyelik ömrünü geri sayan 6 haneli bir sayı görürsünüz. Bu sayı bir TOTP kodudur: zaman tabanlı tek kullanımlık bir şifre olup, önceki HMAC tabanlı şema olan HOTP'nin bir uzantısı olarak RFC 6238'de standartlaştırılmıştır.

Temel fikir şu: kod bir parola değildir. Paylaşılan gizli anahtarı tuttuğunuzun kanıtıdır — 2FA'yı ilk kurduğunuzda cihazınıza yüklenen bir değer. Kod bu gizli anahtardan ve geçerli zamandan türetildiği için her 30 saniyede bir değişir ve siz yazdıktan sonra gören biri için işe yaramaz.

Bunun çalışması için hiçbir şey taşınmaz. SMS yok, giriş sunucusuna bağlantı yok, hiçbir ağ yok. Uygulamanız ve sunucu, kendi saatlerine dayanarak aynı hesaplamayı bağımsız yapar. Aynı girdiler, aynı matematik, aynı kod — işin bütün sırrı bu.

Bu çevrimdışı doğa pratik sonuçlar doğurur:

  • Uçak modunda bile çalışır. Kod üretimi tamamen cihazınızda gerçekleşir; ağa ihtiyaç duymaz.
  • Uygulamayı silmek gizli anahtarı da siler. Yedek kodlarınızı kurulum sırasında kaydedin; aksi halde tek kurtarma yolu servisin destek sürecidir.
  • Gizli anahtar QR kodla aktarılır. Kurulum ekranını herkese açık bir yerde göstermeyin; kodu okuyabilen herkes artık sizinle aynı hesabı "bilir".

Sunucu saatiniz ile cihazınızın saati birkaç dakikadan fazla saparsa kodlar eşleşmez — ilk şüpheleneceğiniz şey bu olmalı.

Paylaşılan Gizli Anahtar: Her Şeyin Başladığı Nokta

Bir hesapta iki faktörlü kimlik doğrulamayı (2FA) etkinleştirdiğinizde, sunucu rastgele bir gizli anahtar oluşturur — genellikle 20 baytlık kriptografik rastgelelik. Bu tek karakter dizisi, sonrasında gelen her şeyin köküdür.

Sunucu bunu size yalnızca bir kez verir, genellikle QR kodu olarak. Piksel deseni gibi görünen şey aslında yalnızca kodlanmış metindir: gizli anahtarın kendisi, Base32 ile yazılmış (A–Z harfleri ve 2–7 rakamları), ayrıca hesap adı ve veren (issuer) bilgisi. Kimlik doğrulayıcı uygulamanız bunu tarar, çözer ve gizli anahtarı yerel olarak saklar.

Bazı siteler QR kodu yerine anahtarı metin olarak da gösterir. Bu durumda uygulamaya elle girmeniz gerekir. Buradaki en yaygın hata, Base32 alfabesinde olmayan 1, 0, 8 veya 9 karakterlerini yazmaktır: 1 yerine I ya da L, 0 yerine O deneyin. Boşlukları ve küçük/büyük harf farklarını uygulamalar genellikle tolere eder.

O andan itibaren aynı gizli anahtarın iki kopyası vardır: biri sunucuda, biri uygulamanızda. Hiçbiri bir daha asla ağ üzerinden gönderilmez. Gelecekteki her kod bu paylaşılan değerden türetilir — bu yüzden onu korumak önemlidir.

QR kodunun ekran görüntüsü, anahtarınızın kalıcı bir kopyasıdır. Onu gören herkes sonsuza kadar geçerli kodlar üretebilir. Tarayın, sonra silin.

Zaman Adımı: Hareketli Bir Sayaç

TOTP ham saati asla doğrudan kullanmaz. Bunun yerine, hem uygulamanız hem de sunucu mevcut Unix zaman damgasını (1970'ten beri geçen saniye) alıp 30'a böler ve kalanı atar:

counter = floor(unix_time / 30)

Sonuç, her 30 saniyede bir artan düz bir tam sayıdır. Yazıldığı anda bu sayaç çok büyük bir sayıdır — ancak uygulama yalnızca iki tarafın da aynı değeri hesapladığını umursar. Aynı sayaç artı aynı gizli anahtar, aynı kod demektir.

Saat Kayması Neden Kodları Bozar

Tüm düzen uyum üzerine kurulu. Telefonunuzun saati 40 saniye gerideyse, sunucu N+1'de olurken siz N sayacını hesaplarsınız — farklı kodlar, "geçersiz kod" hatası, kodu mükemmel yazmış olsanız bile.

Sunucular saatlerin kaydığını bilir, bu yüzden çoğu önceki veya sonraki zaman adımına ait kodu bir tolerans penceresi olarak kabul eder. Örneğin ±1 adım tolerans, kabaca 90 saniyelik bir kabul aralığı yaratır: kendi adımınız, bir önceki ve bir sonraki. Pencereyi genişletmek toleransı artırır ama deneme sayısını da artırdığı için kaba kuvvet saldırılarına yüzey açar; bu yüzden çoğu sunucu pencereyi küçük tutar.

Bunun ötesinde, cihaz saatinizi yeniden eşitleyin (otomatik olarak ayarlayın). Yaygın hata: kullanıcılar kodu tekrar tekrar yazıp yanlış yazdıklarını düşünür; sorun aslında saattir. "Kod doğru, yine reddedildi" durumunda önce telefonun saat ayarını kontrol edin. Yolculuk, pil değişimi veya uçak modundan çıkış sonrası saat kayması sık görülür.

HMAC: Gizli Anahtar ile Sayaçyı Karıştırmak

Her TOTP kodunun merkezinde tek bir fonksiyon vardır: HMAC-SHA1. HMAC, Hash-based Message Authentication Code (Karma tabanlı Mesaj Kimlik Doğrulama Kodu) anlamına gelir ve buradaki görevi basittir — iki girdiyi öngörülemeyen tek bir çıktıya harmanlamak.

İki girdi:

  • Paylaşılan gizli anahtar — yalnızca telefonunuzun ve sunucunun bildiği anahtar
  • Zaman sayacı — her 30 saniyede değişen sayı

HMAC'i anahtarlı bir hash (özet) olarak düşünün. Düz bir hash, veriyi her seferinde aynı şekilde karıştırır. HMAC ise onu anahtara bağlı olarak farklı şekilde karıştırır. Aynı gizli anahtarı 48291 sayacıyla verirseniz her zaman aynı 20 baytlık sonucu alırsınız. Sayacı bir artırın, çıktı tamamen alakasız görünen bir şeye dönüşür.

Bu determinizmin pratik bir sonucu vardır: telefonunuz ve sunucu aynı anahtarı ve aynı sayacı bildikleri için aynı kodu bağımsız olarak hesaplayabilir, hiçbir ağ bağlantısına gerek kalmadan eşleşir. Saatler arasında birkaç saniyelik sapma olsa bile her iki taraf bir pencere öncesinin veya sonrasinin sayacını da hesaplayabilir.

Kritik olan şu: süreç yalnızca tek yönde akar. Milyonlarca çıktı görmek, bir saldırganın gizli anahtar hakkında kullanılabilir hiçbir şey öğrenmesini sağlamaz — tüm düzeni güvenli kılan özellik budur. Bir sonraki kodu tahmin etmek de aynı nedenle mümkün değildir; sayaç 48291'in çıktısını gören biri, 48292'nin çıktısı hakkında HMAC'i tersine çevirmeden hiçbir şey bilemez ve bu, mevcut kriptografiyle pratikte imkânsızdır.

Kısaltma: 20 Bayttan 6 Haneye

HMAC-SHA-1, 20 bayt üretir — bir ekranda anlamlı biçimde gösterilebilecekten çok daha fazlasını. TOTP bunu dinamik kısaltmayla sıkıştırır:

  1. HMAC çıktısının son nibble'ını (en düşük 4 bit) alın. Bu, 0 ile 15 arasında bir sayı verir.
  2. Bunu bir ofset olarak kullanın: çıktıda o konumdan başlayan 4 baytı alın.
  3. Bu 4 baytın en üst bitini maskeyle sıfırlayın; geride 31 bitlik bir tam sayı kalır.

Bu tam sayı görüntülenmek için hâlâ çok büyüktür, bu yüzden 1.000.000'e göre modülüsü alınır. Kalan — 0 ile 999.999 arasında herhangi bir değer — kod olur ve 6 haneye tamamlanacak biçimde sıfırla doldurulur. 4.207 kalanı 042207 olarak görüntülenir.

Dinamik denmesinin nedeni, ofsetin verinin kendisinden gelmesidir: her kod, HMAC çıktısının farklı bir diliminden örnek alır. Ofset sabit olsaydı, her kod aynı baytları kullanır ve çıktının geri kalanı boşa giderdi; veriden türetilen ofset ise bu riski ortadan kaldırır.

En üst bitin maskelenmesi ayrıca pratik bir amaç taşır: işaretli tam sayı yorumlamalarında ortaya çıkabilecek negatif değerleri ve modülüs işleminin tutarsız sonuçlarını engeller. Maskeyle sonuç her zaman pozitiftir.

Bazı hizmetler 7 veya 8 haneli kodlar kullanır; bunun yerine 10.000.000 veya 100.000.000 modülüsü alınır — aynı matematik, daha büyük kod alanı, tahmin edilmesi daha zor. Modülüs değişse bile kısaltma adımları birebir aynıdır; yalnızca son bölme işlemi farklıdır. Bu nedenle 6, 7 veya 8 hanenin güvenlik farkı görece küçüktür: saldırganın deneme hakkı sınırlı olduğu sürece 6 hane yeterlidir ve daha uzun kodlar kullanıcıya yalnızca ek yazma yükü getirir.

Kodun Elle Yazılmasının Neden Güvenli Olduğu

6 haneli bir kod bir milyon olası değer sunar — kağıt üzerinde mütevazı. İşe yaramasını sağlayan şey, yalnızca birkaç deneme hakkınız olmasıdır. Sunucular giriş denemelerine hız sınırı (rate limit) uygular ve tekrarlanan başarısızlıkları reddeder; bu yüzden bir saldırgan kombinasyonları deneyip duramaz. Gerçek savunma kodun uzunluğu değil, hız sınırlandırmadır. Pratikte bu, deneme başına düşen şansın bir milyonda bir değil, çok çok daha düşük olduğu anlamına gelir: birkaç deneme hakkı, bir milyon ihtimali karşısında neredeyse hiçbir şey ifade etmez.

Ayrıca her kodun ömrü kısadır. Kod, 30 saniyelik bir pencereye bağlıdır ve yalnızca çevresinde kısa bir süre kabul edilir; böylece çalınan bir kod, yeniden kullanılabilmekten önce geçersiz hale gelir. Bu yüzden ekranınızdaki bir kodu kimseye göstermemek, mesajla paylaşmamak ve "hemen yazıp silmek" iyi bir alışkanlıktır. Yaygın hata: kodu, sahte bir "destek" görüşmesine okumak — bu, tüm sistemi tek hamlede devre dışı bırakır.

Son olarak, bir kodu görmek gelecek hakkında hiçbir şey göstermez. Kod, gizli anahtarınız kullanılarak yapılan bir HMAC hesaplamasının çıktısıdır. HMAC tek yönlü bir fonksiyondur: çıktı verildiğinde girdiyi yeniden oluşturmanın bir yolu yoktur. Bugünün kodunu bir şekilde gören bir saldırgan gizli anahtarı türetemez ve yarının kodunu tahmin edemez — çünkü altta yatan sayacın eşleme değerini bilmez.

Sık Sorulan Sorular ve Uç Durumlar

Kodlar Neden Çalışmaz

En yaygın neden saat kaymasıdır. Telefonunuzun saati ile sunucunun saati izin verilen aralıkta kalmalıdır; bu nedenle yanlış saat gösteren bir telefon yanlış kodlar üretir. Çözüm: otomatik saat senkronizasyonunu etkinleştirin. Pratikte sunucular genellikle bir önceki ve bir sonraki zaman adımını da kabul eder, yani birkaç saniyelik sapma sorun olmaz; ancak birkaç dakikalık sapma tüm kodları geçersiz kılar. iPhone'da Ayarlar → Genel → Tarih ve Saat → Otomatik seçeneğini, Android'de Ayarlar → Sistem → Tarih ve saat altındaki otomatik zamanı açın.

Yanlış gizli anahtar da sessizce başarısız olur — bu genellikle QR kodunun başka bir hesabın kurulumuna taranması durumunda olur. Örneğin Gmail kurulum ekranını açıkken bir GitHub kodu tararsanız, uygulama iki ayrı hesap için iki ayrı girdi oluşturur; yanlışını seçmek sürekli reddedilmeye yol açar. Kimlik doğrulayıcı uygulamanızda hesap adlarını kontrol edin.

Son olarak, QR kodlarının süresi dolabilir: birçok hizmet, kayıt kodunu kısa bir süre sonra veya ekrandan ilerledikten sonra geçersiz kılar; bu nedenle eski bir ekran görüntüsü işe yaramaz. Kurulumu, QR kodu ekrandayken tamamlayın.

Bir Kod Tekrar Kullanılabilir mi?

Evet, teknik olarak — ancak çoğu sunucu, geçerli zaman adımında zaten kabul edilmiş bir kodu reddeder. Bu, bir kodu görüp saniyeler sonra yeniden oynatan saldırganları engeller. Girdi sayacı uygulamanın içinde saklanır; aynı 30 saniyelik pencerede aynı kodu ikinci kez girmeniz gerekiyorsa, bir sonraki adımı beklemeniz veya sunucunun pencere davranışı bu durumu zaten ele aldığı için beklemeniz gerekir.

Cihazı Kaybederseniz

Paylaşılan gizli anahtar yalnızca cihazınızda bulunur; bu nedenle cihazı kaybetmek erişimi kaybetmek anlamına gelir — 2FA kurulumunda kurtarma kodlarını kaydettiyseniz hariç. Bunları çevrimdışı saklayın: yazdırıp kilitli bir çekmecede tutun veya parola yöneticinizin kasa bölümüne kaydedin. Ekran görüntüsü alıp cihazın kendisinde bırakmak işe yaramaz; cihaz kaybolursa kodlar da onunla gider. Her biri genellikle yalnızca bir kez çalışır, bu nedenle hangi kodu kullandığınızı işaretleyin. Cihaz değiştirmeden önce, kimlik doğrulayıcı uygulamanız sunucuya aktarım (transfer) özelliği sunuyorsa onu kullanın; yoksa her hesap için 2FA'yı eski cihazda devre dışı bırakıp yeniden kurun.

Hepsini Bir Araya Getirmek: Tam Akış

Her şey tek bir boru hattına indirgenir: paylaşılan gizli anahtar → zaman sayacı → HMAC → kırpma → 6 hane.

Baştan sona bir 30 saniyelik döngü:

  • Kurulum sırasında bir QR kodu tararsınız. Uygulamanız paylaşılan gizli anahtarı saklar.
  • 12:04:30'da uygulama geçerli zaman adımını hesaplar (Unix epoch'tan 30 saniyelik parçalar hâlinde sayılırsa kabaca 24.000).
  • HMAC-SHA1 gizli anahtarı o sayaçla harmanlayarak 20 bayt üretir.
  • Kırpma bu baytlardan 4'ünü seçer, bunları bir sayıya dönüştürür ve son 6 haneyi tutar: diyelim 482913.
  • Siz onu yazarsınız. Aynı gizli anahtara sahip sunucu, saat farkları için bir-iki adımlık kaymaya izin vererek birebir aynı hesaplamayı yapar ve kodlar eşleşir.

Küçük ama gerçek bir ayrıntı: 12:04:29'da yazdığınız kod ile 12:04:31'de yazdığınız kod farklı olabilir. Pencere sınırına denk gelirseniz kodun reddedilmesi normaldir; tekrar denemek yeterlidir.

İki alışkanlık tüm zinciri korur:

  • QR koduna bir parola gibi davranın. Ekran görüntüsünü alan biri sizin adınıza sonsuza kadar kod üretebilir.
  • Cihaz saatinizi otomatikte tutun. Sayaç saatten üretilir; birkaç dakikalık sapma bile tüm kodları geçersiz kılar.

Bunları doğru yaptığınızda matematiği kendisi halleder.

Bu rehberi paylaşın

10 dk okuma

2FA'nın Tarihi: Donanım Jetonlarından Geçiş Anahtarlarına

İki faktörlü kimlik doğrulamanın takılıp çıkarılan donanım jetonları ve SMS kodlarından günümüzün kimlik avına dayanıklı geçiş anahtarlarına evrimi — ve her adımın neden gerçekleştiği.

Devamını oku