Kripto-çeviklik, ya da: algoritma seçimi neden işin kolay kısmı.
Doğru algoritmayı seçmek bir Salı öğleden sonrasında verilen bir karar. Beş yıl sonra o algoritmayı, etrafındaki uygulamayı yeniden yazmadan değiştirebilen bir sistem kurmak ise yıllar süren bir disiplin. O disiplinin adı kripto-çeviklik — ve MD5, SHA-1, RC4 ve TLS 1.0'ı sessizce halleden ekiplerle olay olarak halleden ekipler arasındaki fark hep buydu. Kripto-çeviklik tam olarak nedir, çevik bir sistem kodda neye benzer, ve onu gerçek kılan dört alışkanlık — hepsi burada.

Atakan Özalan
Kurucu ortak & mühendislik lideri, GOGOGO LLC

Uzun ömürlü her üretim sisteminin yaşadığı bir an vardır, çoğu birden fazla kez yaşar. O an şudur: kriptografiyi değiştirmek zorundayız. Bazen bir ilkel kırıldığı için (MD5, SHA-1, RC4). Bazen bir protokol sürümü savunulamayacak kadar eskidiği için (TLS 1.0, SSLv3). Bazen bir düzenleyici tabanı yukarı çektiği için. Ve — sırada bekleyen — bazen tüm sektörün altındaki kriptografik zemin kayıyor olduğu için, tıpkı post-quantum'un şu an kaydırdığı gibi.
O an geldiğinde her kod tabanı net olarak iki kovadan birine düşer. Çevik kod tabanları kriptografiyi bir config dosyasında değiştirir ve deploy eder. Sert kod tabanları algoritma adının 400 farklı yere kodlanmış olduğunu keşfeder; veritabanlarındaki şifreli metinlerin algoritma etiketi yoktur, anahtar rotasyonu bir dedikodudur, ve göç artık altı aylık bir olaydır. İki kova arasındaki fark 'beş yıl önce doğru algoritmayı kim seçti' değil. Ekibin kripto-çeviklik pratiğini yapıp yapmadığı — ve bu yazı tam olarak o pratik üzerine.
Kripto-çeviklik tam olarak nedir
Kripto-çeviklik, bir sistemin kriptografik algoritmaları — hash, şifreleme, imza, anahtar değişimi — etrafındaki uygulamayı yeniden yazmadan değiştirebilme özelliğidir. Bir kütüphane değil, bir NIST yayını değil, açıp kapatacağın bir özellik değil. Yazılım yazma biçimi — gözlemlenebilir ya da test edilebilir olmanın yazılım yazma biçimi olması gibi.
Gördüğüm en temiz tek satırlık tanım: algoritma kod değil, veri olmalı. Algoritma veri olduğunda, takas etmek bir config değişikliği ve bir anahtar rotasyonudur. Kod olduğunda, takas etmek algoritmayı elle adlandıran her noktanın refactor edilmesidir. Sistemin hangisi olduğu, deneyimime göre, gelecekteki herhangi bir kripto göçünün ne kadar acılı olacağını belirleyen en büyük tek faktör — post-quantum göçü de dahil.
Kimsenin atlamasına izin verilmeyen tarih dersi
Son 25 yılda kriptografi topluluğu şunları resmen emekli etti veya zayıflattı: MD5 (1996 zayıfladı, 2004 kırıldı), SHA-1 (2017 çakışma), RC4 (2015 TLS'de yasaklandı), 3DES (2018 deprecate edildi), TLS 1.0 ve 1.1 (2020 deprecate edildi), ve tüm açık anahtar yığınını post-quantum'a taşımanın ortasında. Bir kariyer uzunluğunda yaygın olarak deploy edilmiş altı ilkel ya öldü ya da uyarı aldı. Sıradaki yolda. Ondan sonraki de yolda olacak.
On yıl yaşamak isteyen her sistem, mevcut kripto seçimlerinin geçici olduğunu varsaymak zorunda. Kripto-çeviklik bu varsayıma verilen mühendislik cevabı. Bugün koyabileceğin en güçlü algoritmaları seç; gelecek yıl onları değiştirecekmişsin gibi tasarla.
Çevik bir sistem neye benzer
Somut olarak, bir kod tabanında. Kriptografik algoritma adlarını bilen tam olarak bir modül vardır — adını crypto/registry koyalım. Diğer her modül hash, şifreleme, imza veya doğrulama için registry'ye sorar; kod tabanında başka hiçbir yer SHA-256, AES-GCM, Ed25519 ya da ML-KEM-768'i adıyla anmaz. Registry, algoritma kimliklerinden uygulamalara giden bir harita. Yeni algoritma eklemek: bir giriş eklemek. Algoritma kaldırmak: bir giriş kaldırmak. Uygulamanın geri kalanı kıpırdamaz.
Sistemin ürettiği her artefakt — her şifreli metin, her imza, her sarmalanmış anahtar — onu üreten algoritmanın kimliğini taşır. Bir imza <bytes> değildir; <algoritma-kimliği, bytes>'tır. Bir şifreli metin bir blob değildir; bir zarftır: {alg, kid, iv, ct, tag}. Bir artefaktı doğrulamak ya da çözmek, algoritma kimliğini okumayla ve registry'ye hangi uygulamayı kullanacağını sormayla başlar. Doğrulayıcı, çağrı başladığında artefaktı hangi algoritmanın imzaladığını bilmez; artefaktın kendisinden öğrenir.
Çevikliği gerçek kılan dört alışkanlık
Kripto-çevikliği tanımlamak kolay. Uygulamak dört alışkanlık, hepsi de gösterişsiz.
- Her artefaktı onu üreten algoritmayla etiketle. Her imza, şifreli metin, MAC ve sarmalanmış anahtar
alg'ını (ve ideal olarak birkid— anahtar kimliği — da) taşır. Standart zarflar zaten var: token'lar için JWS / JWE / COSE / JOSE, ve genel kullanım için IETF HPKE / NIST zarf formatları. Birini kullan; kendi zarfını icat etme. Bir göçün acılı olmasının en yaygın tek nedeni, eski artefaktların decode anında yenilerinden ayırt edilememesidir. - Sar, asla satır içine yazma. Her kriptografik işlem tek bir arayüzden geçer (
registry.sign,registry.verify,registry.encrypt). Arayüz, algoritma adını veri olarak kabul eder — genellikle konfigürasyondan, anahtar metadatasından ya da artefaktın kendisinden. Bir geliştirici kod tabanında'AES-GCM'için grep yaptığında birden fazla sonuç bulabiliyorsa, sistemde bir sızıntı var; o sızıntı bir sonraki göçün canını yakacağı yer. - Rotasyona acil durum gibi değil, normal bir operasyon gibi davran. Üretimde hiçbir anahtarı asla rotate etmemiş bir sistem, gerektiği an rotate etmekte başarısız olacak bir sistemdir. Rotasyonu runbook'a koy: üç ayda bir planla, ayda bir staging'de test et, bir eşikten daha eski anahtarlar için alarm kur. Bir ilkelin kırıldığı gün, operasyonel olarak üç aylık bir tatbikat gibi görünmeli, yangın gibi değil.
- Geçişlerde varsayılan hibrit. İlkelleri değiştirirken, eskiyi ve yeniyi veri kaybı olmadan geri dönebilecek kadar uzun süre birlikte çalıştır. İmzalar için çift imzala (eski + yeni) ve ikisini de kabul et; anahtar değişimi için oturum anahtarını hem klasik hem post-quantum yarısından türet. Hibrit bir hack değil — dikkatli yapılan her göç böyle oldu, ileride dikkatli yapılan her göç de böyle olacak.
Ekipleri sonradan yakalayan anti-pattern'lar
Dört alışkanlığın ayna görüntüsü, o anda hep iyi görünen ve sonradan hep faturası gelen dört pattern.
- Kod tabanına dağıtılmış sabit algoritma adları.
'SHA-256'için grep 30 dosyada 70 sonuç döndürür. Bugün hiçbiri yanlış değil. Hepsi sonra iş. - Disk'te etiketsiz artefaktlar. Algoritma zarfı olmadan kaydedilmiş şifreli metinler, ham bayt olarak saklanmış imzalar. Bunları taşımak ayrı bir dans gerektirir: her kaydı yeni ilkel altında yeniden şifrele ya da yeniden imzala, bu arada eski doğrulayıcıyı yıllarca canlı tut.
- Hiç rotate edilmemiş anahtarlar. Altı yıllık API imzalama anahtarları, binary'lere pişmiş kök sertifikalar, ekipten eski JWT secret'ları. İlk rotasyon her zaman en zor olanıdır; daha hiç yapmamış ekip henüz hangi varsayımların kırıldığını öğrenmemiştir.
- Tek bir 'algoritma' konfigürasyon boolean'ı.
useEcdsa: true. Sonraki göçuseMlDsa: trueekler. İki göç sonra elinde beş yönlü bir boolean salatası var ve bugün üretimde hangi yolun çalıştığını kimse cevaplayamıyor. Adlandırılmış algoritma kimlikleri (ve anahtar kimlikleri) kullan — asla boolean değil.
Çok ajanlı bir sistemde bu neden daha da önemli
Yukarıdaki her şey uzun ömürlü her sistem için doğru. Özellikle GOGOGO LLC'de inşa ettiğimiz çok ajanlı sistemler için doğru. Tek bir ürünün, birbirine imzalı durum geçiren, yıllarca doğrulanabilir kalması gereken trace'ler tutan ve kripto seçimini kontrol etmediğimiz dış sistemlerle federe olan birçok ajanı vardır. Kriptografik dikiş yerlerinin sayısı katlanır. Algoritmayı sabit kodlayan her dikiş, gelecek bir arıza noktasıdır.
Somut olarak: bir ajan, başka bir ajanın (ya da başka bir müşterinin denetçisinin) bir yıl sonra doğrulayacağı bir trace yayınladığında, o trace yalnızca imzayı değil, onu üreten algoritmayı da taşımalı. Ajanlar arası mesaj kuyruğu paketleri doğruladığında, paket başlığı algoritma kimliğini taşımalı. Bir müşterinin eval sistemi, aylar öncesi bir ajan kararını yeni bir imza şemasıyla notlandırdığında, eski not hâlâ orijinal imzalandığı algoritma altında doğrulanmalı. Çeviklik baştan tasarlandıysa hiçbiri zor değil. Tasarlanmadıysa hepsi proje.
“Bugün doğru algoritmayı seç ve bir Salı öğleden sonrasının problemini çözmüş olursun. Gelecek yıl algoritmasını değiştirebilen bir sistem kur ve henüz bilmediğin her Salı öğleden sonrasını çözmüş olursun. Kripto-çeviklik ikinci beceridir, ve ödemesini ürünün tüm hayatı boyunca yapar.”
Bu post-quantum tablosunda nereye oturuyor
Kripto-çevikliğin dürüst bir post-quantum göç planının merkezinde olmasının nedeni, önceki her göçün merkezinde olmasının nedeniyle aynı. Bir ilkel geçişinden sessizce çıkan ekipler, kodu takası fark etmeyen ekiplerdir. Bu sonuç şans değil. Yıllarca süren küçük, gösterişsiz kararların ürünü: her artefaktı etiketle, her işlemi tek bir arayüzden geçir, tatbikat gibi rotate et, her geçişten hibrit olarak geç. O alışkanlıklara bugün başla ve post-quantum göçü bir config rollout'u olsun. Son tarihten sonra başla ve paydaşları olan bir olay olsun.
Bu kısa serinin sonraki yazısı, tüm bunların — post-quantum kriptografi ve kripto-çeviklik — birbirine durum paylaşan, imzalayan ve doğrulayan birçok ajandan kurulu sistemler için tam olarak ne anlama geldiği hakkında. Bir baş başlangıç istersen, bugün kod tabanında algoritma adları için bir grep çalıştır ve sonuçları say. O sayı, mevcut kripto-çeviklik puanın. Nasıl inşa ettiğimiz üzerine daha fazlası gogogollc.com'da.