Wednesday, July 17, 2013

SSL Paket Güvenliği

Yanlış okumadıysam giden gelen paketleri sniffleyince SSL'nin güvenli olmadığı yazılmış.

Aslında ilk başta düşününce böyle olması çok normal geliyor sonuçta giden gelen bütün dataları inceleyip editleyebilirsek kurbanın sahip olduğu tüm bilgilere sahip oluruz.

SSL protokolünde asymmetric key encryption kullanılır, yani bu kısaca ne demek, her keyin bir eşi vardır.

e encryption fonksiyonumuz,
d decryption fonksiyonumuz,
p plain datamız,
k1,k2 keylerimiz olsun.

p = d(e(p,k1),k2) = d(e(p,k2),k1) != d(e(p,k1),k1) != d(e(p,k2),k2)

türkçesi de bir key ile şifrelediğin şeyi ancak ve ancak diğer key ile çözebilirsin vice versa. Tabi bu kadar özel bi key çiftini yaratmak için, özel de bi algoritma lazım ama konu o değil, sadece böyle keyler olduğunu varsayabiliriz

SSL'de exchange edilen keyler ise public keylerdir. Yani public keyler adı üstünde publiclerdir ve herkese dağıtılırlar, diğer eşleri ise yani private keyler local sistemde saklanırlar ve kimseye verilmemeleri/gösterilmemeleri gerekir. Public keyleri sniffing ile almak bakkaldan bişey almak yerine çıkan müşterilerden bişey satın almak gibi yani.

Peki tüm bunlar nasıl işliyor?
Servera bağlandığınız zaman siz oradan bir sertifika istiyorsunuz, bu sertifika çeşitli şeyler içeriyor bizi ilgilendirenlerse bağlandığımız serverın public key'ini ve sertifikanın orasıyla burasıyla oynanmadığına dair koca bir hash içermesi. Bu sayede ilk adım tamamlanmış oluyor. Yani size gelen encrypted datayı siz eğer serverın public keyi ile decrypt edebiliyorsanız bunun o istediğiniz serverdan geldiğine emin olabilirsiniz.

İkinci adım ise sizin gönderdiklerinizi sadece muhattabınız olan serverın okumasını istiyorsunuz, çünkü asıl kredi kartı şu bu bilgileri burada, bunun için de ne yapıyoruz herkesin bildiği muhattab serverın public keyi ile kendi bilgilerimizi encrypt ediyoruz ve gönderiyoruz. Bu data snifflenirse ne olur? Hiç bir şey olmaz çünkü serverın public keyi ile şifrelenmiş şey sadece ve sadece serverın bildiği private key ile açılabilir, en azından asymmetric key encryption bize bunu garanti ediyor, umarım ediyordur veya

Şu anda sistemde tek bir açık kaldı, dikkatli okuduysanız server bize güvenli olmayan http üzerinden sertifikayı ve public keyi atıyor, eğer man in the middle varsa bu sertifikanın public keyini değiştirip hashini de tabi tekrar yaratıp altına yapıştırıp bize gönderebilir. Bunu engelleyen şey ise browserımızı indirirken içinde zaten public keyler ve çeşitli sertifikalarla iniyor. Hiç bir public key içinde olmasa bile garanti edilen şey bu sertifikaları düzenleyen denetleyen Certificate Authority(CA)'lerin kendi sertifikalarının olduğu. Eğer elinizde tek doğru olduğuna emin olduğunuz sertifika bile varsa bahsettiğimiz yöntemi kullanarak diğer web serverların bize gönderdiği sertifikaların&public keylerin geçerli olup olmadığına emin olabiliriz buna da chain of trust deniyor. Elimizde tüm sertifika bilgilerinin sahibine ulaşan tamamen güvenilir bir yol varsa ki var, kime güvenip kime güvenemeyeceğimizi kesin olarak ayırt edebiliriz demektir.

Bu kadar anlattım ama aslında sistem tam olarak böyle işlemiyor, dikkat ettiyseniz burda tek taraflı bir güven var, yani banka bilgileri alıyor ama o bilgileri gönderenin gerçekten bizim bilgisayarımız olup olmadığını bilemiyor. Buna ihtiyacı da yok aslında, atıyorum iki banka arası bilgi akışıyla karşılaştırdığımız zaman.

Sistem hem tek taraflı hem de çift taraflı güven ortamı oluşturabilsin diye ara bir noktada bizim bilgisayarımız da random olarak bir private key oluşturup, bundan public keyi hesaplıyıp, bankanın public keyi ile bu public keyi encrypt edip bankaya gönderir, böylece banka o bulduğu public keyle açabildiği her şeyin bizden gelmiş olduğunu anlar. Bu niye çift taraflı değil çünkü zaten random olarak atıyoruz yani bidahaki girişimizde aynı falan kalmayacak. Ama bankanın da pre-determined bi public key havuzu olduğunu varsayarsak mesela diğer bankaların pkleri bulunan, o zaman çift taraflı güven ortamı oluşabilir

Son olarak da handshakingden sonra veya yeterince öpüşüp koklaştıtktan sonra asymmetric key encryption bırakılır ve ortak karar verilen bi symmetric key encryptiona geçilir, bunun sebebi ise asymmetric encryptionın baya bir cpu-cycle yemesi ki bir de keyin uzunluğu düşünülünce..

Wednesday, July 10, 2013

Encryption ve Hashing'e Giriş

İnternetteki güvenliğin (SSL/TSL) nasıl sağlandığı ile ilgili bir yazı yazacaktım. Sonradan farkettim ki bu yazıda kullanacağım konseptler ve terimler bir çok insana yabancı, dolayısıyla bu giriş yazısını yazmaya karar verdim.
Konuları sıralayacak olursam:
  1. Algoritma ne demektir?
  2. Encryption
  3. Hashing
not:Uzun zaman önce yazmaya başlamıştım, şimdi bitirdim tamamını kontrol etmedim umarım bir yanlışlık&tutarsızlık yoktur, iyi okumalar.

1. Algoritma Ne Demektir?
   En çok duyduğum sorulardan bir tanesi "Algoritma ne demek?". Dört dörtlük bir açıklaması var mı bilemem ama benim tanımım şöyle:Algoritma matematikten bildiğimiz fonksiyonların daha geniş kapsamlı halidir. Fonksiyonlar parametreler alırlar ve sonuçlar döndürürler. Bu arada aldıkları parametreleri belirli işlemlere tabii tutarlar. Toplama mesela bir fonksiyon, ve dolayısıyla basit bir algoritmadır. İki parametre alıp, bir sonuç döndürür. On sayının ortalamasını almak da bir fonksiyon ve gene dolayısıyla basit bir algoritmadır.
  Ayrıldıkları yer ise: Mesela kek yapmanın da bir algoritmasını yazabiliriz, çünkü izlediğimiz belirli işlemler var. Hamuru hazırla -> fırına koy -> kabarmasını bekle -> çıkar gibi sıralı işlemler. Kısacası sıralı işlemler olarak ifade edebileceğimiz her şey algoritma tanımına girer.
 Algoritmalar genellikle şemalar halinde gösterilirler, okuması ve anlaması düz bir metinden daha kolay oluyor diye.Şimdi iki örnek sunacağım, hoşunuza gideni okuyabilirsiniz, ilki biraz matematik ağırlıklı.

 Örnek 1:
    İki fonksiyon eğrisinin belirli bir aralıkta aralarında kalan alanı bulan bir algoritma yazalım. Girdiler f(x), g(x) ve [a,b] aralığı olsun.(Kısa olsun ve döngü yapısına gerek duymayalım diye fonksiyonların [a,b] aralığında kesişmediklerini varsayıyorum)


Mesela "integral al" işleminin de bir alt algoritmasını yazabiliriz. Ama işlemlerin yeterincetemel olması kabul edilebilir. Burda ana problemi baz aalabilirsiniz. Ana problem kek yapmak iken unu dolaptan almak yeterince temel bir ifadedir, yani unun oraya nasıl geldiği ve nasıl üretildiği algoritmanın alanına girmez.

(Buarada o şekiller kafama göre değil, yani baklava şekli veya dikdörtgen veya köşeleri bombeli dikdörtgen'in farklı anlamları var.)

İkinci olarak daha somut bir örnek seçelim. Ofisinde çalışan bir insanın yangın çıktığında uygulaması gereken algoritma mesela:



2. Encryption
       Encryption şifrelemek demek, ancak türkçesini kullanmadım çünkü hashing ile farkının anlaşılmasını istedim. Bu anlamdaki şifreleme geri çevirilebilir şifreleme.(Geri çevrilemeyen şifreleme ne işimize yarar ki ? diye sormayın, hashing'in kullanım alanlarında göreceğiz.) Ben size bir mesaj göndermek istiyorum ama yolda başka kimse okuyamasın diye bunu belirli bir algoritmaya göre şifreliyorum, siz de bu şifrelenmiş veriyi decrypt edip asıl mesaja ulaşıyorsunuz.
      Peki bu şifreleme nasıl oluyor? Milyonlarca yöntem "keşfedebilirsiniz".Kullanılan belirli yöntemler olsaydı anlamı kalmazdı. Çünkü şifrelenmiş veriyi ele geçiren biri bu yöntemleri tek tek denerdi ve mesaja ulaşırdı, burda önemli olan yaratıcı bir biçimde şifrelemek.
      Gelelim örneğimize; belki küçükken denemişsinizdir, olabilecek en basit şifreleme yöntemi her harfi bir harf ileri atmaktır sanırım. a yerine b, b yerine c, c yerine d, .... , z yerine a yazarak şifreleyeceğiz.


     Şifrelenmiş bilgimiz, ki bunun terimi de cipher'dir, artık başkasının eline geçerse ona anlamsız gelecektir. Göndermek istediğimiz kişi ise bu harfleri tek tek geri atıp mesajımızı okuyabilecek!
      Tabii ki bu gerçekçi bir senaryo değil zira basitçe şifrelenmiş bir cipher'a uygulanabilecek ilk adım bu kaydırma yöntemidir.
     Bu kaydırma yöntemini biraz daha geliştirirsek şöyle bir şey elde edebiliriz.


     fşdöu verisini istediğiniz kadar ileri geri 5, 10 kaydırın mesaja ulaşamazsınız, çünkü her harfi sırası kadar artırdım. İlkini bir, ikincisini iki ... Bundan ötesi yaratıcılığınıza kalmış :)

     Encryption'da bilinmesi gereken bir diğer konsept de anahtar, yani key konseptidir.
     En basit örneğimize dönelim, harfleri birer harf ileri atıyoruz. Burdaki "harfleri ileri atma" algoritmamız, " bir harf ileri atma" yani "1" anahtarımız. Bu algoritmayı 5 anahtarıyla şifrelersek gönderdiğimiz kişiye şifreli veri ve anahtarı göndermemiz gerekir. Böylece mesajı decrypt edebilir.
     Tabi böyle bir algoritmada bir geri atar, iki atar, üç atar .. mantıklı bir sonuç çıkarana kadar çözmeye çalışır, bu yönteme de brute-force diyoruz.Brute-force yaklaşımı bu algoritmayı kısa zamanda çözebilir, yani decrypt için anahtar bir "zorunluluk" değil ama öyle algoritmalar bulabilirsiniz ki şifrelenmiş veri ile birlikte anahtarı göndermezseniz karşıdaki bu mesajı açamaz.
     Tabi korkmayın pakedin içinde anahtarınızı gören biri olsa bile decrypt algoritmasını bilmediği için onun açması da imkansız. Yani algoritma asıl güvenliğimiz, anahtar sistemi ise ekstra bir önlem.

3. Hashing
     Encryption ile ilgili bir hayli fikriniz olmuş demektir. Hashing'in farkı geri dönüştürülemez oluşu, yani bir mesaj yazıp hash'liyip karşı tarafa göndermeniz bir anlam ifade etmez.Önce basit bir örnek yapalım sonra kullanım alanlarına değiniriz.

e->6               j->13
r->21             o->18
a->1
l->15
p->20


Baştan ve sondan içeri doğru ikişer ikişer grupluyoruz ve harf değeri olarak ortalamalarını alıyoruz. (e+p)/2, (r+l)/2 gibi sonra her harfin altına dahil olduğu ortalama hesabının sonucunun harf değerini yazıyoruz.
joaoj eralp'in hashlenmiş hali. Bunu geri döndürebilir misiniz? Sanmıyorum. İki sayının ortalaması 10, sayıları bulabilir misiniz? gibi bir soru bu, sonsuz çözümü var. Mesela joaoj'nin bu algoritmaya göre hash'ini alırsanız o da joaoj çıkar!

     Yani eralp'in, joaoj'nin ve daha pratik olarak sonsuz tane şeyin hash'i aynı. Eğer iki şeyin hash'i aynıysa biz buna collusion diyoruz. Peki bu kadar çok collusion çıkma riski varsa hashing algoritmalarını nerede kullanıyoruz?
     Benim sunduğum basit algoritmada collusion çıkarmak çok çok kolay ama piyasada kullanılan hashing algoritmalarında oran çok! düşük, hatta collusion olmadığı kabul ediliyor.

     Siz bir siteye üye olurken kullanıcı adınızı ve şifrenizi veriyorsunuz. Hiç bir site veritabanına şifrenizi hashlemeden (plain olarak) kaydetmez. Bunun yerine şifrenizi alır MD5 algoritmasına verir ve mesela eralp için şöyle bir sonuç çıkarır:
"a5042cd85c39a1a22e5e18b5f3895956"
bunu veritabanına kaydeder. Siz girmek istediğinizde tekrar şifrenizi gönderirsiniz, site alır bunu ve MD5 algoritmasına sokar, çıkan hash'i veritabanındakiyle karşılaştırır, eğer aynıysa giriş izni alırsınız. Durun bakalım! Biz yani kendi şifremizle collusion'ı olan bir şey yazıp gönderseydik yine de girebilecek miydik? Cevap evet, ama dediğim gibi özellikle MD5'te bir collusion bulmanız 5 yılınızı alabilir :)
    Veritabanları neden böyle çalışıyor? Neden sadece şifremizi düz olarak kaydetmiyor? Bu güvenlik ile ilgili. Siz de muhtemelen çoğu site için aynı şifreyi kullanıyorsunuz. Eğer üyesi olduğunuz bir site hacklenirse, hacker şifrenizi alıp her siteye giremeyecek, sadece MD5 hash'ini alabilecek. Bunu sitelere gönderemez, çünkü siteler sizden gelen veriyi kendileri MD5'lerler. Gönderirse MD5'in MD5'ini almış olur ve veritabanındakiyle eşleşmez.

    MD5 hash algoritmasının bir başka kullanım alanı da file verification'dır. İnternetten bir dosya indirdiniz ama acaba tam olarak aynı dosyayı mı indirdiniz yoksa bir kaç byte'ı yanlış mı (corrupted) bunu bilmek istiyorsunuz. İnternet sitesi dosyayı koyarken yanına bir de bu dosyanın MD5 hash'ini koyuyor, yani bir nevi kimlik. 32 karakter'lik bir kimlik. Siz dosyayı indiriyorsunuz, bilgisayarınız indirdiği dosyayı MD5 algoritmasına göre hashliyor ve 32 karakterlik çıktısına bakıyor. Eğer çıktı ve internetteki kimlik aynıysa doğru indirmişsiniz demektir. Dikkat edin, o kimlikten dosyayı oluşturamazsınız ama her dosyanın 32 karakterlik bir kimliğini çıkartıp doğrulama yaptırabilirsiniz. Demek ki geri dönüştürülemeyen şifreleme de bir işe yarıyormuş :)

Bir dahaki yazıda (UDP/TCP protokolleri nedir ne değildir, ve TLS/SSL güvenliği nasıl sağlanır?) görüşmek üzere.