|
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.
'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.
![]()
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)
![]()
Ş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.
![]()
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.
![]() ![]()
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.
|
12 Mayıs 2012 Cumartesi
KRİPTOGRAFİ
Kaydol:
Kayıt Yorumları (Atom)





Hiç yorum yok:
Yorum Gönder