12 Mayıs 2012 Cumartesi

KRİPTOGRAFİ


Kriptografi
Bizim CryptoUtility Bileşen İle Apps Güçlü Şifre istihdam
Biz tüm bilgisayarlarda gizli bilgileri depolamak için uyarıyorum. Bu şifreleri depolamak, kredi kartı numaraları, veya sisteminizde Sosyal Güvenlik numaraları riskli olduğunu ve bilgileri çalmak için birisi için kapıyı açmak biliyorum. Ancak, iyi bilgisayar sistemleri bu tür hassas bilgileri depolamak için ihtiyaç olabilir.
Diyelim ki bir banka ödeme işleme sistemini çalıştıran söylüyorlar. Böyle bir sistem ücretleri tersine çevirmek için, periyodik ödemeler işleme ve hesap denetimleri gerçekleştirmek için kredi kartı numaralarını depolamak gerekiyor. Bu senaryoda, bir tersinir olmayan yöntem (örneğin bir şifre uygulanan bir karma algoritması olarak) sadece uygun değildir. Ayrıca, her iki senaryo çok, bağımsız makinelerde şifreleme ve şifre çözme gerektirir.
Bu yazıda, uygulamalar için güçlü şifreleme bileşenleri geliştirme ile ilgili bazı konuları inceleyecektir. Bu bileşenler açıklanana benzer senaryolarında kullanışlı olacaktır. Ayrıca, CryptoUtility adında yarattığımız bir program için diğer bazı hedefleri var. İlk olarak, sunucu tarafında Web uygulamaları için pratik güvenlik mümkün olan en yüksek düzeyde istiyorum. İkincisi, kurulum montaj talimatları 10 sayfa boyunca yürüyen olmadan birden fazla sunucuya dağıtım sağlayan, bakış bir yönetici açısından nispeten kolay olmalıdır.Üçüncüsü, geri döndürülebilir şifreleme (daha sonra içine almak olacak olan) tuşları korumalı ve güvenli bir şekilde muhafaza ile, mevcut olmalıdır. Bu bir sunucu uygulaması olduğundan Tabii ki, bu idari bebek bakıcılığı ya da yeniden başlatmadan ay için yüksek oranda ölçeklenebilir ve çalıştırmak olmalıdır. Son olarak, bu bileşen de. NET tabanlı uygulamalar (örneğin ASP.NET çalışan Web hizmetleri ve Web uygulamaları gibi) eski COM uygulamaları (örneğin klasik ASP gibi) erişilebilir olmalıdır.
Her uygulamada bazı tür olası güvenlik açıkları vardır. Son derece hassas bilgileri ele bir şey ile, bu tehlikelere büyütülmüş, ve siz de iyice mümkün olduğunca onları anlamak gerekir. Sen tanımlanabilir tehditler birbirleri ile etkileşim ve nasıl birkaç bağımsız konularda bir güvenlik açığı teşkil birleşerek nasıl belirlemeniz gerekir. Bu bilgi ile, güvenlik tehlikeleri tanımlamak potansiyel tehlike öncelik ve risk kabul edilebilir düzeylerde karar verebilir.
Biz, Second Edition (Microsoft Press ®, 2003) Güvenli Kod Yazma Michael Howard tarafından açıklanan, STRIDE ve DREAD modelleri kullanarak tehditler keşfedeceksiniz. STRIDE tehditleri kategorize etmek için bir model değil, oynanması, Sızdırma açılımı, Repudiation, Bilgilendirme, Denial of service, ve ayrıcalık yükselmesi. DREAD bir tehdit ile ilişkili toplam riski hesaplamak için bir model değil, hasar potansiyeli, tekrarlanabilirlik, Yararlanma, Etkilenen kullanıcılar ve Keşfetmek için duruyor. Tehdit modelleme ve analiz bu makalenin kapsamı dışındadır, ama biz sistem güvenlik önlemleri tartışmak olarak biz STRIDE ve DREAD modelleri ile ilgili terimler söz edeceğim.

CryptoUtility Mimarlık
Mimari kararları her çözümü etkiler. İlk karar noktasına bir işlem DLL, bir Windows ® hizmeti veya Enterprise Services kullanarak bir Serviced Bileşeni olarak CryptoUtility uygulamak olup olmadığıdır. Bir işlem DLL bileşeni geliştirilmesi birkaç güvenlik meseleleri sunmaktadır. Birincisi, CryptoUtility ASP.NET hesabı olarak çalışır. Henüz önemli bir yönetim stratejisi (bu daha sonra gelecektir) karar vermedi olsa da, biz anahtar erişimi için ASP.NET hesabını istemiyorum biliyorum. Bu, bir saldırganın güvenlik açığından yararlanarak Web sitesi aracılığıyla gizli bilgi elde ihtimali yaratacak. Bu oran karşıyız, biz korumak olduğunuz veriler zarar potansiyeli oldukça fazla olduğu gibi. Saldırı Bu tür tüm kullanıcıları etkileyecek, bu nedenle daima bu seçeneği kaçınıyorum.
İkinci seçenek, Windows hizmet, umut verici görünüyor. Bir Windows hizmeti kendi kimliği altında çalışan bu yana, biz de işlem DLL vardı endişe yok. Ama sunucu ile iletişim kurmak için en gerçekçi yol olacaktır. NET Remoting. Remoting Microsoft ® inter-AppDomain iletişim için mükemmel bir teknoloji olsa da. NET Framework 1. X güvenli erişim kontrolü Remoting API yerleşik, ne de COM istemcileri erişilebilir değil. Size bir güvenlik katmanı eklemek için Kendi Remoting kanal lavabo bileşenleri inşa edebilirsiniz geldiği doğru olsa da, bu biraz bizim mevcut kapsamı dışındadır. (Stephen Toub Kullanıcı MSDN ® Magazine makale "bakAsimetrik Şifreleme Kanal Evye Yazma Your. NET Remoting Trafik sabitleyin . "Ayrıca bkz" . NET Remoting Kimlik Doğrulama ve Yetkilendirme Örnek-Part II " .)
Biz Remoting ile Kod Erişim Güvenliği (CAS) kullanabilirsiniz, ancak COM istemcileri için destek eksikliği kötü bir seçimdir. Ancak biz, bu makalenin sonraki CAS inceleyerek edilecektir.
Kurumsal Hizmetler bir hizmet bileşenini kullanarak kullanarak aynı yararı vardır bir Windows hizmet-kendi kimlik bilgileri ile kendi kimliği altında çalışır. Ayrıca, Enterprise Services, COM + Bileşen Hizmetleri, güçlü bir erişim kontrolü ve COM istemcileri kolay erişim sağlar üzerine inşa edilmiştir. Bu nedenle, CryptoUtility bir hizmet bileşenini yaptı.

Şifreleme Kararları
Ondokuzuncu yüzyıl Flaman kriptolog Auguste Kerckhoff basit ama güçlü bir kural önerdi: bir şifreleme sisteminin güvenlik anahtarını gizli tutuyor, tümüyle bağlı olmalıdır. Geliştiriciler için ders budur: (aslında, bir eğitim egzersiz dışında tanınmış bir algoritma kendinize uygulayarak önlemek) kendi şifreleme algoritması geliştirmek değildir. Şifreleme teorisi üzerine özellikle odaklanarak matematiksel bir deha değilseniz, hemen hemen kesinlikle kendiniz yapmaya çalışıyor hata yapacağım. Kurulan algoritmaları Ticari uygulamaları gibi Ulusal Standartlar ve Teknoloji Enstitüsü (NIST) tarafından yayınlanan Federal Bilgi İşleme Standartları yoğun olarak sertifikasyon aracılığıyla incelenmesi tamamlandı.
Simetrik ve asimetrik şifreleme: Mevcut kriptografik algoritmaların iki çeşidi vardır. Simetrik (veya özel anahtar) şifreleme şifreleme ve şifre çözme için tek bir anahtar kullanır. Bir tehlikeye önemli bir sistemin güvenliğini başarısızlıkla tamamlamak için yol açabilir. Simetrik algoritmalar ile, anahtar güvenlik anahtara sahip insan sayısı ters orantılıdır.
Asimetrik (veya açık-anahtar) şifreleme ile, iki matematiksel ilgili ancak bağımsız tuşları, bir ortak anahtar ve özel anahtar bulunmaktadır. Özel anahtar ile şifrelenmiş bilgiler sadece genel anahtar ile şifrelenmiş, sadece ilgili özel anahtarı ile çözülebilir karşılık gelen ortak anahtar ve bilgi ile çözülebilecek.
Biz kimseye anahtar dağıtım olmayacak yana, bizim program için simetrik şifreleme kullanacağız. Bu asimetrik bir algoritma çok daha hızlı olma avantajı var ama biz anahtarı korumak için bazı önlemler almak gerekir.

Nasıl Simetrik Algoritmalar çalışın
Bu makalede tip Simetrik algoritmalar blok şifrelere bulunmaktadır. Bunlar, sabit bir boyutta bloklar (Rijndael algoritması, 16, 24, veya 32 bayt durumunda) içine düz yazı parçalamak ve birbirini izleyen bloklar üzerine yeniden düzenleme ve ikame iteratif gerçekleştirmek. . Veri Şifreleme Standardı (DES, önceki Federal standart), 3DES (veya Triple-DES), RC2 ve Rijndael: NET Framework, birkaç Simetrik algoritmalar bir seçim var. Sadece 56-bit anahtar ile, o kaba kuvvet saldırılarına karşı hassastır, çünkü donanım ilerlemiştir olarak Veri Şifreleme Standardı lehine dışına düştü. DES üç kez bitti Triple-DES, hala görece güvenli ve yaygın olarak en platformlarda desteklenen gibi şifreleme için muhtemelen iyi bir seçimdir.
Yerel olarak mevcut algoritmaları en büyük anahtar uzunluğu sunar çünkü. NET-256 bit Biz CryptoUtility için Rijndael seçtiniz. Ayrıca 2001 yılında Federal Hükümet tarafından kabul edilen yeni Gelişmiş Şifreleme Standardı ve sadece DES için bir yedek olarak NIST tarafından sponsorluğundaki bir yarışma çeşitli algoritmaların uzun ve detaylı incelemesinden sonra.

Simetrik algoritmalar için seçenekler
Simetrik algoritmalar kendi çalışmasını kontrol etmek için bir dizi seçenek sunuyoruz. Çoğu durumda, seçilen varsayılan en güvenli olduğu gibi özellikle bu ayarlamak zorunda değilsiniz. Ancak, ne yaptıklarını anlamaya yardımcı olur. Simetrik algoritmalar için seçenekler şunlardır:
Mod şifreleme modunu ayarlar Rijndael için bu da Blok Şifreleme Zinciri (CBC) veya Elektronik Kod Kitabı (CB) 'dir.:
·         CBC,. NET varsayılan, en güvenli şifreleme modu. CBC bu enciphering önce önceki şifre bloğu ile düz yazı her blokta bir XOR işlemi gerçekleştirir. Aynı zamanda bir Başlatmak Vector (IV), algoritmanın blok boyutu aynı uzunlukta bir rastgele blok gerektirir. IV olarak kullanılan bir stand-hiçbir önceki blok olduğunu noktada bu yana, düz yazı ilk blokta Blok Şifreleme Zinciri gerçekleştirmek için. IV aynı anahtar kullanıldığında düz yazı ilk bloğu bu tekrarı şifreli ilk bloğunun benzer tekrarı yol açmaz sağlar.
·         ECB, daha az güvenli seçenek, bağımsız her blok enciphered etti. Düz yazı tekrarı böylece güvenlik zayıflaması, şifreli desenleri üretebilir.
Dolgu doldurma modu ayarlar. Verilen bir mesaj uzunluğu algoritmanın blok boyutu tam katı olmayabilir yana, son blok doldurmak için ped iletinin sonuna gerekir. Dolgu değerleri aşağıdaki gibidir:
·         Pad mesajı için kullanılan bayt sayısını her biri tamsayılar ile PKCS7 yastıkları son blok,. Mesajı doldurma 2 byte gerekirse Örneğin, padding "0x02, 0x02" olacaktır.
·         Yok. Hiçbir doldurma eklenir. Mesaj uzunluğu blok boyutu tam katı olmalıdır.
·         Sıfırları. Son blok sıfırlar ile doldurulur.
Anahtar boyutu, şifreleme ve şifre çözme için kullanılan anahtar uzunluğunu belirler. Onlara kaba kuvvet saldırıları başarılı olma olasılığı daha düşüktür, çünkü uzun anahtarlar genellikle daha güvenlidir. Rijndael boyutları 128, 192, ve 256 bitlik anahtar sağlar. Anahtar boyutu blok boyutu bağımsızdır.
Blok boyutu her blok uzunluğunu belirler. Rijndael ile, blok boyutları, 192 128 olacak ve 256 bit olabilir.
Rijndael blok ve anahtar boyutları tüm dokuz permütasyon ile birlikte kullanılabilir dikkat edin; Bununla birlikte, IV boyutu seçilen blok boyutu ile aynı olmalıdır. Rijndael büyük blok ve anahtar boyutları için mermi daha büyük bir sayı ile, 10 dahili şifreleme sırasında 14 mermi kullanmak olabilir, çünkü bir avantaj büyük blok boyutlarını kullanmak için vardır. Böylece, içten Rijndael kullanan daha fazla devre, daha dirençli şifreleme şifreleme etmektir. Rijndael hakkında daha fazla bilgi için, bkz James McCaffrey yazısı MSDN dergisi Kasım 2003 sayısında Konuyla ilgili.
Ben şifreli için güvenlik en yüksek düzeyde sağlamak için şifre bloğu zinciri ve 256-bit anahtarları ve Rijndael ile blok boyutları kullanmayı seçti. CBC ve başlatma vektörü önem taşımaktadır; birçok kredi kartı numaraları benzer önde gelen rakam ile başlar. Ilk şifreli bunlar için aynı olsaydı şifreli kredi kartları erişmek için birinin o veritabanını çalmaya yönetmesi gerekir için, onu çok daha kolay olurdu!

Güçlü Keys oluşturma
Öngörülebilir şifreleme anahtarları, tahmin edilebilir şifreler gibi, kötü uygulamanızın güvenliğini tehlikeye.El-insanlar tarafından bu tuşları üretemeyen yoksul rasgele sayı üreteçleri vardır. Onun rastgele dizileri (bu nedenle adı "pseudo-random") deterministik ve tekrarlanabilir olduğundan System.Random rasgele sayı üreteci kullanılması da yeterli değildir.
Güçlü anahtarları üretmek için RNGCryptoServiceProvider kullanabilirsiniz. Bu şifrelenmiş güçlü ve rasgele numaralar oluşturur ve anahtar ve tuz / IV üretimi için uygundur. RNGCyptoServiceProvider teknik bir sözde rastgele iken, şifrelenmiş güçlü olarak NIST sertifikalı. Aşağıdaki kodu Visual Basic ® bir örnektir NET veri 32 rasgele bayt almak için RNGCryptoServiceProvider kullanır.
 RNGCryptoServiceProvider = Yeni RNGCryptoServiceProvider () Dim rng
 Byte Dim tuşu () = Yeni Byte (31) {}
 rng.GetBytes (anahtar)
Diğer bir yaklaşım, bir hashed parola bir şifreleme anahtarı oluşturmaktır. Passphrase kolayca hafızaya, bir düz metin ile başlayarak, bir şifreleme anahtarı oluşturmak için PasswordDeriveBytes sınıfını kullanabilirsiniz. Bu yöntemin başlıca avantajı parolayı hatırlamak kolay olmasıdır. Ancak, daha fazla uğraşmayı daha fazla kod gerektirir ve bileşikleri anahtar depolama sorunu da tuz saklamak zorunda çünkü. Bir kullanıcı girişi hemen atılmalıdır sonra şifreleme veya şifre çözme gerçekleştirmek ve hangi, şifre ne zaman Bu yöntem özellikle yararlıdır. Bir sunucu tarafında uygulama olduğu için bu yöntem CryptoUtility için çalışmaz. Kod takiben çizgilerde gösterildiği gibi Bununla birlikte, uygulama dışında depolanan bir anahtar korumak için kullanılan olabilir:
 As Byte Dim entropi () = ...
 PasswordDeriveBytes = Yeni PasswordDeriveBytes (txtKey.Text, _ Dim pwd
     entropi)
 Byte Dim tuşu () = pwd.GetBytes (32)

Güçlü Tuz oluşturma
Tuz şifreleme algoritması ek entropi (bozukluğun derecesi) sağlar. Biz burada gösterildiği gibi anahtar, RNGCryptoServiceProvider rasgele sayı üreteci, yaptığımız gibi IV oluşturmak için aynı yöntemi kullanacağız:
 RNGCryptoServiceProvider = Yeni RNGCryptoServiceProvider () Dim rng
 As Byte Dim entropi () = Yeni Byte (15)
 rng.GetBytes (entropi)
Şifreleme algoritması birinci blok içinde herhangi bir düzen obfuscation sonraki blok karıştırmayı için kullanılan birinci blok olarak, bu IV kullanır. CBC modunda, her blok sonraki bloğun Şifreleme içine doğru beslenir; ilk blok için, IV inç duruyor
Rijndael ile şifreleme gücü IV gizlilik bağlı değildir. Fakat aynı anahtar ile şifrelenmiş ve IV de aynı düz yazı aynı şifreli üretmek gerçeğine bir mesaj içeriğini tahmin etmek için kullanılabilir. Size düz yazı evet ve hayır kelimeleri sınırlıydı Örneğin, bu şifreli tekrar ettiği gibi, aynı anahtar ve IV her zaman kullanılması durumunda bu mesajları çözmek için çok önemsiz kalacaktır. Rastgele IV her zaman ekleme ve böylece bu tahmin oyunu foiling, farklı şifreli üretir.
IV özel olması gerekmez; örneklerimizde, bunu saklamadan önce şifreli için IV prepend. Şifresinin açılması üzerine, bu şifre çözme sırasında kullanılan ile aynı IV kullanılmalıdır. Biz kolayca aşağıda mesajın başından bu yakalayabilir. Bazı şifreli gelen IV ayrı ayrı saklamak savunduk. Ancak, CBC kipinde IV gizli tutmak zorunda kalmadan, yeterli koruma sağlar.
 'Artık şifreli metnin başlangıcına IV append
 çıkış = Yeni Byte (+ data.Length IV_SIZE - 1)
 Buffer.BlockCopy (newIV, 0, çıkış, 0, newIV.Length)
 Buffer.BlockCopy (veri, 0, çıktı, IV_SIZE, data.Length)

 Giriş ilk 16 byte off 'şerit tuz (IV)
 Buffer.BlockCopy (cipherBlob, 0, iv, 0, IV_SIZE)
 'Şifreli diziye gerçek şifreli geri koymak
 Buffer.BlockCopy (cipherBlob, IV_SIZE, şifreli, 0, _
   (CipherBlob.Length - IV_SIZE))

"Hijyenik" Kriptografi
Algoritması olabilir gibi güçlü, biz bilecek bir fırsat penceresi her zaman vardır düz yazı-sırasında şifreleme giden kod tüm zincir. Bu süre zarfında, şifresiz metin şifreli bekleyen, bellek korumasız oturuyor. Kodları şifrelenmiş sonra bile, orijinal şifresiz metin hala belirsiz bir süre için bellekte geziyorum olabilir.
Düz yazı hiç bir System.String nesne olsaydı, değiştirilemez ve bir çöp toplama döngüsü tarafından yazılır kadar hafızada kalır. Metin kutularının, etiketler ve diğer denetimleri bir dizi bir System.String olarak. Text özelliğini saklar. Biraz güvenli dizilerin saklanması için özel SecureString sınıf tanıttı. NET Framework 2.0, bu değişiklikler. (Visual Studio ® 2005 Beta SecureString hakkında bilgi için 1 belgelerine bakın.) Ancak, bu metin kutularının ve benzeri gibi birçok diğer kaynaklardan hafıza gömülü düz yazı sorunu çözmüyor ki.Herhangi bir biçimde (yani bir bayt dizisi, string, char dizi ve) içinde düz yazı işletim sistemi tarafından takas dosyası için yazılmıştır, bu sabit disk üzerinde. Sistem çöküyor ve düz yazı bellekte iken bir bellek dökümü üretir Dahası, eğer düz yazı diske yazılır.
Lütfen işlemi bir hata ayıklayıcı ekleme ve off-site depolama tesisi ve okuma için yedekleme bantları hareket kamyonun sürücüsü rüşvet için düz yazı veya anahtar (yüksek ayrıcalık, karmaşık ve düşük yararlanılma) okuyarak bu açıklardan aralıkları için saldırı modu Lütfen döküm dosyalarını (düşük-teknoloji, sosyal hack, ama hala çok yararlanılamaz). Bu paranoyak senaryolar için en iyi yaklaşım verinin değerini bilmek ve sonra bu değeri ötesinde taviz zorluk kaldırmalı.
Bu, kendi başlarına, büyük oranda sömürüye ve tekrarlanabilir değildir, çeşitli alt-tehditlerin culminations temsil, verilerinizi bu tür tehditleri analiz ederken, detaylı bir tehdit ağacı gösterebilir. Örneğin, bir işlemi bir hata ayıklayıcı eklemek için, Web sunucusu üzerinde yetkileri hata ayıklama olmalı ve ilgili bilgileri bulmak için makine üzerindeki bellek aramak gerekir. Kesinlikle mümkün iken, bu aslında terlemek için, bu size çok daha büyük sorunları var demek olsaydı o kadar düşüktür.
Gene de, bu saldırıların riskleri en aza indirmek için bazı hijyenik kod uygulamaları takip edebilirsiniz. İlk olarak, anahtar kendisini bir erişim denetim listesi (ACL) tarafından korunan bir kayıt defteri anahtarında Veri Koruma API (DPAPI) ile şifrelenmiş saklayarak bellek düz yazı olan zamanı en aza indirger. Azalmak kullanımdan hemen önce, sonra byte sıfır Array.Clear ile bayt dizisi temizlemek anahtarı. Hatta Base64 ile kodlanmış, bir String nesnesinde anahtarı saklamak asla; bu Base64 şifreleme değildir hatırlıyorum. Bu temizlenmeden önce çöp toplayıcı bellek bayt dizisi hareket olabilir bu moda bayt dizisi temizleyerek sorunu tamamen çözmek olmayabilir de unutmayın. Bu senaryo için bir çözüm böylece hareketli toplayıcısı önlenmesi, belirli bir bellek yerinde bayt dizisi iğnelemeyi içerir. ACL ile ilgili daha fazla bilgi için "Windows Güvenlik.: ACL ve NET Framework ile Windows Nesneler Erişim yönet" bakın bu konuda Mark Pustilnik tarafından.
İkinci olarak, düz yazı bellekte olduğu zaman içinde yerleri ve uzunluğu sayısını en aza indirmek. Bu tamamen önlemek mümkün değildir, tüm sonra, kod şifrelemek için düz yazı görmesi gerekiyor. Ama bir bayt dizisi dönüştürerek ve sonra şifreleme bitirdiğinizde o temizleyerek düz yazı içeren String nesneleri sayısını en aza indirebilirsiniz. Ne yazık ki, String nesneleri düz yazı dışında tutmak çok zordur. Belirtildiği gibi, çoğu denetimi bir System.String olarak kendi metin özelliği depolamak, bu nedenle bu neredeyse imkansız.

Anahtar saklama
Gerçek dünyadaki bir uygulamanın kriptografi en önemli parçası anahtar deposudur. Bruce Schneier, bir güvenlik teknoloji ve Uygulamalı Kriptografi (John Wiley & Sons, 1996) yazarı, düzgün bir mil yüksek sadece bir grev gözcüsü ile Bir çit karşılaştırarak güvenlik için güçlü kriptografi üzerine tamamen güvenmek tuzaklar özetledi. Anahtar simetrik şifreleme olarak "gizli" olduğundan, nasıl anahtar koruyabilirim? Bir saldırganın bakış açısından, anahtar ödün şifreli kaba zorlayan daha iyi bir caddesi. Sadece etrafında yürüyüş yapabilirsiniz neden kilometre yüksekliğinde çit tırmanmaya?
Bu proje için, bir sunucu tabanlı şifrelemeniz gerekir muhtemelen bir Web sitesini veya Web hizmeti olarak maruz uygulama ve istemci uygulamaları adına verilerin şifresini çalışıyoruz. Bu, bir masaüstü uygulaması için şifreleme tasarımı olsaydı daha farklı kısıtlamalar sunuyor. Bir masaüstü uygulamasında, her zaman birisi işlemde hata ayıklamak olduğunu kabul gerekir; tüm sonra, ciddi bir korsan her zaman kendi kutusunu admin. Web uygulaması birden çok ön uç sunucular arasında bir Web çiftliği çalıştırmak olabilir ve birden fazla makine bu gizli bilgileri paylaşmak gerekir. Bu ayrıca, böylece bunların yeniden teşvik, uygulama ayrı kalan kullanılabilir şifreleme modülleri tasarlamak ister.
Biz veritabanında anahtar depolayabilir, ancak daha sonra biz şifreli bir veritabanı bağlantı dizesini kullanmak istiyorsa anahtarı almak dairesel sorunu olurdu. Biz ACL ile erişimi kontrol edebilirsiniz beri işlerliği olan bir seçenek, bir yerel dosya, kilit saklamak. Biz bir COM + yapıcı dize anahtarı saklamak, ancak bu bir anahtar bizi sınırlar ve dikkatli, güvenilir yönetim gerektirir. Tüm bu seçenekleri dikkate sonra, uygulama adı üzere kilitlenmiştir, kayıt anahtarı saklamak için seçti. Bu bize ACL, erişim kontrol CryptoUtility kullanarak her uygulama için bir anahtar saklamak ve kolayca yönetim programı gelen tuşu ayarlamak için ayarlamanızı sağlar. Biz güvenlik denetim günlüğüne kayıt defteri anahtarlarını okuyup yazmıştır tam olarak kimin görebileceği şekilde kayıt defteri anahtarları da denetim yetenekleri sağlar.
CryptoUtility biraz daha az güvenli anahtar saklama pahasına daha yüksek performans sağlar bellekte şifresi çözülmüş anahtar önbelleğe alma için bir seçenek yoktur. App azami güvenlik gerektirmiyorsa, siz de anahtar önbelleğe seçebilirsiniz. Kayıt defterine erişme ve her arama şifresini anahtar DPAPI kullanarak pahalı, ama ikinci başına isabet yüzlerce tahmin sürece maddeye yeterli değildir.

ACL ile Key Korunması
Bu iki yolla anahtarı koruyabilir. Birincisi, ACL kayıt anahtarı erişimi sınırlamak. ACL elle ayarlama yapmak zor değil, ama her manuel adım sunucuları onlarca oluşabilir Web çiftliğine bir uygulama dağıtırken, özellikle ne bekliyor olası bir uzlaşmadır. Bu nedenle, şiddetle anahtarının depolandığı kayıt programlı ayar ACL savunuyoruz.
Kayıt defteri anahtarını ACL kurmak için bir kod tabanlı programı geliştirerek, yükleyici kendisinin ya içine veya kurulum ve güvence işlemini otomatik olarak basit bir komut satırı yardımcı programı içine anahtar kurulum dahil edebilirsiniz. Ne yazık ki,. NET Framework 1. X özgün kayıt defteri anahtarlarının ACL ayarını bir yol göstermiyor. Fakat Renaud Paquet sıkı çalışma sayesinde, hemen her şey üzerinde ACL ayarlamak için kullanılabilecek son derece yararlı bir yönetilen bir kütüphanesi var. Sen Renaud en bulabilirsiniz . NET ACL GotDotNet üzerinde kütüphane.
Onun Win32 ® Güvenlik kütüphanesi kullanarak, (bkz. Şekil 1) kayıt anahtarını erişimi kısıtlamak için başardık. Şimdi, anahtar almak saldırgan ya ACLed kimliği üstlenmek veya makinede yönetici olmayı gerektirir.
Açıklama: http://i.msdn.microsoft.com/Global/Images/clear.gif Şekil 1 Kayıt Defteri Anahtarı güvenliğini
 'DACL oluşturun. 
 Microsoft.Win32.Security.Dacl Dim regDacl = _
     Yeni Microsoft.Win32.Security.Dacl ()

 regDacl.AddAce (Yeni AceAccessAllowed (Sids.Admins, _
     AccessType.SPECIFIC_RIGHTS_ALL Veya AccessType.STANDARD_RIGHTS_ALL, _
     AceFlags.CONTAINER_INHERIT_ACE))

 regDacl.AddAce (Yeni AceAccessAllowed (Yeni Sid (_userName), _
     AccessType.GENERIC_READ, AceFlags.CONTAINER_INHERIT_ACE))

 'Kayıt defteri anahtarını açın
 IntPtr Dim hKey
 Integer = Win32.RegOpenKey Dim rc (_
     Yeni IntPtr ((int) Microsoft.Win32.RegistryHive.LocalMachine), _
     regKey, hKey)

 'Kayıt defteri anahtarı için DACL ayarlayın
 Rc = Win32.SUCCESS Sonra ise
     SecurityDescriptor Dim sd = _
         SecurityDescriptor.GetRegistryKeySecurity (hKey, _
             SECURITY_INFORMATION.DACL_SECURITY_INFORMATION Ya _
             SECURITY_INFORMATION.GROUP_SECURITY_INFORMATION Ya _
             SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION)
     sd.SetDacl (regDacl, yanlış)
     sd.SetRegistryKeySecurity (hKey, _
         SECURITY_INFORMATION.DACL_SECURITY_INFORMATION)
     Win32.RegCloseKey (hKey)
 End If

DPAPI Anahtar Korunması
Biz bir ACL ile anahtar erişimi sınırlı, biz hala kayıt defterinde saklanan bir şifresiz metin şifreleme anahtarı var ve dolayısıyla yere dosya sistemi. Bu DPAPI kullanarak şifreleme anahtarının kendisi şifreleme görevi için bize getiriyor. Esasen, DPAPI bir anahtar olarak şu anda yüklü olan kullanıcı veya makine profilinin parçaları kullanarak "anahtarsız" simetrik şifreleme sağlar. (Bir DPAPI sarmalayıcı sınıf tam kaynak için örnek kod DpapiCryptographer.vb dosyasına bakın.)
KULLANICI modunda, DPAPI anahtarı oluşturmak için yüklü bir kullanıcı profili kullanır. Ile DPAPI kullanıcı modunda şifreli bir şey, sadece belirli bir kullanıcı hesabının şifresini şifreli veri yapamaz. Bu, belirli bir hesap için yüklenecek bir profil, COM + bir bileşeni ile varsayılan olmayan bir şey gerektirir. Ayrıca, birden fazla makine arasında şifreleme ve şifre çözme için izin vermek, gezici profilleri ve etkin bir yönetim zor olabilir tüm istemciler tarafından kullanılması gerekir.
Açıklama: http://i.msdn.microsoft.com/cc163884.fig02(en-us).gif
Bağlamında 2 CryptoUtility Şekil
MAKİNE modu DPAPI makine üzerinde çalışan herhangi bir kod DPAPI anahtar erişimi vardır ve bu nedenle şifresini MAKİNASI modunda şifreli, gizli herhangi bir can demektir. Biz anahtar erişimi sınırlamak istiyor ve DPAPI bize anahtar üretim süreci içine ek entropi enjekte etmek için benzersiz bir tuz geçmesine izin verir.Biz temel olarak aynı kullanıcı kimliğine ACL ile sınırlı şifrelenmiş anahtar ile kayıt defterinde bu tuzu depolar. Bu mükemmel bir çözüm değildir; başka bir yerde DPAPI tuz saklamak isteyebilirsiniz. Bu özel çözüm için saldırı, makinede kod montaj ACLed kayıt defteri anahtarı erişim sağlamasını ve şifresini girmek için çalıntı tuz ile DPAPI çalışabilme içerir. Bu saldırının düşük yararlanılma dikkate alındığında, bu kabul edilebilir bir risk gibi görünüyordu. Şekil 2 COM +, istemci uygulaması ve çevre alt DPAPI ve Kayıt Defteri ile bağlamında CryptoUtility gösterir.

Karşılıklı Kimlik Doğrulama ve Anahtar Gizleme
Sen Kripto sınıfın belli aşırı kısmi anahtarı kabul ve diğerleri yok olduğunu göreceksiniz. Başka bir uygulama olarak, karşılıklı kimlik kullanmak istedim, ve biz de ihtiyaçlarını karşılamak için bu aşırı sağlar.
Bir yandan, kayıt defterinde şifrelenir ve ACLed tüm anahtar saklamak iyi bir şeydir: nerede olduğunu size bunu nasıl korunduğu, biliyorum, ve onu çalmak için ne alacak. Diğer taraftan, kolayca keşfedilebilir ve bir kez saldırgan anahtar çalmak için gerekli olan engelli sıçradı etti, o şifreli veri tam erişim vardır.
Istemci uygulamanın kendisi: CryptoUtility kullanarak uygulamalardan biri için, anahtar saklama başka bir katman ekleyelim. Bu uygulama kısmi bir anahtar kabul aşırı birini kullanır. Uygulama, yarım anahtarı depolar ve CryptoUtility kayıt defterinde kalan saklar. Kulağa zararsız yöntem adlarının ve numaralandırma, açıkça adlı kaynak dosya dizeleri, basit matematiksel işlemler ve benzerleri: Uygulama birden fazla yerde gizleyerek anahtarı onun yarım bulanıklaştırıyor.
Uygulama anahtar yarısı geçiyor çünkü Karşılıklı Kimlik kullanmak; tamamen anonim değildir ve bizi kimin aradığını, bir dereceye kadar, biliyorum. Şifresini bilgi için, uygulama anahtarı, yarım bilmek sahiptir.
Obfuscation Kullanıcı "gizlilik üzerinden güvenlik" haklı fakir bir uygulama olarak hakarete edilmiştir; bu Kerckhoff Kanunu ihlal ediyor. Açık açık söylemek gerekirse, belirsizlik güvenlik değildir. Ancak, sisteme saldıracak ve bu konuda her şeyi keşfetmek için zaman alır. Biz bir saldırganın ağ üzerinden çalışıyor olduğunu varsayarsak, o zaman bizim montaj indirdikten ve biz anahtarı bizim yarısında elde anlamak decompiling biraz zaman harcamak gerekir. O zaman, biz saldırı tespit sistemleri olağandışı etkinlik bizi uyarmak umuyoruz. Belirsiz güvenlik, bunun sadece savunma ise, ne yazık ki yetersizdir. Ancak, genel bir savunma derinliği stratejisi takviyeleri güçlü uygulamaların akıllı bir parçasıdır.
Kısmi anahtar yaklaşım için en kötü durum senaryosu sistemde zaten bilir (örneğin onun yaratıcılarından biri,) ve kim makineye ağ erişimine sahip bir iç saldırgan olduğunu. Bu kötü durum saldırganın da makinede bir yönetici ise, tüm bahisler off-o şimdi sistem kendi olacaktır vardır.
Kuruluşunuzun iyi uygulamaların takip ediyor ve geliştiriciler üretim sunucularına idari erişime izin vermiyor, ancak engel yine oldukça yüksek. Bilgili içindeki saldırganın tam anahtar-in-the-kayıt senaryo olarak aynı seviyeye çıtasını yükselterek, bilmediği şifreleme anahtarı yarısını elde etmek için şifreli, ACLed kayıt defteri anahtarı erişmeniz gerekir. Ayrıca, yerinde denetim ile, siz de iç imansız geri izlemek ve eyleminde onu yakalamak mümkün olabilir. Hatta en güvenli sistemlerinin içinde saldırılara açık olduğunu unutmayın.Teknoloji gerçek güvenliği sağlamak için doğru kişileri ve süreçleri ile desteklenmiş olmalıdır.
Kısmi anahtar senaryosuna bir başka itiraz saldırganın kod obfuscated kısmi anahtar elucidates halinde, kalan anahtar bir kaba kuvvet saldırısı katlanarak kolaylaştırır, sadece yarı-güç olmasıdır. Biz tam 256-bit Rijndael kullanıyorsanız bu yana Ancak, 128-bit yarım anahtar hala çok yüksek güvenlik sağlar. Istemci uygulaması yarım anahtar saklamak senaryonuz için bir anlam ifade etmiyor, o zaman kayıt defterindeki tüm anahtar saklamak için mükemmel şekilde uygun olur.

Kripto Uygulama Kendini Korumak
Biz iki kat koruma ele aldık: Rijndael ile güçlü bir şifreleme ile özel veri kendisini korumak ve ACL ve DPAPI kullanarak bu verilere anahtarı korumak. CryptoUtility kendisi: Ama korunmaya ihtiyacı üçüncü bir katman var!
Kimliği belirsiz şifresini çözmek için bir anahtar CryptoUtility alabilirsiniz eğer kayıt defterinde tüm anahtar saklanması da Kripto montaj çağırma hakkına sahip herhangi bir montaj ek kimlik bilgileri temin olmadan şifrelemek / şifresini yöntemleri kullanabilirsiniz anlamına gelir, bu nedenle önceki iki kat yararsız olduğu onlar için.
Bunu önlemek için, biz StrongNameIdentityPermission (SNIP) LinkDemand CAS denilen bir özelliği kullandım. Bu bildirime CAS özellik bizim montaj çağırmasına izin meclislerinin ortak anahtarı içeren bir öznitelik ile bir yöntem veya sınıf dekore sağlar. Örneğin:
 <StrongNameIdentityPermission (SecurityAction.LinkDemand, PublicKey: = _
   "002400000480000094000000060200000024000052534131000400000100010" & _
   "085525e9438e9fae122f71ec7124443bf2f9f57f5f3760b3704df168493004b" & _
   "9ef68413f500d54fa9fa3869b42b1e2365204826e54b618d56e7e575f27f675" & _
   "F0eae3ea8458a8ee1e92dc3f4bfc34fbe23851afa9d2c28fc8cd5b124f60a03" & _
   "A06bfb598bc3acbd8c4380aef02cc58bdf955d140390f740a7e115c59e3b3b5" & _
   "758ca")>
Zamanında,. NET Framework bizim montaj çağıran montaj özniteliği tarafından talep edilen kesin Strong Name ile imzalanan onaylamaktadır. Sonucun olumsuz olması durumunda, çağrı başarısız olur. Bu kadar montaj üzerine yansıtmak için girişimleri için geçerlidir.
Bu yaklaşım, bazı zayıf Bununla birlikte, bulunmaktadır. SNIP LinkDemand temel zayıflığı yeterince ayrıcalıklı kullanıcı sadece. NET Framework güvenlik ayarlarını değiştirmek için Kod Erişim Güvenliği Politikası (caspol) aracını kullanarak, örneğin, kontrol ederek tüm bu güvenlik atlayabilir olmasıdır. Keith Brown 2004 Nisan ayında bu konuları tartışır Güvenlik Külot sütun. Lütfen SNK dosyası aşılıp aşılmadığı Bu yaklaşım başarısız, bu güçlü ismi anahtarı dosyalara erişimi ile takım üzerinde veya yakınında biri tarafından içeriden bir saldırı, diyelim ki, sonucu olabilir.
COM: Son olarak değil, bu özel yaklaşım, öngörülebilir ama biraz şaşırtıcı yerde başarısız olur. COM Güçlü İsimler kavramı yok bu yana, aynı zamanda StrongNameIdentityPermission LinkDemand hiçbir anlayışına sahiptir.

COM Güvenlik
COM uymayanlar. NET CAS kuralları. Bir COM + uygulaması olarak CryptoUtility monte seçerseniz, bu makine üzerinde herhangi bir COM bileşeni olarak aynı derecede COM erişilebilir. Bu bizim dikkatle planlanan güvenlik sisteminin her bit basit, dört satırlı VBScript parçacık tarafından tehlikeye anlamına gelir:
 kripto = CreateObject ("CryptoUtility.Crypto") set
 Orijinal = "Bu gizli bir mesaj" dedi.
 cipher = crypto.Encrypt ("ourApp", orijinal)
 net = crypto.Decrypt ("ourApp", şifre)
Açıklama: http://i.msdn.microsoft.com/cc163884.fig03(en-us).gif
Şekil 3 Yetki iste
Ama bütün kayıp değildir. COM yasadışı erişime karşı güçlü zaman içinde test edilmiş koruma sağlar. TR arayanlardan erişimi kısıtlamak amacıyla, bir, Şekil 3 ve Şekil 4'te gösterildiği paket için TR + yetkilendirme, sağlamalıdır.
Bu güvenlik kontrolleri de. NET arayanlar için geçerli olduğunu unutmayın, bu nedenle bu. NET istemcileri için güvenlik henüz bir seviye sunuyor.

Hepsini bir araya getirirsek
Bu yazı için örnek kod CryptoUtility ve idari uygulama, CryptoAdminUtility içerir. Biz CryptoAdminUtility bazı yönlerini ele, ama tam kaynak kodu, Windows kullanıcıları ekleyerek kendi grup üyeliği ayarlayarak, oluşturma ve COM + uygulamaları yapılandırma ve kayıt defterinde DPAPI şifreli anahtarlar yerleştirilmesi de dahil olmak üzere, çok daha fazlasını yapar.
Açıklama: http://i.msdn.microsoft.com/cc163884.fig04(en-us).gif
COM 4 Set Güvenlik Düzeyi Şekil +
CryptoUtility altı sınıf oluşur. Ana sınıfı, Kripto, kendi arayüzü ICrypto üzerinden sadece dıştan görünen API sağlar. CryptoUtility bir COM + ServicedComponent olduğu için, açıkça bir arayüz uygulanması da dahil, kendi tasarımı ile en iyi uygulamalar izledi. Kripto sınıfı şifreleme fiili çalışma gerçekleştiren birkaç iç yardımcı sınıfları kullanır. Bu SymmetricCryptographer, DpapiCryptographer, hasher (karma karma ve karşılaştırmak için) ve bir kaynak dosyadan dizeleri okumak için bir yardımcı sınıf bulunmaktadır.
Kripto sınıfı anahtar önbelleğe alma yönetir ve istemci uygulamaları önbelleğe alma kullanılacağını belirtmek sağlar. Dahili olarak, Kripto önbelleğe alınan anahtarları tutmak için CachedKey adlı bir yeten sınıfını kullanır. Kripto dahili bir koleksiyon ile bu önbelleğe alınan anahtarları erişir. Son olarak, Kripto kayıt veri getirmek için iç yöntemleri içeren ve bunun karşılığında şifresini bu anahtarları DpapiCryptographer kullanır.
Şekil 5 CryptoUtility sınıfları tasvir statik bir diyagramını göstermektedir. CryptoUtility ile şifreleme ve şifre çözme dizileri çok benzer. Şekil 6 'da sıra diyagramı şifreleme işlemi gösterir, fakat şifre çözme işlemi, sadece tasvir diyagramı şifreleme yapan şifre çözme, tam olarak aynı şekilde işlev görür.
Açıklama: http://i.msdn.microsoft.com/Global/Images/clear.gif CryptoUtility 6 Şifreleme Şekil

Açıklama: http://i.msdn.microsoft.com/Global/Images/clear.gif Şekil 5 CryptoUtility Sınıflar


Sonuç
Mükemmel güvenlik diye bir şey yok iken, gerçek dünyadaki bir uygulamanın güvenli bir şekilde şifreleme kullanmak mümkündür. . NET Framework kutudan çıktığı gibi güvenli uygulamalar geliştirmek için mükemmel bir destek sağlar. Her mimarlık ve tasarım dengeler vardır; biz kendiniz için daha iyi seçimler yapmak, böylece yapılan olanları tarif ettik. Başarılı mimarisi ve yazılım tasarımı büyük bir kısmı bu dengeler anlamak ve bundan sonra akıllıca seçiminde yatıyor.


Hiç yorum yok:

Yorum Gönder