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.

XKCD 936: Password Strength

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:

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

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

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

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

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

Egzersizler

  1. Entropi.
    1. 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?

    2. İ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?

    3. Hangisi daha güçlü bir paroladır.

    4. Bir saldırganın saniyede 10,000 parola deneyebildiğini varsayın. Ortalama olarak, bu iki parolayı kırma süresi ne kadar olabilir?

  2. 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).

  3. Simetrik şifreleme. OpenSSL kullanarak bir dosyayı AES ile şifreleyin: openssl aes-256-cbc -salt -in {giren dosya} -out {çıkış dosyası}. İçeriğine cat ya da hexdump kullanarak bakın. openssl aes-256-cbc -d -in {giren dosya} -out {çıkış dosyası} ile şifreyi çözün ve cmp çözülmüş dosya ile ilk dosyanın içeriğinin aynı olduğunu doğrulayın.

  4. Asimetrik şifreleme.
    1. 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.
    2. GPG kullanın
    3. Çalgan’a şifrelenmiş bir e-posta gönderin (public anahtarı).
    4. git commit -S kullanarak bir Git commiti imzalayın ya da git tag -s ile imzalanmış bir Git etiketi oluşturun. git show --show-signature ile committeki imzayı doğrulayın ya da git tag -v ile etiket için doğrulayın.

Bu sayfayı düzenle.

CC BY-NC-SA lisansı ile lisanslanmıştır.