Güvenlik ve Kriptografi
Geçen yılın güvenlik ve gizlilik dersi bir bilgisayar kullanıcısı olarak nasıl daha güvende olacağımıza odaklandı. Bu yıl, amacına uygun olarak Git’de Hash Fonksiyonları kullanımı ya da anahtar türetme fonksiyonları ve SSH’da simetrik/asimetrik şifreleme sistemleri gibi daha önce bu sınıfta bahsettiğimiz araçların güvenlik ve şifreleme konseptlerine odaklanacağız.
Bu kurs bilgisayar sistem güvenliği (6.858) ya da kriptografi (6.857 ve 6.875) dersinin yerini tutacak kadar detaylı değildir. Güvenlik konusunda resmi bir eğitim almadan güvenlik ile alakalı bir çalışma yapmayın. Uzman olana kadar, sakın kendi şifreleme algoritmanızı oluşturup kullanmayın.
Aynı durum sistem güvenliği için de geçerlidir.
Bu ders temel kriptografi konseptleri hakkında resmi olmayan (ama pratik olduğunu düşündüğümüz) bir işleyişe sahip. Güvenli sistemler ya da güvenlik protokolleri tasarlamak için yeterli bir eğitim değil, ancak size kullandığınız programları ve protokolleri anlayacak kadar genel bilgi vereceğini umut ediyoruz.
Entropi
Entropi düzensizliğin ölçüsüdür. Parolaların gücünün belirlenmesi gibi alanlarda oldukça kullanışlıdır.
Yukarıdaki XKCD karikatüründe bahsedildiği gibi, “correcthorsebatterystaple” gibi bir parola “Tr0ub4dor&3” gibi bir paroladan daha güvenlidir. Ama böyle bir şey nasıl ölçülebilir?
Entropi bit cinsinden ölçülür, bir olasılıklar kümesi için entropi hesaplanırken şu
şekilde hesaplanır: log_2(olasılıkların sayısı)
. Yani adil bir madeni paranın yazı tura
atılmasının entropisi 1 bittir (log_2(2)). 6 yüzlü bir zar atıldığında entropisi
~2.58 bit olacaktır (log_2(6)).
Saldırganın parolanın modelini bildiği, ancak parola seçmek için kullanılan rastgeleliği (örneğin zar atmak) bilmediği varsayılır.
Ne kadar entropi yeterlidir? Bu sizin tehdit modelinize bağlıdır. Online tahminler için XKCD karikatüründe de göründüğü gibi ~40 bit entropi yeterlidir. Offline bir tahmin saldırısı için daha sağlam parolalar önemlidir. (80 bit ya da daha fazla.)
Hash fonksiyonları (Özet fonksiyonları)
Kriptografik hash fonksiyonu değişken uzunluklu veri kümelerini, sabit uzunluklu veri kümelerine haritalayan algoritma veya alt programdır. Bazı özel özelliklere sahiptir. Bir hash fonksiyonu kabaca aşağıdaki özelliklere sahiptir:
hash(value: array<byte>) -> vector<byte, N> (Sabit bir N için)
Hash fonksiyonlarına örnek olarak, Git’de de kullanılan SHA1
verilebilir. İsteğe bağlı uzunlukla bir karakter dizisini 160 bit’e haritalar. (40 onaltılık karakter olarak gösterilebilir.). sha1sum
komutu ile bir girdi kullanarak SHA1’i deneyebiliriz:
$ printf 'hello' | sha1sum
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
$ printf 'hello' | sha1sum
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
$ printf 'Hello' | sha1sum
f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
Basitçe incelendiğinde, bir hash fonksiyonu tersinin alınması çok zor, rastgele görünümlü (ancak deterministik) bir fonksiyondur (ve bu hash fonksiyonunun ideal bir modelidir). Bir hash fonksiyonu aşağıdaki özelliklere sahiptir:
- Deterministik: her zaman aynı girdi için aynı çıktıyı verir. Rastgelelik yoktur.
- Tersinemez (Ters görüntüye dayanıklılık):
m
girdisi içinhash(m) = h
iseh
‘ı kullanarakm
‘i bulmak zor olmalıdır. Hash fonksiyonu tek yönlü olmalıdır. - Hedef çakışması direnci: İki ayrı mesajın aynı hash’inin olması çok zor olmalıdır. Bir
m_1
mesajının hash değeri ile farklı bir mesaj olanm_2
‘nin hash değerinin aynı olmasının zorluğudur. Çakışma örneği:hash(m_1) = hash(m_2)
. - Çakışma Direnci: Herhangi iki farklı girdinin aynı özeti çıktı olarak üretmemesidir. Hash değerleri aynı
olan
hash(m_1) = hash(m_2)
iki girdininm_1
m_2
bulunması zor olmalıdır. (bunun kesinlikle daha güçlü bir özellik olduğunu unutmayın).
Not: Belirli amaçlar için çalışabilse de, SHA-1 artık güçlü bir kriptografik hash fonksiyonu değildir. Kriptografik hash fonksiyonlarının yaşam süresi ile ilgili ilgi çekici bir tablo bulabilirsiniz. Ancak, spesifik hash fonksiyonlarının önerilmesi bu dersin hedeflerinden ve amaçlarından değil. Eğer önemli bir işte bir hash fonksiyonu kullanacaksınız, önce güvenlik ve kriptografi alanında eğitim almalısınız.
Uygulamalar
-
Git, içerik adresli depolama için kullanır. Hash fonksiyonu fikri daha genel bir konsepttir (kriptografik olmayan hash fonksiyonu). Git neden kriptografik hash fonksiyonu kullanır?
-
Dosya içeriğinin kısa bir özeti. Yazılımlar bazen (potansiyel olarak daha az güvenilir) mirrorlardan indirilebilir. Örneğin: Linux ISOları, ve onlara güvenmemek iyi bir seçim olabilir. Resmi siteler genellikle dosyaların hashlerini indirme linklerinin (üçüncü parti bir siteye referans eden) yanında gösterirler, böylece hashler dosya indirildikten sonra kontrol edilebilir.
-
Üstlenme şemaları. Belirli bir değere bağlı kalmak istediğinizi, ancak değerin kendisini daha sonra ortaya çıkardığını varsayalım. Örneğin, Alice ve Bob’un aynı ortamda bulunmadığını ve bir kişi seçmek için yazı tura atacaklarını varsayalım. Alice ve Bob birer tane madeni parayı atacaklar ve ikisinin sonucu aynıysa Alice bir yemek ısmarlayacak, eğer ikisinin sonuçları farklı olursa Bob yemek ısmarlayacak. Bu durumda ilk kimin sonucunu söyleyeceği karşı tarafın hile yapması ile sonuçlanabilir. Dolayısı ile şöyle bir yol izlenebilir. Tek sayıların yazıyı, çift sayıların turayı var sayılarak sonuçlar önce bir hash fonksiyonundan geçirilir.
a
Alice’in sonucunu (yazı geldiğini varsayıyoruz) temsil eden sayı örneğin “1789” veb
Bob’un sonucunu (tura geldiğini varsayıyoruz) “59980” temsil ediyor. Her iki tarafta da birbirlerine hash fonskiyonalrı sonucuhash(a)
vehash(b)
birbirleriyle paylaşılabilir 2 tarafta bu hashleri aldıktan sonra birbirlerine söyledikleri (teklik ve çiftlik durumuna göre yazı ya da tura olduğu belirlenen) sayıları teyit edebilirler. Böylece iki tarafın da hile yapmasının önüne geçilir.
Anahtar türetme fonksiyonları
Kriptografik hashlerle ilgili bir terim, anahtar türetme fonksiyonları (ATF) diğer kriptografik fonksiyonlarda anahtar olarak kullanılacak belirli uzunlukta çıktılar üretmeyi de içeren bir dizi işlemde kullanılır. Genellikle ATF’ler kasıtlı olarak yavaş tutulur. Burada amaç çevrimdışı kaba kuvvet saldırılarını yavaşlatmaktır.
Uygulamalar
- Diğer kriptografik fonksiyonlarda kullanmak için parolalardan anahtar üretimi. (Örneğin: simetrik kriptografi, aşağıda bahsediliyor).
- Giriş bilgilerini saklamada kullanılır. Parolaları düz metin halinde tutmak kötüdür;
doğru yaklaşım her kullanıcı için bir salt (tuz) oluşturmak
salt = random()
ve saklamaktır.ATF(password + salt)
değeri de saklanır. Giriş isteği saklanan salt ve girilen parola kullanılarak ATF değerinin yeniden hesaplanması ve saklanan değer ile karşılaştırılması ile kontrol edilir.
Simetrik şifreleme
Kriptografi hakkında düşündüğünüzde mesaj içeriklerinin gizlenmesi muhtemelen aklınıza gelen ilk konsept olacaktır. Simetrik şifreleme bunu aşağıdaki fonksiyon seti ile başarır:
keygen() -> anahtar (bu fonksiyon rastgeledir)
şifrele(düz metin: array<byte>, anahtar) -> array<byte> (şifrelenmiş metin)
çöz(şifrelenmiş metin: array<byte>, anahtar) -> array<byte> (çözümlenmiş düz metin)
Şifreleme fonksiyonu sonuç olarak bir çıktı verir (şifreli metin), key olmadan
şifrelemeyi çözmek ve veriye (düz metin) ulaşmak oldukça zordur. Şifre
çözme fonksiyonu tam doğruluk özelliğine sahiptir, şifrele(çöz(m, k), k) = m
‘dir.
Günümüzde yaygın olarak kullanılan bir simetrik şifreleme sistemi de AEStir.
Uygulamalar
- Güvenilmeyen bir bulut saklama servisinde dosyaları saklamak için kullanılabilir.
ATF ile birlikte kullanılabilir, böylece bir parola kullanılarak dosyalarınızı
şifreleyebilirsiniz. Anahtarı üretin
anahtar = ATF(passphrase)
, ve daha sonraşifrele(dosya, anahtar)
sonucunu depolayabilirsiniz.
Asimetrik şifreleme
“Asimetrik” terimi burada iki farklı role sahip iki anahtar kullanıldığını işaret eder. Private anahtarın adından da anlaşılabileceği gibi gizli tutulması gerekir. Public anahtar herkese açık olarak paylaşılabilir. Simetrik şifrelemenin aksine güvenliği etkilemez. Asimetrik şifreleme sitemleri şifrelemek/çözmek ve imzalamak/doğrulamak için aşağıdaki fonksiyonları takip eder:
keygen() -> (public anahtar, private anahtar) (bu fonksiyon rastgeledir)
şifrele(düz metin: array<byte>, public anahtar) -> array<byte> (şifrelenmiş metin)
çöz(şifrelenmiş metin: array<byte>, private anahtar) -> array<byte> (çözümlenmiş düz metin)
imzala(mesaj: array<byte>, private anahtar) -> array<byte> (imza)
doğrula(mesaj: array<byte>, imza: array<byte>, public anahtar) -> bool (imzanın geçerli olup olmadığı)
Şifreleme/çözme fonksiyonları simetrik kripto sistemler ile benzer analoglara sahiptir.
Mesaj public anahtar (herkese açık anahtar) kullanarak şifrelenebilir. Şifrelenmiş
metinden private anahtar (kişiye özel, saklı anahtar) olmadan düz metine ulaşılması
zordur. Şifre çözme fonksiyonu kesin doğruluğa sahiptir, yani çöz(şifrele(m, public anahtar), private anahtar) = m
.
Simetrik ve asimetrik şifreleme fiziksel kilitlerle karşılaştırılabilir. Simetrik kripto sistemler kapı kilidi gibidir: Anahtara sahip biri kilitleyebilir ve kilidi açabilir. Asimetrik şifreleme kripto sistemler anahtarlı bir asma kilit gibidir: Açık halde kilidi istediğiniz birine verebilirsiniz (public anahtar), onlar bir kutuya mesajı koyarlar ve bu asma kilitle o kutuyu kilitlerler, sonrasında sadece siz kutuyu açabilirsiniz. Çünkü anahtara sadece siz sahipsiniz (private anahtar).
İmzalama/doğrulama fonksiyonları fiziksel imzalarda olması umulan tüm özelliklere sahiptir.
İmzayı taklit etmek zordur. Mesajın ne olduğu önemli değildir, bir private anahtar kullanmadan
oluşturulan bir imzadan verify(mesaj, imza, public anahtar)
işleminden true değeri elde
etmek çok zordur. Ve tabii ki doğrulama fonksiyonu kesin doğruluğa sahiptir. doğrula(mesaj,
imzala(mesaj, private anahtar), public anahtar) = true
Çevirmen bilgi notu:
Private Key: Hususi anahtar
Public Key: Umumi anahtar olarak yaygın olmayan bir şekilde Türkçe'de kullanılabiliyor.
Uygulamalar
- PGP e-posta şifrelenmesi. İnsanlar public anahtarlarını online olarak paylaşırlar (örneğin, PGP anahtar sunucusunda, ya da Keybase’de). Herhangi biri onlara şifrelenmiş e-posta gönderebilir.
- Özel Mesajlaşma. Signal ve Keybase gibi uygulamalar özel iletişim kanalları kurmak için asimetrik anahtarları kullanırlar.
- Yazılım imzalama. Git GPG ile imzalanmış etiketlere ve commitlere sahip olabilir. Paylaşılmış public anahtar ile herkes indirilen yazılımın doğrulunu kontrol edebilir.
Anahtar dağıtımı
Asimetrik anahtar şifrelemesi harika, ancak zorlayıcı kısmı public anahtarların dağıtımı / gerçek hayattaki kişilerle public anahtarların eşleştirilmesi. Bu sorunun çözümü için bir çok yol var. Signal basit bir çözüme sahip: ilk kullanıma güvenmek, ve çevrimdışı public anahtar değişimini desteklemek (arkadaşlarınızın public anahtarlarını yüz yüze doğrulamak). PGP farklı bir çözüme sahip, ismi de web of trust (güven ağı). Keybase’de başka bir çözüm olan sosyal kanıtı (diğer güzel fikirler ile birlikte) sunuyor. Her modelin kendince avantajı vardır. Biz (eğitmenler ve çevirmen) Keybase’in modelinini beğeniyoruz.
Örnek çalışmalar
Parola yöneticileri
Herkesin kullanmayı denemesi gereken gerekli bir araçtır. (örneğin, KeePassXC). Parola yöneticileri ziyaret ettiğiniz websiteleri için benzersiz, rastgele üretilmiş yüksek entropili parolalar oluşturur. Bu parolaları sizin parola yöneticisi veri tabanı için kullandığınız ana parolayı, ATF’den geçirerek ürettiği anahtar yardımıyla, simetrik olarak şifrelenmiş şekilde tek bir yerde saklarlar.
Parola yöneticisi kullanmak parolanın yeniden kullanmanızı önlemenizi sağlar (böylece web sitelerinin güvenliği ihlal edildiğinde daha az etkilenirsiniz), yüksek entropi parolaları kullanırsınız (bu nedenle güvenlik tehlikesi daha düşüktür) ve yalnızca tek bir yüksek entropili parola hatırlamanız yeterli olur.
2 faktörlü kimlik doğrulama
2 faktörlü kimlik doğrulama (2FA) kimlik doğrulama yöntemi 2FA doğrulayıcısı (YubiKey gibi, “sahip olduğun bir şey” yanında “bildiğin bir parola” gerektirir. Çalınan parolalara ve oltalama (phishing) ataklarına karşı korumak için kullanılır.
Tam disk şifrelenmesi
Dizüstü bilgisayarınızın tüm diskini şifreli tutmak, dizüstü bilgisayarınızın çalınması durumunda verilerinizi korumanın kolay bir yoludur. Linux’ta cryptsetup + LUKS, Windows’ta BitLocker, ya da macOS’te FileVault kullanabilirsiniz. Bu tüm diski parolanızdan türetilecek bir anahtar ile simetrik bir şifreleme metodu ile şifreleyecektir.
Özel mesajlaşma
Signal ya da Keybase kullanmalısınız. Uçtan uca güvenlik, asimetrik şifrelemeden ön yüklenmiştir. Burada kişilerinizin public anahtarlarını elde edebilmek kritik bir adımdır. Eğer iyi bir güvenlik istiyorsanız, public anahtarları çevrimdışı doğrulamaya ihtiyacınız var (Signal ya da Keybase ile), ya da sosyal kanıtlara güvenmeniz gerekecektir (Keybase ile).
SSH
Önceki derslerden birinde SSH kullanımı ve SSH anahtarları işlendi. Bunun kriptografik yönlerine bakalım.
ssh-keygen
çalıştırıldığında size public anahtar ve private anahtar
içeren bir
anahtar çifti oluşturur. İşletim sistemi tarafından sağlanan entropi kullanılarak,
rastgele oluşturulur. (donanım etkinliklerinden toplanan vs.). public anahtar
olduğu gibi kalmalıdır (herkese açıktır, saklamaya gerek yoktur), ancak
private anahtar diskte şifrelenmiş olarak saklanmalıdır. ssh-keygen
programı
kullanıcıdan bir parola ister. Bir anahtar üretmek için bu parolayı anahtar türetme
fonksiyonundan geçirir. Üretilen anahtar private anahtarı simetrik olarak şifrelemede
kullanılır.
Kullanımda, sunucuda istemcinin herkese açık (public) anahtarı bulunur (.ssh/authorized_keys
dosyasında saklanır), bir istemci bağlantı için kimliğini asimetrik imzaları kullanarak kanıtlar.
Bu işlem challenge-response
sayesinde yapılır. Basitçe anlatmak gerekirse, sunucu rastgele bir sayı seçer ve onu
istemciye gönderir. Sonrasında, istemci bu mesajı imzalayıp imzayı sunucuya geri gönderir.
Sunucu gelen imzalanmış veriyi kendisinde olan public anahtarı kullanarak kontrol eder.
Bu yöntem etkili olarak istemcinin public anahtarının, sunucuda bulunan .ssh/authorized_keys
dosyasındaki private anahtarı ile eşleşip eşleşmediğini doğrulamaya yarar.
Kaynaklar
- Geçen yılın notları: bir bilgisayar kullanıcısı olarak nasıl daha güvende olacağımıza odaklanır
- Cryptographic Right Answers: yaygın X’ler için “X için hangi şifrelemeyi kullanmalıyım?” sorusunu cevaplar.
Egzersizler
- Entropi.
-
100,000 kelimeye sahip bir sözlükten rastgele benzersiz 5 kelime seçtiğimizi, ve bu 5 kelimeyi birleştirerek bir parola ürettiğimizi varsayalım. Tüm harfler küçük olarak birleştirilecek. Örnek olarak şuna benzeyecek:
correcthorsebatterystaple
. Oluşan parola kaç bit entropiye sahip olur? -
İkinci bir alternatif şema hayal edin. 8 rastgele alfa-numerik karakterden oluşan (küçük ve büyük harflerin ikisini de barındırabilir) bir parola ürettiniz. Örneğin,
rg8Ql34g
. Bu parola kaç bit entropiye sahip olur? -
Hangisi daha güçlü bir paroladır.
-
Bir saldırganın saniyede 10,000 parola deneyebildiğini varsayın. Ortalama olarak, bu iki parolayı kırma süresi ne kadar olabilir?
-
-
Kriptografik özet fonksiyonları. Bir mirror‘dan Debian imajı indirin. (Örneğin, Arjantin’deki bir mirror. Resmi Debian web sitesinden verilen hashi kullanarak (Arjantin örneği için bu dosya hashe çapraz kontrol uygulayın (örneğin,
sha256sum
komutunu kullanarak). -
Simetrik şifreleme. OpenSSL kullanarak bir dosyayı AES ile şifreleyin:
openssl aes-256-cbc -salt -in {giren dosya} -out {çıkış dosyası}
. İçeriğinecat
ya dahexdump
kullanarak bakın.openssl aes-256-cbc -d -in {giren dosya} -out {çıkış dosyası}
ile şifreyi çözün vecmp
çözülmüş dosya ile ilk dosyanın içeriğinin aynı olduğunu doğrulayın. - Asimetrik şifreleme.
- SSH anahtarlarınızı erişimizin olduğu bir bilgisayara kurun. Bağlantıdaki öğreticide anlatılan RSA yerine, daha güvenli olan ED25519 anahtarlarını kullanın. private anahtarınızın bir parola ile şifrelendiğinden emin olun, böylece dosya diskte duruyorken korunur.
- GPG kullanın
- Çalgan’a şifrelenmiş bir e-posta gönderin (public anahtarı).
git commit -S
kullanarak bir Git commiti imzalayın ya dagit tag -s
ile imzalanmış bir Git etiketi oluşturun.git show --show-signature
ile committeki imzayı doğrulayın ya dagit tag -v
ile etiket için doğrulayın.
CC BY-NC-SA lisansı ile lisanslanmıştır.