DJB ve Security-by-Construction: qmail'den Curve25519'e
Daniel J. Bernstein’in security-by-construction fikirlerini—qmail’den Curve25519’e—pratik bir açıdan inceleyen ve “basit, doğrulanabilir kripto”nun uygulamada ne demek olduğunu anlatan yazı.
Jargondan Uzak: Security-by-Construction Ne Anlatıyor?\n\nSecurity-by-construction, yaygın hataların yapılmasını zorlaştıran ve kaçınılmaz hataların zararını sınırlayan bir sistem kurmak demektir. Uzun bir kontrol listesine («X'i doğrula, Y'yi temizle, Z'yi yapılandır…») güvenmek yerine, en güvenli yolun aynı zamanda en kolay yol olması için yazılımı tasarlarsınız.\n\nBunu çocuk güvenlik ambalajına benzetin: herkesin mükemmel dikkatli olacağını varsaymaz; insanların yorgun, meşgul ve bazen yanlış olduğunu varsayar. İyi tasarım, geliştiricilerden, işletmecilerden ve kullanıcılardan beklenen “mükemmel davranış” miktarını azaltır.\n\n### Neden sadelik riski düşürür\n\nGüvenlik sorunları genellikle karmaşıklığın içinde gizlenir: çok fazla özellik, çok fazla seçenek, bileşenler arası çok fazla etkileşim. Her ekstra düğme yeni bir hata durumu yaratabilir—sistemin kırılması veya kötüye kullanılmasının beklenmedik bir yolu.\n\nSadelik iki pratik şekilde yardımcı olur:\n\n- Denetlenecek daha az kod: daha az dal, daha az istisna durumu, daha az gizli davranış.\n- Yanlış yapılandırma için daha az yol: on tane “esnek” seçenek yerine bir güvenli varsayılan olduğunda, kazara güvensizlik için daha az yer vardır.\n\nBu, salt minimalizmle ilgili değil. Amaç, sistem davranış kümesini o kadar küçük tutmaktır ki gerçekten anlayıp test edebilesiniz ve bir şey ters gittiğinde ne olacağını mantıksal olarak çıkarabilesiniz.\n\n### Bu yazıda neler ele alınıyor (neler değil)\n\nBu yazı, Daniel J. Bernstein’in çalışmalarını security-by-construction örnekleri olarak kullanır: qmail’in hata modlarını nasıl azalttığı, sabit-zaman düşüncesinin görünmez sızıntılardan nasıl kaçındığı ve Curve25519/X25519 ile NaCl’in kriptografinin yanlış kullanılmasını zorlaştırmaya nasıl yaklaştığı.\n\nYapmayacağı şeyler: kriptografinin tam tarihini sunmak, algoritmaların güvenliğini ispat etmek ya da her ürün için tek “en iyi” kütüphane olduğunu iddia etmek. Ayrıca iyi primitiflerin her şeyi çözdüğünü de iddia etmeyecek—gerçek sistemler yine anahtar yönetimi, entegrasyon hataları ve işletimsel boşluklar yüzünden başarısız olur.\n\nHedef basit: kriptografi uzmanı olmasanız bile güvenli sonuçları daha olası yapan tasarım kalıplarını göstermek.\n\n## Daniel J. Bernstein Kimdir ve Neden Çalışmaları Atıf Alır\n\nDaniel J. Bernstein (genellikle “DJB”), uygulamalı güvenlik mühendisliğinde sıkça adı geçen bir matematikçi ve bilgisayar bilimcisidir: e-posta sistemleri (qmail), kriptografik primitifler ve protokoller (özellikle Curve25519/X25519) ve gerçek dünyaya kriptografiyi paketleyen kütüphaneler (NaCl).\n\nİnsanlar DJB’yi, güvenlik için tek “doğru” yolu yazdığı için değil, projelerinin ortak bir mühendislik sezgisi seti taşıması ve böylece yanlış gitme yol sayısını azaltması nedeniyle atıf yaparlar.\n\n### Mühendislerin DJB tarzı çalışmalardan ödünç aldığı şeyler\n\nTekrarlayan tema daha küçük, daha sıkı arayüzlerdir. Bir sistem daha az giriş noktası ve daha az yapılandırma seçeneği sunarsa, incelemesi, test etmesi ve yanlış kullanımı zorlaştırması daha kolaydır.\n\nBir başka tema açık varsayımlardır. Güvenlik hataları genellikle rastgele beklentilerden gelir—rastgelelik, zamanlama davranışı, hata işleme veya anahtarların nasıl saklandığı hakkında. DJB’nin yazıları ve uygulamaları tehdit modelini somutlaştırma eğilimindedir: ne korunuyor, kimden ve hangi koşullar altında.\n\nSon olarak, güvenli varsayılanlara ve sıkıcı doğruluğa bir eğilim vardır. Bu gelenekteki birçok tasarım, belirsiz parametreleri, isteğe bağlı modları ve bilgi sızdıran performans kısayollarını ortadan kaldırmaya çalışır.\n\n### Biyografi değil—mühendislik bakışı\n\nBu makale bir yaşam öyküsü veya kişilik tartışması değildir. Mühendislik odaklıdır: qmail, sabit-zaman düşüncesi, Curve25519/X25519 ve NaCl’da gözlemleyebileceğiniz kalıplar ve bu kalıpların üretimde daha doğrulanabilir ve daha az kırılgan sistemler inşa etmeye nasıl dönüştüğü.\n\n## qmail: Daha Az Hata Modu İçin Tasarımın Pratik Bir Örneği\n\nqmail, çok gösterişli olmayan ama kritik bir problemi çözmek için inşa edildi: posta teslimini güvenilir yapmak ve posta sunucusunu yüksek değerli bir hedef olarak ele almak. Posta sistemleri internette durur, gün boyu düşmanca girdiler kabul eder ve hassas verilerle (mesajlar, kimlik bilgileri, yönlendirme kuralları) uğraşır. Tarihsel olarak, tek bir hata monolitik bir posta daemon’unda tam sistem ele geçirmeye ya da kimsenin fark etmediği sessiz mesaj kaybına yol açabilirdi.\n\n### İş böl, patlama yarıçapını küçült\n\nqmail’de belirleyici fikir, “posta teslimi”ni küçük programlara bölmektir: alma, kuyruklama, yerel teslim, uzak teslim vb. Her parça tek bir işi yapar: dar bir arayüz ve sınırlı sorumluluk.\n\nBu ayrım önemlidir çünkü hatalar lokal olur:\n\n- Bir bileşen çökerse, bu otomatik olarak kuyruğu bozmaz veya tüm sistemi devre dışı bırakmaz.\n- Bir bileşende güvenlik hatası varsa, saldırgan hemen diğer tüm parçaların ayrıcalıklarını elde edemez.\n- Bir bileşeni izole şekilde düşünebiliyorsanız, onu daha etkili test ve denetim yapabilirsiniz.\n\nBu, pratik bir biçimde security-by-construction’dır: “bir hata”nın “tam felaket”e dönüşmesini zorlaştıracak şekilde sistemi tasarlamak.\n\n### Kopyalanmaya değer tasarım alışkanlıkları\n\nqmail ayrıca e-posta dışındaki alanlara iyi aktarılan alışkanlıklar modelidir:\n\n- Net sınırlar: bir bileşenin hangi girdileri kabul ettiğini ve hangi çıktıları ürettiğini tam olarak tanımlayın. Küçük, açık sözleşmeler uygulaması daha kolaydır.\n- Sıkı girdi işleme: ağdan gelen her şeyi potansiyel olarak kötü niyetli kabul edin; erken doğrulayın, tuhaf durumları reddedin ve “yardımcı” tahminlerden kaçının.\n- Varsayılan en az ayrıcalık: bileşenleri yalnızca ihtiyaçları olan izinlerle çalıştırın, böylece bir hata otomatik olarak tam ele geçirme yaratmaz.\n\nÇıkarım “qmail kullanın” değil. Çıkarım, genellikle daha fazla kod yazmadan veya daha fazla düğme eklemeden önce daha az hata moduna göre yeniden tasarlayarak büyük güvenlik kazanımları elde edebileceğinizdir.\n\n## Saldırı Yüzeyini Daraltmak: Sıkı Arayüzler\n\n“Attack surface”, sisteminizin dürtülebileceği, kandırılabileceği veya yanlış işe zorlanabileceği tüm yerlerin toplamıdır. Bunu bir eve benzetin: her kapı, pencere, garaj kumandası, yedek anahtar ve teslimat bölmesi potansiyel bir giriş noktasıdır. Daha iyi kilitler takabilirsiniz, ama ayrıca daha az giriş noktasıyla da daha güvenli olursunuz.\n\nYazılım da aynı. Açtığınız her port, kabul ettiğiniz her dosya formatı, ortaya çıkardığınız yönetici uç noktası, eklediğiniz yapılandırma düğmesi ve desteklediğiniz eklenti kancası hata yollarını artırır.\n\n### Sıkı arayüzler: daha küçük API’ler, daha az hata modu\n\n“Sıkı arayüz”, daha az yapan, daha az varyasyonu kabul eden ve belirsiz girdileri reddeden bir API demektir. Bu genellikle kısıtlayıcı gelir—ama güvenlik açısından daha kolaydır çünkü denetlenecek daha az kod yolu ve beklenmedik etkileşim vardır.\n\nİki tasarımı düşünün:\n\n- Geniş arayüz: “Her dosya tipini yükleyin; formatı algılarız; isteğe bağlı sıkıştırma; isteğe bağlı şifreleme; isteğe bağlı metadata; birden çok kimlik doğrulama şeması.”\n- Sıkı arayüz: “Baytları yükleyin; içerik tipini küçük bir izin listesinden beyan etmelisiniz; maksimum boyut sabittir; şifreleme dahili olarak halledilir; tek bir kimlik doğrulama yöntemi.”\n\nİkinci tasarım, saldırganların manipüle edebileceği şeyi azaltır. Ayrıca ekibinizin kazara yanlış yapılandırma yapma olasılığını azaltır.\n\n### Neden daha az seçenek daha güvenli olabilir\n\nSeçenekler testi çoğaltır. On adet togglle destekliyorsanız, yalnızca 10 davranışınız yoktur—kombinasyonlarınız vardır. Birçok güvenlik hatası bu dikiş yerlerinde yaşar: “bu bayrak kontrolü devre dışı bırakıyor,” “bu mod doğrulamayı atlıyor,” “bu eski ayar oran limitlerini atlıyor.” Sıkı arayüzler “kendi maceranı seç” güvenliğini iyi aydınlatılmış bir yola çevirir.\n\n### Kontrol listesi: karmaşıklığın gizlendiği yerler\n\nSaldırı yüzeyinin gizlice büyüdüğü yerleri tespit etmek için kullanın:\n\n- Birçok girdi tipi: birden fazla dosya formatı, kodlama veya “otomatik algılama” ayrıştırması.\n- Çok fazla giriş yolu: ekstra ağ portları, yönetici panelleri, hata ayıklama uç noktaları, webhooks.\n- Güvenlik mantığını değiştiren özellik bayrakları: doğrulamayı, kimlik doğrulamayı veya kripto davranışını değiştiren toggllelar.\n- Eklene bilirlik: çalışırken değerlendirilen betikler, şablonlar, eklentiler veya “özel ifadeler”.\n- Geriye dönük uyumluluk modları: eski protokoller, eski şifreler, kullanımdan kalkmış API sürümleri.\n- Örtük varsayılanlar: ortam değişkenlerine veya eksik yapılandırmaya bağlı olarak değişen davranış.\n\nArayüzü küçültme imkanı yoksa, onu sıkılaştırın: erken doğrulayın, bilinmeyen alanları reddedin ve “güçlü özellikleri” açıkça sınırlandırılmış endpointlerin arkasına koyun.\n\n## Sabit-Zaman Düşüncesi: Gözle Görülmeyen Sızıntıları Önlemek\n\n“Sabit-zaman” davranış, bir hesaplamanın gizli değerlerden (özel anahtarlar, nonceler veya ara bitler gibi) bağımsız olarak yaklaşık aynı süreyi almasını ifade eder. Amaç hızlı olmak değil; sıkıcı olmaktır: saldırgan çalışma zamanı ile sırlar arasında korelasyon kuramazsa, sırları gözlemleyerek çıkarması çok zorlaşır.\n\nZamanlama sızıntıları önemlidir çünkü saldırganlar her zaman matematiği kırmaya ihtiyaç duymaz. Aynı işlemi birçok kez çalıştırabiliyorlarsa (veya paylaşılan donanımda izleyebiliyorlarsa), mikro saniyeler, nano saniyeler hatta önbellek etkileri bile biriktiğinde anahtar kurtarmaya yol açan örüntüleri açığa çıkarabilir.\n\n### Zamanlama değişkenliği nereden sızar\n\nNormal kod bile veriye bağlı olarak farklı davranabilir:\n\n- Gizli veriye göre dallanan kontrol:if (secret_bit) { ... } kontrol akışını ve genellikle çalışma zamanını değiştirir.\n- Gizli indeksli tablo aramaları: gizli bağımlı indekslerin farklı önbellek hatlarına yol açması klasik örnektir.\n- Önbellek ve bellek etkileri: gizli bağımlı bellek erişimi CPU önbellekleri, sayfa hataları veya önekleme davranışları aracılığıyla sızabilir.\n- Değişken-zamanlı talimatlar: bazı büyük sayı işlemleri, bölme veya erken çıkışlı döngüler belirli girdilerde daha uzun sürebilir.\n\n### Zamanlama riski denetimi için üst düzey yollar\n\nAssembly okumaya gerek yok, denetimden değer elde etmek için:\n\n1. Gizli etkiyi izleyin: hangi değişkenlerin gizli olduğunu (özel anahtarlar, paylaşılan sırlar, kimlik doğrulama etiketleri) ve bunların nerelere aktığını listeleyin.\n2. Kırmızı bayrakları arayın: gizli veriye dayalı if ifadeleri, dizi indeksleri, sır tabanlı sonlanma döngüleri ve “hızlı yol/yavaş yol” mantığını arayın.\n3. Bağımlılıkları tehdit modelinin parçası sayın: kripto kütüphanelerinin ilgili işlemler için sabit-zaman iddiası olup olmadığını doğrulayın.\n4. Varyansı test edin: farklı sırlarla işlemleri birçok kez çalıştırın ve dağılımları ölçün; tutarlı büyük farklılıklar uyarı işaretidir.\n\nSabit-zaman düşüncesi kahramanlıktan çok disiplinle ilgilidir: sırların zamanlamayı yönlendirmemesini sağlayacak şekilde kod tasarlamak.\n\n## Curve25519 ve X25519: Yanlış Kullanımı Zorlaştıran Kripto\n\nEliptik eğri anahtar değişimi, iki cihazın yalnızca “açık” mesajlar göndererek aynı paylaşılan sırrı oluşturmasını sağlar. Her taraf gizli bir değer (özel) üretir ve buna karşılık gelen bir açık değer (gönderilmesi güvenli) çıkarır. Açık değerler değiş tokuş edildikten sonra, her taraf kendi özel değeri ile diğer tarafın açık değerini birleştirerek aynı paylaşılan sırra ulaşır. Dinleyen kişi açık değerleri görür ama pratikte paylaşılan sırrı yeniden oluşturamaz; bu sayede taraflar simetrik şifreleme anahtarları türetebilir ve gizlice iletişim kurabilir.\n\n### Curve25519/X25519 neden popüler oldu\n\nCurve25519 temel eğridir; X25519 bunun üzerine kurulmuş standartlaştırılmış, “bu belirli işlemi yap” anahtar-değişimi fonksiyonudur. Çekicilikleri büyük ölçüde security-by-construction’dur: daha az tetikleyici hata, daha az parametre seçimi ve kazara güvensiz ayar seçme yollarının azalması.\n\nAyrıca geniş bir donanım aralığında hızlıdır; bu, çok sayıda bağlantıyı yöneten sunucular ve pil tasarrufu yapmaya çalışırken telefonlar için önemlidir. Tasarım, sabit-zamana uygun uygulamaları desteklemeyi teşvik eder (zamanlama saldırılarına karşı direnç), bu da küçük performans farklılıklarını ölçerek sırları çıkarmaya çalışan saldırgan riskini azaltır.\n\n### Ne sağlar—ne sağlamaz\n\nX25519 size anahtar anlaşması sağlar: iki tarafın simetrik şifreleme için paylaşılan sır türetmesine yardımcı olur.\n\nKendisi tek başına kimlik doğrulama sağlamaz. X25519’yi karşı tarafın kim olduğunu doğrulamadan kullanırsanız (örneğin sertifikalar, imzalar veya ön paylaşılan anahtarlarla), yine yanlış tarafla güvenli görüşme yapacak şekilde kandırılabilirsiniz. Başka bir deyişle: X25519 dinlemeyi engellemeye yardımcı olur, ama tek başına taklit etmeyi durdurmaz.\n\n## NaCl’in Büyük Fikri: Daha Az Seçenek, Daha Az Hata\n\nNaCl (Networking and Cryptography library), uygulama geliştiricilerinin kazara güvensiz kriptografiyi birleştirmesini zorlaştırmak amacıyla inşa edildi. Çeşitli algoritmalar, modlar, padding kuralları ve yapılandırma düğmeleri sunmak yerine NaCl sizi yüksek seviyeli, güvenli bir şekilde birlikte çalışan işlemler kümesine yönlendirir.\n\n### “box” ve “secretbox” daha güvenli yapı taşları olarak\n\nNaCl’in API’leri ne yapmak istediğinize göre adlandırılır, hangi primitifleri birleştireceğinize göre değil.\n\n- crypto_box (“box”): açık anahtarlı doğrulanmış şifreleme. Özel anahtarınızı, alıcının açık anahtarını, bir nonce ve mesaj verirsiniz. Mesajı gizleyen ve doğru anahtara sahip birinden geldiğini kanıtlayan bir şifremetin elde edersiniz.\n- crypto_secretbox (“secretbox”): paylaşılan anahtarlı doğrulanmış şifreleme. Aynı fikir, ama tek bir paylaşılan sır anahtarı ile.\n\nAnahtar fayda, ayrı ayrı “şifreleme modu” ve “MAC algoritması” seçmemenizdir; bunları kendiniz doğru şekilde birleştirmeyi ummazsınız. NaCl’in varsayılanları modern, yanlış kullanıma dirençli bileşimleri (encrypt-then-authenticate gibi) zorlar, bu yüzden bütünlüğü unutma gibi yaygın hata modları çok daha az olasıdır.\n\n### Takas: daha az seçenek vs esneklik\n\nNaCl’in sıkılığı, eski protokoller, özel formatlar veya düzenleyici gereksinimli algoritmalarla uyumluluk gerektiğinde sınırlayıcı gelebilir. “Her parametreyi ayarlayabilirim”ı “kripto uzmanı olmadan güvenli bir şey gönderebilirim” ile takas ediyorsunuz.\n\nBirçok ürün için bu tam da amaçtır: hata olasılıklarını azaltmak için tasarım alanını kısıtlamak. Gerçekten özelleştirme gerekiyorsa, daha düşük seviyeli primitiflere inebilirsiniz—ama keskin kenarlara geri dönmeyi kabul etmiş olursunuz.\n\n## Güvenli Varsayılanlar ve Çok Fazla Düğmenin Maliyeti\n\n“Varsayılan olarak güvenli” demek, hiçbir şey yapmadığınızda en makul ve en güvenli seçeneği elde ettiğiniz anlamına gelir. Bir geliştirici bir kütüphane kurduğunda, hızlı bir örneği kopyaladığında veya çerçeve varsayılanlarını kullandığında sonuç yanlış kullanımı zorlaştırmalı ve kazara zayıflatmayı zorlaştırmalıdır.\n\nVarsayılanlar önemlidir çünkü gerçek dünyadaki çoğu sistem bunlarla çalışır. Ekipler hızlı hareket eder, dökümantasyon aceleyle okunur ve yapılandırma organik olarak büyür. Varsayılan “esnek” ise, bu genellikle “yanlış yapılandırması kolay” demektir.\n\n### Varsayılanların sessizce risk yaratması\n\nKripto hataları her zaman “kötü matematik”ten kaynaklanmaz. Genellikle tehlikeli bir ayarın seçilmesiyle oluşur çünkü o seçenek vardı, tanıdıktı veya kolaydı.\n\nYaygın varsayılan tuzakları şunlardır:\n\n- Zayıf veya öngörülebilir rastgelelik: kriptografik olmayan PRNG’ler kullanmak, tohumları yeniden kullanmak veya konteyner/VM’lerde düşük entropi kaynaklarına geri dönmek. Anahtar üretimi sallantılı rastgeleliğe bağlıysa, onun üstüne inşa edilen her şey bu zayıflığı miras alır.\n- Uyumluluk için hala desteklenen eski algoritmalar:SHA-1, MD5 veya eski RSA boyutlarını “her ihtimale karşı” açık bırakmak ve sonra sistemin üretimde onlara düşmesi.\n- Özel veya sıra dışı modlar ve parametreler: blok şifre modları, padding kuralları, nonce işleme veya ev yapımı şemalar için çok sayıda düğme sunmak. Seçenekler arttıkça, şifreli görünen ama güvenli olmayan bir protokol oluşturma olasılığı artar.\n\n### Pratik bir kural: daha az seçenek, daha güvenli sonuçlar\n\nGüvenli yolu en kolay yol haline getiren yığınları tercih edin: denetlenmiş primitifler, ihtiyatlı parametreler ve güvenli olmayan seçenekleri sormayan API’ler. Bir kütüphane sizi on algoritma, beş mod ve birden çok kodlama arasında seçim yapmaya zorluyorsa, yapılandırma ile güvenlik mühendisliği yapmaya davet ediyorsunuz demektir.\n\nMümkün olduğunda, kütüphaneleri ve tasarımları seçin ki:
\n- modern, geniş incelemeye tabi algoritmaları varsayılan yapsınlar
SSS
Security-by-construction pratikte ne anlama geliyor?
Security-by-construction, en güvenli yolun aynı zamanda en kolay yol olacak şekilde yazılım tasarlamaktır. İnsanların uzun kontrol listelerini hatırlamasına güvenmek yerine sistemi öyle kısıtlırsınız ki yaygın hatalar yapmak zorlaşır ve kaçınılmaz hataların etkisi sınırlı kalır (daha küçük bir “patlama yarıçapı”).
Neden sadelik güvenlik riskini azaltır?
Karmaşıklık gizli etkileşimler ve test edilmesi zor kenar durumları yaratır; bunlar yanlış yapılandırılmaya açık olur.
Sadelikten gelen pratik kazanımlar şunlardır:
denetlenmesi ve fuzz test yapılması gereken daha az kod yolu
korumaları kazara devre dışı bırakabilecek daha az yapılandırma kombinasyonu
bir şey ters gittiğinde hata modlarını anlamayı kolaylaştıran daha açık mantık
“Sıkı arayüz” nedir ve nasıl tasarlanır?
Sıkı bir arayüz daha az yapar ve daha az varyasyonu kabul eder. Belirsiz girdilerden kaçınır ve “yapılandırmayla güvenlik” tuzaklarını azaltır.
Pratik yaklaşım:
girdileri (tipler, boyutlar, kodlamalar) allowlist olarak belirleyin
bilinmeyen alanları “elinden geleniyle” ayrıştırmak yerine reddedin
güçlü/tehlikeli işlemleri ayrı ve açıkça sınırlandırılmış endpointlerin arkasına koyun
qmail modern sistemlere patlama yarıçapını sınırlama konusunda ne öğretebilir?
qmail, posta işleme işini küçük programlara (alım, kuyruklama, yerel teslim, uzak teslim vb.) bölerek sınırları daraltır. Bunun sonuçları:
bir parçanın çökmesi tüm sistemi bozmaya daha az meyillidir
bir bileşendeki hata saldırganın tüm ayrıcalıkları hemen elde etmesini zorlaştırır
her bileşen izole şekilde test ve denetlenmesi daha kolaydır
“Sabit-zaman” (constant-time) nedir ve neden önemsemeliyim?
Constant-time davranış, çalışma süresinin (ve sıklıkla bellek erişim örüntülerinin) gizli değerlere bağlı olmamasını amaçlar. Bu önemlidir çünkü saldırganlar zamanlama, önbellek etkileri veya “hızlı yol/ yavaş yol” farklarını ölçerek sırları çıkarabilirler.
Bu, sadece güçlü algoritmalar seçmek değil; görünmez sızıntıları önlemektir.
Assembly okumadan zamanlama sızıntısı riskini nasıl tespit edebilirim?
Öncelikle hangilerin gizli olduğunu (özel anahtarlar, paylaşılan sırlar, MAC anahtarları, doğrulama etiketleri) belirleyin; sonra sırların kontrol akışını veya bellek erişimini etkilediği yerlere bakın.
Aranacak kırmızı bayraklar:
gizli veriye dayalı if dalları
gizli indekslerle tablo/ dizi erişimleri
sırla erken çıkan döngüler
erken dönen karşılaştırmalar (sabit-zaman olmayan eşitlik)
Ayrıca, kullandığınız kripto bağımlılığının ilgili işlemler için sabit-zaman iddiasını açıkça beyan ettiğini doğrulayın.
Neden Curve25519/X25519 “yanlış kullanılması daha zor” olarak kabul ediliyor?
X25519, Curve25519 üzerine kurulmuş belirli, standartlaştırılmış bir anahtar-değişimi fonksiyonudur. Ayar seçeneklerini azaltması, iyi performansı ve sabit-zaman uygulamalarını desteklemeye elverişli tasarımı nedeniyle popülerdir.
Doğru: anahtar değişimi için daha güvenli bir “varsayılan yol” sağlar—ancak yine de kimlik doğrulama ve anahtar yönetimini doğru yapmalısınız.
X25519 kendi başına karşı tarafı kimlik doğruluyor mu?
Hayır. X25519 anahtar anlaşması (shared secret) sağlar ama karşı tarafın kim olduğunu kanıtlamaz.
Taklitleri engellemek için eşleştirilmesi gerekir, örneğin:
sertifikalar/imzalar (ör. TLS içinde)
önceden paylaşılmış anahtar
uygulama düzeyinde imza şeması
Kimlik doğrulama olmadan yanlış tarafla “güvenli” bir bağlantı kurmuş olabilirsiniz.
NaCl’in “box” ve “secretbox” API’lerinin ana fikri nedir?
NaCl, geliştiricilerin kazara güvensiz kriptografi birleştirmesini zorlaştırmak için yüksek seviyeli, güvenli bileşenler sunar. Çeşitli algoritmalar ve modlar yerine, bir arada güvenli şekilde çalışan küçük bir operasyon setine yönlendirir.
İki yaygın yapı taşı:
crypto_box: açık anahtarlı doğrulanmış şifreleme (sizin ve alıcının anahtarları + nonce + mesaj → şifre metin)
Pratik fayda: bütünlük korumasını unutmak gibi yaygın bileşen hatalarını engeller.
İyi kripto primitifleri kullanılsa bile gerçek sistemler nerede başarısız olur?
İyi primitifler bile, entegrasyon ve operasyon hataları yüzünden başarısız olur. Yaygın sorunlar:
nonce tekrar kullanımı (sayacın sıfırlanması, çoklu süreç yarışları veya “yeterince rastgele” varsayımları)
tutarsız kodlamalar (hex vs base64, baştaki sıfırların düşmesi, endian farkları)
güvensiz hata işleme (fazla ayrıntı ifşa etme veya doğrulama hatalarını görmezden gelme)
anahtar sızması (loglar, çökme raporları, yedekler, geniş paylaşılan environment değişkenleri)
Etkili önlemler:
DJB ve Security-by-Construction: qmail'den Curve25519'e | Koder.ai
kullanımdan kalkmış seçenekleri “gelişmiş ayarlar”ın arkasına saklamak yerine kaldırıp belirtsinler
güvensiz işlemleri imkansız ya da en azından yapılması çok açık ve zor hale getirsinler\n\nSecurity-by-construction, her kararı bir açılır listeye dönüştürmeyi reddetmektir.\n\n## Gerçek Koddaki “Basit ve Doğrulanabilir” Ne Demek\n\n“Doğrulanabilir” çoğu ürün ekibinde “resmen kanıtlı” demek değildir. Hızla, tekrarlanabilir şekilde güven inşa edebildiğiniz ve kodun ne yaptığını yanlış anlamaya daha az fırsat bıraktığınız anlamına gelir.\n\n### “Doğrulanabilir” pratikte neleri kapsayabilir\n\nBir kod tabanı daha doğrulanabilir hale geldiğinde:\n\n- Okunabilirlik yüksek olur: küçük fonksiyonlar, açık isimlendirme ve minimum “sihir”. Yeni bir mühendise akışı beyaz tahtada istisnalar olmadan anlatabilirsiniz.\n- Bilinen-iyi test vektörleri vardır: bir girdi verildiğinde çıktı sabittir ve belgelenmiştir (kripto için özellikle kritik). Bu, tesadüfi testlerde hâlâ “çalışan” ama yanlış değişiklikleri yakalar.\n- Derlemeler tekrarlanabilirdir: aynı kaynak aynı ikiliyi üretir, böylece çalışanın incelenenle aynı olup olmadığını doğrulayabilirsiniz.\n- Denetimler mümkün ve sınırlıdır: “ucuz” değil ama sınırlandırılmış—denetçiler önemli yolları seçenekler ve yapılandırma durumlarında boğulmadan gözden geçirebilir.\n\n### Neden daha basit kod yolları incelemeyi kolaylaştırır\n\nHer dal, mod ve isteğe bağlı özellik inceleyicilerin üzerinde düşünmesi gereken durum sayısını çarpar. Daha basit arayüzler olası durum setini daraltır ve bu iki şekilde inceleme kalitesini artırır:\n\n1. İnceleyiciler güvenlik açısından kritik birkaç akışa odaklanabilir, kenar durumların peşinden koşmazlar.\n2. Bir şey “uygunsuz” olduğunda fark etmek daha kolaydır (beklenmeyen bir tahsisat, riskli ayrıştırma adımı, zamanlama duyarlı bir karşılaştırma).\n\n### Benimseyebileceğiniz hafif doğrulama iş akışı\n\nSıkıcı ve tekrarlanabilir tutun:\n\n- Testler: her kullandığınız primitif için birim testleri ve test vektörleri ekleyin; değişiklik başına CI’da çalıştırın.\n- İnceleme: anahtarlar, rastgelelik, serileştirme ve karşılaştırmaları etkileyen değişiklikler için güvenlik odaklı bir kontrol listesi zorunlu kılın.\n- İzleme: yüksek seviyeli hata nedenlerini (sırları değil) kaydedin, şifre çözme/doğrulama hatalarında ani artışları uyarın ve bağımlılık sürümlerini takip ederek kripto kodunun altında nelerin değiştiğini bilin.\n\nBu kombinasyon uzman incelemenin yerini almaz ama tabanı yükseltir: daha az sürpriz, daha hızlı tespit ve gerçekten üzerinde düşünebileceğiniz kod.\n\n## İyi Primitiflere Rağmen Kripto Sistemlerinin Nerede Hataları Olur\n\nX25519 gibi iyi kabul görmüş primitifleri veya NaCl tarzı minimal API’leri seçseniz bile sistemler hâlâ entegrasyon, kodlama ve işletme tarafında başarısız olur. Gerçek dünya olaylarının çoğu “matematik yanlıştı” değil, “matematik yanlış kullanıldı” şeklindedir.\n\n### Entegre hatalar (sık görülen suçlular)\n\nAnahtar yönetimi hataları yaygındır: uzun ömürlü anahtarları geçici anahtar yerine tekrar kullanmak, anahtarları kaynak kontrolünde saklamak veya “açık anahtar” ile “gizli anahtar” bayt dizisini karıştırmak (ikisi de dizi olduğu için).\n\nNonce kötü kullanımı tekrar eden suçlulardan biridir. Birçok doğrulanmış şifreleme şeması anahtar başına benzersiz nonce gerektirir. Nonce’u çoğaltırsanız (genellikle sayaç sıfırlamaları, çoklu süreç yarışları veya “yeterince rastgele” varsayımlarıyla), gizliliği veya bütünlüğü kaybedebilirsiniz.\n\nKodlama ve ayrıştırma problemleri sessiz hatalar yaratır: base64 vs hex karışıklığı, baştaki sıfırların düşmesi, tutarsız endianlik veya karşılaştırmada farklı davranan birden fazla kodlama kabul etme. Bu tür hatalar “doğrulanmış imza”yı “doğrulanmış başka bir şey”e çevirebilir.\n\nHata işleme her iki yönde tehlikeli olabilir: saldırganlara yardımcı olacak ayrıntılı hatalar döndürmek veya doğrulama hatalarını yok sayıp devam etmek.\n\n### İşletme hataları ki iyi kriptoyu bozar\n\nSırlar loglar, çökme raporları, analizler ve “hata ayıklama” uç noktaları aracılığıyla sızar. Anahtarlar ayrıca yedeklerde, VM imajlarında ve aşırı geniş paylaşılan çevresel değişkenlerde bulunur. Aynı zamanda bağımlılık güncellemeleri (veya güncellenmemesi) sizi savunmasız bir uygulamada bırakabilir, tasarım sağlam olsa bile.\n\n### Kriptografik olmayanlar için hafif bir hafifletme kontrol listesi\n\n- Nonceler bir tasarım gereksinimi gibi ele alın: tekillik kurallarını belgeleyin ve tekrar kullanımı için test ekleyin.\n- Anahtarlar/mesajlar için tek bir kanonik kodlama tanımlayın; başka her şeyi reddedin.\n- Kapat (fail closed): doğrulama başarısızsa durun ve genel bir hata gösterin.\n- Sırları loglara koymayın; otomatik log kırpma testleri ekleyin.\n- Anahtarları ayrılmış bir gizli yöneticide saklayın; erişimi daraltın ve döndürün.\n- Kripto bağımlılıklarını pinleyin ve gözden geçirin; güncellemeleri ve denetimleri planlayın.\n\n## Ürününüz İçin Kripto Mühendisliği Yaklaşımlarını Seçmek\n\nİyi primitifler otomatik olarak güvenli bir ürün üretmez. Maruz bıraktığınız seçenekler ne kadar fazlaysa—modlar, padding, kodlamalar, özel “ince ayarlar”—takımın yanlışlıkla kırılgan bir şey inşa etme yolları o kadar artar. Security-by-construction yaklaşımı, karar noktalarını azaltan bir mühendislik yolu seçmekle başlar.\n\n### Pratik karar çerçevesi\n\nBir yüksek seviyeli kütüphane (mesajı bir kerede şifrele gibi tek seferlik API’ler) kullanın eğer:\n\n- Ekibiniz kriptografi işine adanmış değilse.\n- Esnekliğe göre güvenli varsayılanlara (nonce yönetimi, kimlik doğrulama, anahtar formatları) daha çok ihtiyaç varsa.\n- Hata yaratabilecek “yapıştırma kodu”nu en aza indirmek istiyorsanız.\n\nDüşük seviye primitifleri (AEAD’ler, hash’ler, anahtar değişimi) yalnızca şu durumlarda birleştirin:\n\n- Net bir protokol tanımınız ve gerçek birlikte çalışma gereklilikleriniz varsa.\n- İnceleme, test vektörleri ve uzun vadeli bakım için sahiplik atayabiliyorsanız.\n- Halihazırda var olan bir protokolü yeniden icat etmediğinizi kanıtlayabiliyorsanız.\n\nYararlı bir kural: tasarım belgenizde “modus daha sonra seçilecek” veya “nonce konusunda dikkatli olacağız” gibisinden ifadeler varsa, zaten çok fazla düğme için ödeme yapıyorsunuz demektir.\n\n### Satıcılar ve dahili takımlara sorulacak sorular\n\nPazarlama diline değil, somut cevaplara odaklanın:\n\n- API tasarımı: API güvensiz durumları temsil etmeyi zorlaştırıyor mu? Nonce boyutları, anahtar boyutları ve algoritma seçimleri kısıtlı mı?\n- Varsayılanlar: Geliştiriciler yalnızca bir anahtar ve düz metin sağlarsa ne olur? Şifreleme her zaman doğrulanmış mı (AEAD), yoksa kazara “sadece şifrele” yapılabilir mi?\n- Yan kanal duruşu: Hangi işlemler sabit-zaman olacak şekilde tasarlandı? Zamanlama, önbellek ve dallanma sızıntılarına karşı hangi tehdit modeli varsayılıyor?\n- Anahtar yönetimi: Anahtarlar nasıl oluşturuluyor, saklanıyor, döndürülüyor ve sıfırlanıyor? Anahtar formatları açık ve versiyonlanmış mı?\n- Denetimler ve bakım: Son bağımsız denetim ne zaman yapıldı? Zafiyetler nasıl ele alınıyor? Güvenlikle ilgili değişiklikleri gösteren bir değişiklik günlüğü var mı?\n\n### İşçilik hijyeni ki kazandırır\n\nKriptoyu güvenlik kritik kod gibi ele alın: API yüzeyini küçük tutun, sürümleri pinleyin, bilinen-yanıt testleri ekleyin ve ayrıştırma/serileştirme üzerinde fuzzing çalıştırın. Desteklemeyeceğiniz şeyleri (algoritmalar, eski formatlar) belgeleyin ve uyumluluk anahtarları yerine göç yolları inşa edin.\n\n## Uygulanabilir Çıkarımlar: Bu Haftada Security-by-Construction Uygulamak\n\nSecurity-by-construction satın alınan yeni bir araç değil—oluşmasını zorlaştıran alışkanlıklar setidir. DJB tarzı mühendisliğin ortak ipuçları: üzerinde düşünülmesi mümkün olacak kadar basit tutun, yanlış kullanımı sınırlayacak kadar sıkı arayüzler yapın, saldırı altında bile aynı şekilde davranan kod yazın ve güvenli varsayılanları seçin.\n\n### Beyaz tahtanıza asılacak çıkarımlar\n\n- Sadelik bir güvenlik özelliğidir. Daha küçük bileşenler, daha az durum ve daha az yapılandırma dalı, şaşırtıcı davranış için daha az yer bırakır.\n- Sıkı arayüzler “yaratıcı” yanlış kullanımı önler. Birden fazla “neredeyse doğru” girdi kabul eden API’ler yerine tek doğru formatı kabul eden API’leri tercih edin.\n- Sabit-zaman düşüncesi görünmez sızıntıları azaltır. Kripto primitifiniz sağlam olsa bile, etrafındaki kod zamanlama, dallanma veya bellek erişim modelleriyle sırları sızdırabilir.\n- Güvenli varsayılanlar sonsuz seçeneklerden üstündür. Her bir düğme teste eklenen yeni bir kombinasyon ve genellikle yeni bir yanlış yapılandırma yoludur.\n\n### Takımlar için bir haftalık eylem listesi\n\n1. Envanter: kriptografiyi nerede kullandığınızı listeleyin (TLS ayarları, parola hashlemesi, token imzalama, anahtar değişimi, rastgele sayı üretimi). Kullanılan tam kütüphane ve yapılandırmayı not edin.\n2. Riskli kalıpları değiştirin: ev yapımı kriptoyu, “zekice” kodlama/ayrıştırmayı ve yanlış kullanılmaya açık zengin API’leri kaldırın. Küçük, kararlı bir primitif seti ve bunları çağırmanın tek bir yolunu standardize edin.\n3. Arayüzleri kısıtlayın: kripto çağrılarını az sayıda parametre, güçlü tipler ve net girdi doğrulaması olan dar bir dahili modülün arkasına sarın.\n4. Regresyonları yakalayacak testler ekleyin: primitifler için bilinen-yanıt testleri, ayrıştırıcılar için fuzz testleri ve sıcak yollarda “gizli-bağımlı dallar yok” denetimleri.\n5. Varsayılanları kilitleyin: güvenli tabanları kod içinde (wiki değil) belirleyin ve sapma için kesin bir inceleme gerektirin.\n\nEğer yapılandırılmış bir kontrol listesi isterseniz, bu adımları güvenlik dokümanlarınızın yanına bir “kripto envanteri” sayfası olarak eklemeyi düşünün (ör. /security).\n\n### Hızlı teslimatta security-by-construction notu\n\nBu fikirler sadece kripto kütüphaneleriyle sınırlı değildir—yazılımı nasıl inşa edip gönderdiğinizle ilgilidir. Bir vibe-coding iş akışı (örneğin Koder.ai, chat ile web/sunucu/mobil uygulamalar oluşturduğunuz yer) kullanıyorsanız, aynı ilkeler ürün kısıtları olarak ortaya çıkar: desteklenen yığın sayısını sınırlamak (webde React, arka uçta Go + PostgreSQL, mobilde Flutter), değişiklik üretmeden önce planlamaya vurgu yapmak ve geri almayı ucuz hale getirmek.\n\nUygulamada, planlama modu, anlık görüntüler ve geri alma ve kaynak kodu dışa aktarma gibi özellikler hata patlama yarıçapını azaltır: değişiklikler inmeden önce niyeti inceleyebilir, bir şey ters gittiğinde çabuk geri alabilir ve çalışanın üretilenle eşleşip eşleşmediğini doğrulayabilirsiniz. Bu, qmail’in bölümlere ayırma yaklaşımıyla aynı security-by-construction sezgisinin modern teslimat boru hatlarına uygulanmasıdır.
nonce-tekil olma kurallarını belgeleyin ve tekrar kullanım için testler ekleyin
tek bir kanonik kodlama zorunlu kılın ve diğerlerini reddedin
doğrulama hatasında kapat (fail-closed) davranışı sergileyin ve genel hata mesajları verin
anahtarları gizli yöneticide saklayın, erişimi kısıtlayın ve döndürün