Veri Şifreleme: Geliştiricilerin Bilmesi Gereken Kritik Terminoloji

Yayınlanan: 2021-09-27

Dünya giderek daha fazla veri odaklı hale geldikçe, kullanıcı verilerinin güvenli bir şekilde işlenmesi her zamankinden daha kritik hale geliyor.

Geliştiriciler olarak, işlerimiz zaten yeterince zor: birden fazla hata noktasına sahip son derece karmaşık ve kırılgan sistemlerle uğraşırken, bizler uçup giden insan isteklerini kullanıcı arayüzlerine ve arka uçlara dönüştürüyoruz. Göreve eklemek, ortaya çıkan ve önemli bir husustur: veri güvenliği. Ve bunun iyi bir nedeni var: Verilerimiz kötüye kullanılırsa (bu nedenle, kullanıcılarımıza güvenli ve keyifli bir deneyim sunmamız adildir) müşteriler olarak bizler öfkeleniriz ve hükümetler ve işletmeler, uyumluluk için bunu talep eder.

Karşılıksız veri güvenliği

Güvenliği zorlaştıran şey, birkaç katmana sahip olması ve herkesin-sorumluluğu-kimsenin-sorumluluğu olmamasıdır. Modern bir bulut ekibinde, birden çok ekip veri girişini/çıkışını doğrudan kontrol eder: geliştiriciler, veritabanı yöneticileri, sistem yöneticileri (eğer isterseniz DevOps çalışanları), ayrıcalıklı arka ofis kullanıcıları vb. Bu roller/ekipler hızla gözlerini kapatabilir ve veri güvenliğini diğerlerinin sorunu olarak düşünebilir. Yine de gerçek şu ki, bir veritabanı yöneticisi güvenliğin uygulama tarafını kontrol edemediği için ilgilenmeleri gereken kendi dünyaları var, bir DevOps çalışanı arka ofis erişimi hakkında kesinlikle hiçbir şey yapamıyor vb.

Geliştiriciler ve veri güvenliği

Tüm bunlarla birlikte, geliştiriciler, veri söz konusu olduğunda en geniş erişim alanına sahiptir: uygulamanın her bölümünü oluştururlar; çeşitli arka uç hizmetlerine bağlanırlar; feribot erişim belirteçleri ileri geri; komutlarında okumak/yazmak için tüm veritabanı kümesine sahiptirler; yazdıkları uygulamaların sistemin tüm bölümlerine sorgusuz erişimi vardır (örneğin, üretimdeki bir Django uygulaması, son on yılın tüm S3 koleksiyonunu boşaltmak veya silmek için tüm ayrıcalıklara sahiptir) vb. Sonuç olarak, güvenlik açısından en yüksek özensizlik veya gözetim olasılığı kaynak kodu düzeyinde mevcuttur ve geliştiricinin doğrudan sorumluluğundadır.

Şimdi, veri güvenliği dipsiz bir tavşan deliği ve tek bir gönderiyle yüzeyi çizmeme imkan yok. Ancak, geliştiricilerin uygulamalarını güvende tutmak için bilmesi gereken temel terminolojiyi ele almak istiyorum. Bunu App Data Security 101 olarak düşünün.

Başlayalım!

Hashing

Son derece titiz bir tanım istiyorsanız, her zaman Wikipedia vardır, ancak basit bir ifadeyle, karma, verilerin okunamadığı başka bir forma veri dönüştürme işlemidir. Örneğin, iyi bilinen (ve çok güvensiz) Base64 kodlama işlemini kullanarak, "Sırrım seninle güvende mi?" "SXMgbXkgc2VjcmV0IHNhZmUgd2l0aCB5b3U/" biçimine dönüştürülebilir ("karma"). Örneğin, kişisel günlüğünüzü Base64 formatında yazmaya başlarsanız, ailenizin sırlarınızı okumasının hiçbir yolu yoktur (eğer Base64'ten nasıl çözüleceklerini bilmiyorlarsa)!

Verileri karıştırma fikri, web uygulamalarında parolaları, kredi kartı numaralarını vb. depolarken kullanılır (aslında her tür uygulamada kullanılmalıdır). Buradaki fikir, elbette, bir veri ihlali durumunda, saldırganın gerçek zarar vermek için şifreleri, kredi kartı numaralarını vb. kullanamaması gerektiğidir. Bu karma işlemi gerçekleştirmek için son derece sağlam ve karmaşık algoritmalar kullanılır; Base64 gibi bir şey şaka olacak ve herhangi bir saldırgan tarafından anında kırılacak.

Parola karma, tek yönlü karma olarak bilinen bir şifreleme tekniği kullanır; bu, verileri karıştırmak mümkün olsa da, çözmenin mümkün olmadığı anlamına gelir. O halde, giriş yaptığınızda uygulama bunun sizin şifreniz olduğunu nasıl biliyor? Aynı işlemi kullanır ve şifre olarak az önce girdiğiniz şeyin şifreli formunu veritabanında saklanan şifreli formla karşılaştırır; Eğer eşleşirlerse, oturum açmanıza izin verilir!

Karma konusu üzerindeyken, burada ilginç bir şey var. İnternetten yazılım veya dosya indirdiyseniz, kullanmadan önce dosyaları doğrulamanız istenmiş olabilir. Örneğin, Ubuntu Linux ISO'yu indirmek istiyorsanız, indirme sayfası size indirmenizi doğrulamak için bir seçenek gösterecektir; tıklarsanız, bir açılır pencere açılır:

Açılır pencere size, az önce indirdiğiniz tüm dosyanın özetini 5fdebc435ded46ae99136ca875afc6f05bde217be7dd018e1841924f71db46b5 ve sonucu indirme sayfasında gördüğünüz karma dizeyle karşılaştıracak bir komut çalıştırmanızı söyler: 5fdebc435ded46ae99136ca875afc6f05bde217be7dd018e1841924f71db46b5 . Bu dönüştürme, sözünü komutun son bölümlerinde görebileceğiniz SHA256 algoritması kullanılarak gerçekleştirilir: shasum -a 256 --check .

Buradaki fikir, çekiniz yoluyla üretilen karma farklıysa, bu, birisinin indirmenize müdahale ettiği ve bunun yerine size güvenliği ihlal edilmiş bir dosya sağladığı anlamına gelir.

Parola karma alanında duyacağınız bazı tanıdık isimler şunlardır: MD5 (güvensiz ve artık geçersiz), SHA-1 ve SHA-2 (SHA-256'nın üyesi olduğu algoritma aileleri ve SHA-512), SCRYPT, BCRYPT, vb.

tuzlama

Her türlü güvenlik bir kedi-fare oyunudur: hırsız mevcut sistemi öğrenir ve fark edilen yeni bir çatlak bulur ve kilit yapımcıları oyunlarını geliştirir, vb. Kriptografi bir istisna değildir. Karmaları tekrar parolalara dönüştürmek imkansız hale gelirken, saldırganlar zaman içinde akıllı tahminleri saf hesaplama gücüyle birleştiren karmaşık teknikler geliştirdiler; sonuç olarak, on üzerinden dokuz kez, yalnızca karma verilen doğru parolayı tahmin edebilirler.

"Bay. Rumpelstiltskin, sanırım?!”

Sonuç olarak, tuzlama tekniği gelişmiştir. Bunun tek anlamı, bir parolanın (veya herhangi bir verinin) karma hesaplamasının iki şeyin birleşimine dayalı olarak yapılacağıdır: verilerin kendisi ve saldırganın tahmin edemediği yeni bir rastgele dize. Dolayısıyla, salting ile, superman009 parolasını hash etmek istiyorsak, önce "tuz" olarak rastgele bir dize bCQC6Z2LlbAsqj77 , bCQC6Z2LlbAsqj77 ve ardından superman009-bCQC6Z2LlbAsqj77 üzerinde karma hesaplamayı gerçekleştiririz. Ortaya çıkan karma, algoritma tarafından üretilen olağan yapılardan sapacak ve akıllı tersine mühendislik veya tahminde bulunma kapsamını büyük ölçüde azaltacaktır.

Hem Hashing hem de Salting inanılmaz derecede karmaşık alanlardır ve sürekli olarak geliştirilmektedir. Bu nedenle, bir uygulama geliştiricisi olarak onlarla asla doğrudan ilgilenmeyiz. Ama bunları bilseydik ve daha iyi kararlar verebilseydik bize çok yardımcı olurdu. Örneğin, eski bir PHP çerçevesi kullanıyorsanız ve bunun parolalar için MD5 karmaları kullandığını görürseniz, kullanıcı hesabı oluşturma işlemine başka bir parola kitaplığı eklemenin zamanının geldiğini bilirsiniz.

Anahtarlar

"Anahtarlar" terimine sıklıkla şifreleme bağlamında rastlarsınız. Şimdiye kadar, verileri geri döndürülemez şekilde dönüştürdüğümüz ve orijinal formu yok ettiğimiz parola karma veya tek yönlü şifrelemeyi ele aldık. Bu, günlük pratik kullanım için kötü bir fikirdir - asla okunamayacak kadar güvenli bir şekilde yazılan ve e-postayla gönderilen bir belge hiçbir işe yaramaz! Bu nedenle, bilgilerin gönderici ve alıcı ile açık olmasını, ancak aktarılırken veya saklanırken okunamaz olmasını istediğimiz şekilde verileri şifrelemek istiyoruz.

Bunun için kriptografide “anahtar” kavramı mevcuttur. Kulağa tam olarak böyle geliyor: bir kilidin anahtarı. Bilgiye sahip olan kişi, anahtar adı verilen bir sır kullanarak bilgiyi karıştırır. Alıcı/saldırgan bu anahtara sahip olmadığı sürece, algoritmaları ne kadar karmaşık olursa olsun verileri çözmek imkansızdır.

Dönen Tuşlar

Anahtarlar şifrelemeyi mümkün ve güvenilir hale getirirken, parolaların yaptığı riskleri de taşırlar: Birisi anahtarı öğrendiğinde tüm oyun biter. Birinin GitHub gibi bir hizmetin bir bölümünü (birkaç saniyeliğine de olsa) hacklediği ve 20 yıllık kodu ele geçirebildiği bir senaryo hayal edin. Kodun içinde, şirketin verilerini şifrelemek için kullanılan şifreleme anahtarlarını da bulurlar (anahtarları kaynak kodla birlikte depolamak için korkunç bir uygulama, ancak bunun ne sıklıkta gerçekleştiğine şaşıracaksınız!). Şirket anahtarlarını değiştirme zahmetine girmediyse (tıpkı şifreler gibi), aynı anahtar ortalığı karıştırmak için kullanılabilir.

Sonuç olarak, sık sık anahtar değiştirme uygulaması gelişti. Buna anahtar döndürme denir ve herhangi bir saygın bulut PaaS sağlayıcısı kullanıyorsanız, otomatikleştirilmiş bir hizmet olarak sunulmalıdır.

Resim kredisi: AWS

Örneğin, AWS'nin bunun için AWS Key Management Service (KMS) adı verilen özel bir hizmeti vardır. Otomatikleştirilmiş bir hizmet, anahtarları tüm sunucular arasında değiştirme ve dağıtma zahmetinden kurtarır ve bu günlerde büyük dağıtımlar söz konusu olduğunda hiç de kolay değildir.

Açık Anahtar Şifreleme

Şifreleme ve anahtarlar hakkında daha önce yapılan tüm konuşmalar size bunun oldukça hantal olduğunu düşündürüyorsa, haklısınız. Anahtarları güvende tutmak ve yalnızca alıcının verileri görebilmesi için iletmek, günümüzün güvenli iletişiminin gelişmesine izin vermeyecek olan lojistik sorunlara neden olur. Ancak açık anahtarlı kriptografi sayesinde güvenli bir şekilde iletişim kurabilir veya çevrimiçi alışveriş yapabiliriz.

Bu tür kriptografi, büyük bir matematiksel atılımdı ve İnternet'in korku ve güvensizlik içinde dağılmamasının tek nedeni bu. Algoritmanın detayları karmaşık ve oldukça matematiksel, bu yüzden burada sadece kavramsal olarak açıklayabilirim.

Resim kredisi: Electronic Frontier Foundation

Genel Anahtar Şifreleme, bilgileri işlemek için iki anahtarın kullanımına dayanır. Anahtarlardan birine Özel Anahtar denir ve size özel kalması ve asla kimseyle paylaşılmaması gerekir; diğerine Public Key (yöntem adının geldiği yer) denir ve genel olarak yayınlanması gerekir. Size veri gönderiyorsam, önce sizin genel anahtarınızı almam ve verileri şifreleyip size göndermem gerekiyor; sonunda, özel anahtar ve genel anahtar kombinasyonunuzu kullanarak verilerin şifresini çözebilirsiniz. Özel anahtarınızı yanlışlıkla ifşa etmediğiniz sürece, yalnızca sizin açabileceğiniz şifreli verileri size gönderebilirim.

Sistemin güzelliği, özel anahtarınızı bilmem gerekmiyor ve mesajı ele geçiren herhangi biri, açık anahtarınıza sahip olsalar bile, onu okumak için hiçbir şey yapamaz. Bunun nasıl mümkün olduğunu merak ediyorsanız, en kısa ve en teknik olmayan cevap asal sayıların çarpımının özelliklerinden gelir:

Bilgisayarların büyük asal sayıları çarpanlarına ayırması zordur. Dolayısıyla, orijinal anahtar çok büyükse, mesajın binlerce yıl geçse bile şifresinin çözülemeyeceğinden emin olabilirsiniz.

Aktarım Katmanı Güvenliği (TLS)

Artık Açık Anahtar Şifrelemenin nasıl çalıştığını biliyorsunuz. Bu mekanizma (alıcının genel anahtarını bilmek ve bunu kullanarak onlara şifrelenmiş verileri göndermek) tüm HTTPS popülerliğinin arkasında yatan şeydir ve Chrome'un "Bu site güvenli" demesine neden olan şeydir. Olan şu ki, sunucu ve tarayıcı HTTP trafiğini (unutmayın, web sayfalarının tarayıcıların yorumlayabileceği çok uzun metin dizileri) birbirlerinin ortak anahtarlarıyla şifreliyor ve bu da Güvenli HTTP (HTTPS) ile sonuçlanıyor.

Resim kredisi: MozillaŞifrelemenin Aktarım Katmanında bu şekilde gerçekleşmediğini belirtmek ilginçtir; OSI modeli, verilerin şifrelenmesi hakkında hiçbir şey söylemez. Sadece veriler, Aktarım Katmanına teslim edilmeden önce uygulama (bu durumda tarayıcı) tarafından şifrelenir ve daha sonra şifresi çözüldüğü hedefine bırakılır. Bununla birlikte, süreç Taşıma Katmanını içerir ve günün sonunda, tüm bunlar verilerin güvenli bir şekilde taşınmasıyla sonuçlanır, bu nedenle gevşek terim "taşıma" katmanı güvenliği ortalıkta takılıp kalmıştır.

Hatta bazı durumlarda Secure Socket Layer (SSL) terimiyle de karşılaşabilirsiniz. SSL'nin çok daha önce ortaya çıkması ve şimdi TLS lehine kapatılması dışında TLS ile aynı kavramdır.

Tam Disk Şifreleme

Bazen güvenlik ihtiyaçları o kadar yoğundur ki hiçbir şey şansa bırakılamaz. Örneğin, bir ülkenin tüm biyometrik verilerinin depolandığı devlet sunucuları, risk çok yüksek olduğundan tedarik edilemez ve normal uygulama sunucuları gibi çalıştırılamaz. Verilerin yalnızca aktarılırken şifrelenmesi bu ihtiyaçlar için yeterli değildir; dinlenme halindeyken de şifrelenmesi gerekir. Bunun için, fiziksel olarak ihlal edildiğinde bile verilerin güvenli olmasını sağlamak için bir sabit diskin tamamını şifrelemek için tam disk şifrelemesi kullanılır.

Tam Disk Şifrelemenin donanım düzeyinde yapılması gerektiğine dikkat etmek önemlidir. Bunun nedeni, tüm diski şifrelersek, işletim sistemi de şifrelenir ve makine başladığında çalışamaz. Bu nedenle, donanımın disk içeriğinin şifrelendiğini anlaması ve istenen disk bloklarını işletim sistemine geçirirken anında şifre çözme yapması gerekir. Yapılan bu ekstra çalışma nedeniyle, Tam Disk Şifreleme, bu tür sistemlerin geliştiricileri tarafından akılda tutulması gereken daha yavaş okuma/yazma işlemlerine neden olur.

Uçtan Uca Şifreleme

Bu günlerde büyük sosyal ağların devam eden gizlilik ve güvenlik kabusları ile, hiç kimse "uçtan uca şifreleme" teriminden habersiz değil, uygulama yapmak veya sürdürmekle hiçbir ilgisi olmasa bile.

Daha önce Tam Disk Şifrelemenin nasıl üstün kurşun geçirmez strateji sağladığını gördük, ancak günlük kullanıcılar için uygun değil. Demek istediğim, Facebook'un telefonunuzda oluşturduğu ve sakladığı telefon verilerinin güvende olmasını istediğini, ancak tüm telefonunuzu şifrelemeye ve süreçteki diğer her şeyi kilitlemeye erişimi olmadığını hayal edin.

Bu nedenle, bu şirketler uçtan uca şifrelemeye başladılar; bu, verilerin uygulama tarafından oluşturulduğunda, depolandığında veya aktarıldığında şifrelendiği anlamına gelir. Başka bir deyişle, veriler alıcıya ulaştığında bile tamamen şifrelenir ve yalnızca alıcının telefonundan erişilebilir.

Resim kredisi: Google

Uçtan Uca (E2E) şifrelemenin Genel Anahtar şifrelemesinin yaptığı gibi herhangi bir matematiksel garanti taşımadığını unutmayın; bu yalnızca anahtarın işletmeyle birlikte saklandığı standart şifrelemedir ve iletileriniz işletmenin karar verdiği ölçüde güvenlidir.

Çözüm

Muhtemelen bu terimlerin çoğunu zaten duymuşsunuzdur. Hatta belki hepsi. Eğer öyleyse, sizi bu kavramlara ilişkin anlayışınızı yeniden gözden geçirmenizi ve ayrıca onları ne kadar ciddiye aldığınızı değerlendirmenizi tavsiye ederim. Uygulama veri güvenliğinin her seferinde (sadece bir kez değil) kazanmanız gereken bir savaş olduğunu unutmayın, çünkü tek bir ihlal bile tüm endüstrileri, kariyerleri ve hatta hayatları yok etmeye yeterlidir!