| Editor Login | Register | ||
| > Akademik İnternet ® > .Net FrameWork |
|
|
| .NET Frameworkun Kriptografi Alanadları ile Veri Güvenliği | ||||||||
Artan kullanıcı sayısıyla birlikte güvenliğin önemi her geçen gün artıyor. Günlük işlerde güvenlikle ilgili konuların (ve tabi problemlerin) oldukça yoğunlaştığı bu günlerde güvenlik ile ilgili makaleler yazmak şart oldu sanırım. Buradan günlük hayatımızda yaşadıklarımızın yazdığımız makalelere yansıdığı sonucuna varabiliriz sanırım. Gerçi ne derece sağlıklı bir tesbit olduğu tartışılır bunun tabi. Yani hiçbir problemle karşılaşmadığımız bir gün makale yazmaya kalkarsak yemek tarifi yazabileceğimiz sonucuna da varabiliriz buradan.. Sanırım konuyu fazla dağıtmadan asıl konuya geçsem iyi olacak :) Verilerin şifrelenmesi için sıklıkla kullanılan metotlardan biri Windowsun Crypto APIsi. .NET Framework, her alanda olduğu gibi güvenlik alanında da son derece geniş çözümler sağlıyor. Bu makalede verilerin güvenliğini sağlamak için en sık kullanılan yöntemlerden biri olan şifreleme konusunda .NET Frameworkun System.Security.Cryptography alan adının sunduğu özellikleri ele alıyor olacağız. Veri şifrelemenin .NET ile .NET öncesine göre nasıl daha güvenli ve daha kolay hale geldiğini tartışıp, kısa kodlar ile veri şifrelemenin .NETte daha kolay ve daha güvenli olduğu yönündeki tezimizi savunacağız. İnternete dahil kullanıcı sayısının her geçen gün artması ve e-commerce platformlarının hızlı büyüyüşü, verilerin güvenliğini sağlamak için daha güçlü, daha güvenilir algoritmalara olan ihtiyacı arttırdı. Microsoft 1996 yılında Cryptography API (Crypto API) ile veri güvenliği alanındaki ilk adımını attı. Yapılan çalışmalar sonucunda Crypto API ile çıktığımız yolda bugün bulunduğumuz nokta, Common Language Runtime tarafından sunulan System.Security.Cryptography alanadı. Bu alanadı size çeşitli şifreleme servislerine programatik olarak erişebilme, verileri şifreleyerek ve şifre çözerek verilerinizin güvenliğini sağlama ve dijital imza ve sertifikaları yönetebilme imkanı vermektedir. Bu algoritmaların bazıları herhangi bir .NET uygulamasında (örneğin ASP.NET ile authentication işleminde) kullanılmıştır. Bu yazıda .NET Framework tarafından sunulan temel şifreleme servislerini ele alarak uygulamalarımızda bu sınıfları nasıl kullanabileceğimizi inceliyor olacağız. Cryptography Alanadı Unmanaged implementasyonlar, implementasyonun işletim sistemi seviyesinde yüklenmiş olan Cryptographic Service provider tarafından sağlandığını belirtmek amacıyla tipik olarak "CryptoServiceProvider" sonekini alırlar. Örneğin; SHA1CryptoServiceProvider. Managed implementasyonlar "managed" sonekini alırlar ve temelde CryptoAPIye dayanmadıkları için managed koda implemente edilirler. örneğin; SHA1Managed. Bu algoritmalar hakkında hatırlamamız gereken bir diğer konu ise bu somut sınıfların örneklendiklerinde varsayılan constructorların her zaman algoritmanın varsayılan parametrelerini makul ve güvenli değerlerle populate edecekleridir. Örneğin; Simetrik algoritmalar, hem rastgele anahtar üretip hem de initialization vector (IV) üretirken ve Mode ve padding gibi özellikleri otomatik olarak belirlerken genel anahtar mantığıyla çalışan simetrik algoritmalar rastgele bir anahtar çifti üretecektir. System.Security.Cryptography alanadındaki ikinci ana bölüm, verilerin şifrelenirken ve şifrelenmiş verilerin çözülmesi esnasında kullanılan sınıfları ve bazı yardımcı sınıfları içerir. Bu alanadı aynı zamanda soyut RNGCryptoServiceproviderın türetildiği RandomNumberGenerator sınıfını içerir. Şifreleme algoritmalarına ek olarak Cryptography alanadı aynı zamanda X509Certificate child alanadını içerir. Bu child alanadı X.509 v3 sertifikalarının yönetimi ve temsili ile ilgili sadece üç sınıf içerir. X509Certificate sınıfı bir sertifika örneği oluşturmak amacıyla CreateFrınCertFile ve CreateFromSignedFile statik metotlarını sunar: Dim c As X509Certificate Sertifikalar, pek çok amaçla kullanılabilir. Örneğin; System.Net.HttpWebRequest nesnesinin ClientCertificates özelliği kullanılarak web servera giden talebe eklenmek yoluyla kimlik doğru amaçlı olarak kullanılabilir. Makalenin ilerleyen bölümlerinde şifreleme algoritmalarının kullanımı konusuna yoğunlaşacağız. Şifreleme Algoritmaları Örnek 1 Cryptographynin Bileşenleri
Desteklenen simetrik şifreleme algoritmaları; Data Encryption Standart (DES), RC2, Rijandael ve Triple Data Encryption Standart (TripleDES) tır. Her algoritma SymmetricAlgorithmden türemiş bir soyut temel sınıf içerir. Bu algoritmalar aynı zamanda temel sınıftan (örneğin: DESCryptoServiceProvider) türemiş olan bir servis sağlayıcı sınıf veya managed sınıf içerir. Bu sınıf verinin şifrelenmesi ve şifrenin çözülmesi için gerekli metotları içerir. Simetrik algoritmalardaki hiyerarşi Şekil 1de görülebilir.
Şekil 2de gösterilen RijandaelManaged gibi somut sınıflar örneklenebilir (instantiate) ve özellikleri (örnek 2) çağırılabilir. Örnek 2de otomatik olarak bir anahtar değeri ve byte dizisi olarak IV üreten ve daha sonra String değerlere serialize ederen ve konsola yazan algoritmanın yeni bir örneği oluşturuluyor. KeySize ve BlockSizeın anahtarın uzunluğunun ve bir işlemde ne kadar verinin (bit türünden) şifrelenebileceğinin veya şifresinin çözülebileceğini belirlenmesinde kullanılabileceğini atlamamalıyız. İkinci tür ise public-key veya asimetrik algoritma olarak tanıtıdığımız türdür ve AsymmetricAlgorithm soyut sınıfından türemektedir. Bu tür Digital Signature Algorithm (DSA) ve RSA gibi tanınmış algoritmaları içerir. Asimetrik algoritmalar bir anahtar çiftine, bir özel ve bir genel anahtara dayanır. Genellikle, genel anahtar herkesin kullanımına açıktır ve şifrelemeyi yapan tarafından üretilir ve verinin şifrelenmesinde kullanılır, özel anahtar ise gizlidir ve genel anahtar ile şifrelenmiş verinin şifresinin çözülmesinde kullanılır. Bu algoritmalar şekil 2de görüldüğü üzere AsymmetricAlgorithm sınıfından türemiş olan DSA ve RSA soyut sınıflarından türemiştir.
Asimetrik algoritmaların varsayılan constructorlarının bir anahtar çifti oluşturmasına izin vermek yerine CSP tarafından saklanmış mevcut anahtar çiftinide kullanabilirsiniz. Bunu, asimetrik algoritmaları Crypto API key storageda mevcut olan bir key container adı ile örnekleyip, key container adını ve bu örneğin asimetrik algoritmanın constructorı olmasını sağlayarak ScpParameters nesnesi aracılığıyla populate ederek yapabilirsiniz. Asimetrik anahtar çiftlerinin saklanması ve yeniden kullanılması ile ilgili bir örneği http://www.gotdotnet.com/team/clr/about_security.aspx adresinde bulabilirsiniz. RijndaelManagedin KullanımıDim oEnc As New RijndaelManaged() Dim i As Short Dim strKey, strIV As String For i = 1 To (oEnc.KeySize / 8) strKey &= oEnc.Key(i - 1).ToString & " " Next For i = 1 To 16 strIV &= oEnc.IV(i - 1).ToString & " " Next Console.WriteLine(strKey) Console.WriteLine(strIV) Console.WriteLine(oEnc.KeySize.ToString) Console.WriteLine(oEnc.BlockSize.ToString) Cryptography alanadı tarafından sunulan son tür ise hash algoritmalarıdır. Bunlar, daha uzun bytelardan oluşan dizilere dayanan binary değerlerden oluşan sabit boyutlu bir unique diziyi (digest) hesaplarlar. Hash algoritmalarını veri üzerinde bir oynama, değişiklik yapılıp yapılmadığını anlamak amacıyla kullanırız. Digestı veri ile gönderdiğinizde, veriyi alan taraf yeniden hesaplama yapabilir. Örneğin dosyanın son değiştirilme tarihi değişmişse, hash algoritmasının çıktısı, orijinal çıktı ile farklılık gösterecektir. Hash algoritmaları genellikle dijital imza işlemlerinin temelinde kullanılmaktadır. Cryptography alanadı HashAlgorithm adlı bir temel sınıf ve algoritmaları (MD5, SHA1, SHA256, SHA384 ve SHA512) destekleyen türemiş sınıflar içerir. SHA1 algoritması 160-bitlik bir hash gerçekleştirirken MD5 algoritması 128-bitlik bir hash gerçekleştirir. SHAnın diğer versiyonlarındaki sayılar, algoritmaların gerçekleştirdikleri hashin boyutunu temsil etmektedir. Daha büyük hash boyutu daha güvenli ve brute force ile daha zor kırılabilen bir algoritma anlamına gelmektedir. Bu algoritmalar Şekil 3te görüldüğü üzere hem managed hem unmanaged olarak gelmektedir.
Bir digest hesaplamak için yapmanız gereken aşağıdaki örnekte olduğu gibi; hash algoritmasını örneklemeniz ve HashAlgorithmden türetilen overloaded ComputeHash metodunu çağırmaktır. Dim fsData As New FileStream("yazgelistir.txt", _ Burada ComputeHash metodu bir Stream nesnesi gönderiyor ancak aynı zamanda bir byte dizisini arguman olarak kabul edebiliyor. Cryptography alanadı aynı zamanda yukarıdaki şekilde görülebileceği üzere KeyedHashAlgorithm adlı bir soyut sınıf içermektedir. HMACSHA1 ve MACTripleDES sınıflarındaki algoritmalar mesaj Doğrulama Kodu (MAC - Message Authentication Code) oluşturabilmek amacıyla KeyedhashAlgoritmasından türemişlerdir. Bir MAC, veriyi gönderen ve alan tarafın gizli anahtarı paylaşmaları durumunda, verinin gönderildiği kanalın değişiklik yapılmış güvenli olmayan bir kanal olup olmadığının tesbitinde kullanılabilir. Soyut temel sınıf olan SymmetricAlgorithm, AsymmetricAlgorithm, HashAlgorithm ve KeyedHashAlgorithm bir istemci tarafından doğrudan örneklenemiyorlarsada, hepsi Create adlı bir overloaded static (shared) metot sunarlar. Bu metot herhangi bir parametre olmaksızın doğrudan çağrılarak bu algoritmalardan biri örneklenebilir. Bu işlemde varsayılan algoritmalar, simetrik için RijandaelManaged, asimetrik için RSACryptoServiceProvider, hash için SHA1CryptoServiceProvider ve keyed hash içinse HMACSHA1 dir. İkinci versiyon ise implementasyonu belirten bir string kabul eder. İsterseniz şimdi bu anlattıklarımızı kısa bir örnekle görelim. Aşağıdaki koddaki her ifade işlev olarak diğerinin aynısıdır ve RijndaelManaged sınıfını örnekler. Dim r, r1, r2, r3 As RijndaelManaged Bu biraz kafa karıştırıcı gibi görünebilir ancak sınıflar bu şekilde tasarlanmıştır böylece hangi algoritmanın kullanılacağı kararı runtimea veya konfigurasyon ile belirlenenmek üzere sonraya bırakılabilir. Gerçekte systemwide konfigurasyon dosyasının (machine.config) CryptoMapping alanı kullanılarak varsayılan seçimler değiştirilebilir. Örneğin aşağıdaki örnek koddaki XML ifadesi machine.config dosyasının configuration alanına eklenerek varsayılan hash algoritması olarak MD5CryptoServiceProviderın kullanılmasını ve işaretçi olarak "yazgelistir" ifadesini tanımlayabiliriz. Cryptographynin konfigurasyonu"System.Security.Cryptography.MD5CryptoServiceProvider, mscorlib, Ver=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> class="myMD5"/> Kendi işaretçilerimizi oluşturmak?.. (Burada işaretçiden kastımızın hangi algoritmanın kullanılacağını tanımlayan ifadeler olduğunu söylememize gerek yok değil mi? varsa da söylemiş oldum zaten (: ) Bir cryptoClasses içine refere edilebilecek ve sınıf ve assemblyı tamamen açıklayıcı bir cryptoClass elemanı ekleyebilirsiniz. nameEntry elemanları ileride işaretçi oluşturmak için kullanılacaktır. Örnek kod şu şekilde olacaktır: Dim m, m1 As MD5CryptoServiceProvider Kriptografi Servislerinin Kullanımı Bu alanadının fonksiyonunu basit bir örnekle inceliyor olacağız. Aşağıdaki kodda TextFileInfo sınıfı görülmektedir. Bu sınıf bir dosyanın sınıf tarafından oluşturulmuş bir anahtar aracılığıyla DES algoritması kullanılarak simetrik olarak şifrelenmesini ve bir dosyaya kaydedilmesini sağlayacaktır. DES Algoritmasının kullanımı ile temel şifreleme işlemleri Gördüğünüz gibi class constructor, CreateEncryptor ve CreateDecryptor metotlarını sağlayan bir class-level DESCryptoServiceprovider sınıfı örnekledi. Bu metotlar ileride şifreleme ve şifre çözme işlemlerini gerçekleştiren nesnelerin dönmesinde kullanılacaktır. Public keyFile ve FileName özellikleri anahtar ve IV içeren bir dosyayı açmak ve şifrelenecek veya şifresi çözülecek dosyanın tanımlanmasında kullanılmaktadır. Eğer anahtar dosyası mevcutsa dosya private openKeyFile metodu ile açılır ve anahtar ve IV okunur. SavekeyFile metodu ise arkaplandaki DES sınıfının GenerateKey ve generateIV metotlarını çağırarak bir rastgele anahtar ve IV oluşturur. Bu değerler daha sonra parametre olarak verilen dosyaya kaydedilir. Bu noktada anahtar dosyası gizli tutulmalıdır. DES algoritmasının 56-bitlik (7-byte) bir anahtar kullandığını unutmamak gerekir. DES sadece tek boyutlu anahtar boyutu desteklemektedir. Diğer algoritmaların destekledikleri geçerli anahtar boyutları MinSize, MaxSize, SkipSize değerlerini dönen LegalKeySizes özelliği kullanılarak öğrenilebilir. Örneğin Rijndael algoritması 128, 192 ve 256 bitlik anahtarları desteklemektedir. Daha güçlü bir şifreleme için yeni anahtar boyutu, KeySize özelliği ile değiştirilebilir. EncryptFile ve DecryptFile metotları textFileCrypto sınıfının çekirdeğidir. EncryptFile metodu açılan dosyayı şifreler ve şifrelenen veriyi geçici bir dosyada saklar. Daha sonra servis sağlayıcının (bu örnekte DESCryptoServiceProvider) CreateEncryptor metodu ile bir encryptor nesnesi oluşturur. Bu nesneICryptoTransform arabirimini sağlar böylelikle filestram tarafından (bu örnekte fsoutput) bir dosyaya yazılan veri CryptoStreamin constructorına aktarılabilir. Geçici dosya orijinal dosyanın üzerine yazılır. Sonuç, ftp veya email ile güvenli bir şekilde gönderilebileceğimiz şifrelenmiş bir dosya.. DecryptFile metodu ise CreateDecryptor metodu ile bir decryptor oluşturarak EncryptFile metodunun tam tersi işlev yapar. Sonuç olarak şifresi çözülen veri StreamWriter aracılığıyla StreamReader sınıfının ReadToEnd metodu kullanılarak bir metin dosyasına kaydedilir. Bir istemci textFileCrypto sınıfını veri şifrelemek amacıyla aşağıdaki örnekte olduğu gibi dört satırlık kısa bir kod ile kullanabilir: Dim objCrypt As New TextFileCrypto() İstemci şfirelenmiş dosyanın şifresini aşağıdaki şekilde çözebilir; Dim objCrypt As New TextFileCrypto() |
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |