İletişim

Nonce Nedir?

Kısa tanım

Nonce (number used once), bir kriptografik işlemde ya da protokol mesajında yalnızca bir kez kullanılmak üzere üretilen benzersiz, çoğu zaman rastgele değerdir. Kaydedilip yeniden gönderilen mesajların kabul edilmesini önlemek (replay koruması), aynı anahtarla yapılan şifrelemelerin birbirinden ayrışmasını sağlamak ve Content Security Policy'de yalnızca izin verilen satır içi script'lerin çalışmasına olanak tanımak için kullanılır.

Diğer adları: Number used once, Kriptografik nonce, Tek kullanımlık sayı, CSP nonce

Sunucunun tek kullanımlık bir nonce verdiğini, ilk isteği kabul edip aynı nonce ile tekrarlanan isteği reddettiğini gösteren dizi

Benzersizlik mi, tahmin edilemezlik mi?

Her nonce bir kez kullanılmak üzere üretilir, ama farklı bağlamlar ondan farklı şeyler bekler. Bazı yerlerde yalnızca benzersizlik yeterlidir: aynı anahtarla yapılan her şifrelemede değerin bir daha tekrarlanmaması önemlidir, bu yüzden düzenli artan bir sayaç bile iş görür. Bazı yerlerde ise tahmin edilemezlik şarttır: bir saldırgan değeri önceden kestirebiliyorsa korumanın anlamı kalmaz. Bir nonce'un nasıl üretileceğine karar vermeden önce hangi özelliğe ihtiyaç duyulduğunu bilmek gerekir. Şüphede kalındığında kriptografik olarak güvenli bir rastgele sayı üreteci her iki koşulu da karşılar.

Tekrar (replay) saldırılarına karşı

Ağ üzerinden geçen geçerli bir mesajı kaydedip daha sonra olduğu gibi yeniden göndermek, imzayı veya şifreyi kırmayı gerektirmez. Nonce bu yüzden kullanılır: sunucu her işlem için yeni bir değer verir ya da istemciden yeni bir değer bekler, değeri kabul ettiği anda kullanılmış olarak işaretler ve aynı değeri taşıyan ikinci mesajı reddeder. Kullanılmış değerleri sonsuza kadar saklamamak için nonce genellikle bir zaman damgasıyla birlikte kullanılır; belirli bir süreden eski mesajlar zaten reddedildiği için yalnızca o pencere içindeki değerleri hatırlamak yeterlidir.

Bu desen pek çok protokolde karşımıza çıkar. OpenID Connect'te istemci giriş isteğine bir nonce ekler ve dönen ID token'da aynı değeri arar; böylece başka bir oturum için üretilmiş bir token'ın araya sokulması engellenir. Webhook imzalarında ise gövde bir zaman damgasıyla birlikte HMAC ile imzalanır ve eski tarihli imzalar reddedilir.

Şifrelemede nonce: tekrarlanmaması hayati

AES-GCM ve ChaCha20-Poly1305 gibi modern şifreleme yöntemleri, her şifreleme işleminde anahtarla birlikte bir nonce (bu bağlamda IV, başlatma vektörü de denir) kullanır; AES-GCM'de bu değer tipik olarak 96 bittir. Nonce gizli değildir ve şifreli metinle birlikte açıkça gönderilir. Ancak aynı anahtarla aynı nonce'un iki kez kullanılması ciddi sonuçlar doğurur: GCM'de iki mesajın içeriği hakkında bilgi sızar ve kimlik doğrulama garantisi zayıflar. Bu yüzden nonce yönetimini elle yapmak yerine bu işi doğru yapan, yerleşik kriptografi kütüphanelerinin üst düzey arayüzlerini kullanmak gerekir.

CSP nonce: satır içi script'e tek tek izin

Content Security Policy, sayfada hangi script'lerin çalışabileceğini sınırlar. Satır içi script'lerin hepsine izin veren 'unsafe-inline' yerine nonce kullanıldığında, yalnızca sunucunun o yanıt için ürettiği değeri taşıyan script'ler çalışır:

Content-Security-Policy: script-src 'nonce-rT8xZq3VbN1kLmP0aWc5Yg=='

<script nonce="rT8xZq3VbN1kLmP0aWc5Yg==">
  window.dataLayer = window.dataLayer || [];
</script>

Bir XSS açığından sayfaya enjekte edilen script doğru değeri bilemeyeceği için engellenir. Bunun çalışması için üç koşul vardır: değer her yanıtta yeniden ve en az 128 bit rastgelelikle üretilmeli, HTML'e kullanıcı girdisi yoluyla değil sunucu şablonu tarafından yazılmalı ve aynı nonce'u içeren HTML bir CDN'de herkese aynen sunulacak şekilde önbelleğe alınmamalıdır. Önbelleğe alınan sabit bir nonce, herkesin bildiği bir parolaya dönüşür. Tarayıcılar da kendi tarafında önlem alır: getAttribute("nonce") boş döner, değere yalnızca DOM özelliği üzerinden erişilebilir. Ayrıntılar MDN'nin nonce sayfasında anlatılıyor.

WordPress nonce'ları: adı aynı, işlevi farklı

WordPress geliştiricileri “nonce” kelimesini en çok formlardaki _wpnonce alanından tanır. WordPress belgelerinin kendisi de bunların gerçek anlamda nonce olmadığını belirtir: tek kullanımlık değildir, varsayılan ayarlarla 12 ile 24 saat arasında geçerli kalır. Görevi, isteğin kullanıcının bilinçli bir eylemi olduğunu doğrulayarak CSRF riskini azaltmaktır. Belgeler, nonce'a yetkilendirme için güvenilmemesi gerektiğini ve kullanıcının işlemi yapma yetkisinin ayrıca kontrol edilmesi gerektiğini vurgular.

İlgili terimler

← Sözlüğe dön