.NET'te şifreleme, dijital imzalar ve karma algoritmalarına genel bakış

Bu makalede, ClickOnce bildirimleri de dahil olmak üzere .NET tarafından desteklenen şifreleme yöntemlerine ve uygulamalarına genel bir bakış sağlanır.

Şifrelemeye giriş

İnternet gibi genel ağlar varlıklar arasında güvenli bir iletişim aracı sağlamaz. Bu tür ağlar üzerinden iletişim, yetkisiz üçüncü taraflarca okunmaya, hatta değiştirilmeye açıktır. Şifreleme, verilerin görüntülenmeye karşı korunmasına yardımcı olur, verilerin değiştirilip değiştirilmediğini algılamanın yollarını sağlar ve güvenli olmayan kanallar üzerinden güvenli bir iletişim yolu sağlamaya yardımcı olur. Örneğin veriler şifreleme algoritması kullanılarak şifrelenebilir, şifrelenmiş durumda iletilebilir ve daha sonra amaçlanan taraf tarafından şifresi çözülebilir. Bir üçüncü taraf şifrelenmiş verileri durdurursa, şifreyi çözmek zor olacaktır.

.NET'te, ad alanı içindeki System.Security.Cryptography sınıflar sizin için birçok şifreleme ayrıntısını yönetir. Bazıları işletim sistemi uygulamalarına yönelik sarmalayıcılardır, diğerleri ise tamamen yönetilen uygulamalardır. Bu sınıfları kullanmak için şifreleme uzmanı olmanız gerekmez. Şifreleme algoritması sınıflarından birinin yeni bir örneğini oluşturduğunuzda, anahtarlar kullanım kolaylığı için otomatik olarak oluşturulur ve varsayılan özellikler mümkün olduğunca güvenli ve güvenlidir.

Şifreleme temelleri

Şifrelemenin kullanıldığı tipik bir durumda, iki taraf (Alice ve Bob) güvenli olmayan bir kanal üzerinden iletişim kurar. Alice ve Bob, dinleyen herkes tarafından iletişimlerinin anlaşılmaz kalmasını sağlamak ister. Ayrıca, Alice ve Bob uzak konumlarda olduğundan, Alice'in Bob'dan aldığı bilgilerin iletim sırasında hiç kimse tarafından değiştirilmediğinden emin olması gerekir. Buna ek olarak, bilgilerin Bob'un kimliğine bürünen birinden değil, Bob'dan kaynaklandığından emin olmalıdır.

Şifreleme, aşağıdaki hedeflere ulaşmak için kullanılır:

  • Gizlilik: Kullanıcının kimliğinin veya verilerinin okunmasını engellemeye yardımcı olmak için.

  • Veri bütünlüğü: Verilerin değiştirilmesini engellemeye yardımcı olmak için.

  • Kimlik doğrulaması: Verilerin belirli bir tarafa ait olduğundan emin olmak için.

  • İnkar edilemez: Belirli bir tarafın ileti gönderdiğini reddetmesini önlemek için.

Bu hedeflere ulaşmak için şifreleme ilkelleri olarak bilinen algoritma ve uygulamaların birleşimini kullanarak bir şifreleme şeması oluşturabilirsiniz. Aşağıdaki tabloda şifreleme temelleri ve kullanımları listelemektedir.

Şifreleme ilkel Kullanma
Gizli anahtar şifrelemesi (simetrik şifreleme) Veriler üzerinde, üçüncü taraflar tarafından okunmasını engellemeye yönelik bir dönüşüm gerçekleştirir. Bu şifreleme türü, verileri şifrelemek ve şifresini çözmek için tek bir paylaşılan gizli anahtar kullanır.
Ortak anahtar şifrelemesi (asimetrik şifreleme) Veriler üzerinde, üçüncü taraflar tarafından okunmasını engellemeye yönelik bir dönüşüm gerçekleştirir. Bu şifreleme türü, verileri şifrelemek ve şifresini çözmek için ortak/özel anahtar çifti kullanır.
Şifreleme imzalama Bu taraf için benzersiz bir dijital imza oluşturarak verilerin belirli bir taraftan geldiğini doğrulamaya yardımcı olur. Bu işlem karma işlevleri de kullanır.
Şifreleme karmaları Verileri herhangi bir uzunluktan sabit uzunlukta bir bayt dizisine Haritalar. Karmalar istatistiksel olarak benzersizdir; farklı bir iki baytlık dizi aynı değerle karma oluşturmaz.

Gizli Anahtar Şifrelemesi

Gizli anahtar şifreleme algoritmaları, verileri şifrelemek ve şifresini çözmek için tek bir gizli anahtar kullanır. Anahtarın sahibi olan herhangi bir taraf verilerinizin şifresini çözmek veya kendi verilerini şifrelemek için sizden geldiğini iddia ederek anahtarı yetkisiz aracıların erişiminden korumanız gerekir.

Şifreleme ve şifre çözme için aynı anahtar kullanıldığından gizli anahtar şifrelemesi simetrik şifreleme olarak da adlandırılır. Gizli anahtar şifreleme algoritmaları çok hızlıdır (ortak anahtar algoritmalarıyla karşılaştırıldığında) ve büyük veri akışlarında şifreleme dönüştürmeleri gerçekleştirmek için uygundur. RSA gibi asimetrik şifreleme algoritmaları, ne kadar veriyi şifreleyebileceği konusunda matematiksel olarak sınırlıdır. Simetrik şifreleme algoritmalarında genellikle bu sorunlar yoktur.

Blok şifrelemesi adı verilen gizli anahtar algoritması türü, bir kerede bir veri bloğunu şifrelemek için kullanılır. Veri Şifreleme Standardı (DES), TripleDES ve Gelişmiş Şifreleme Standardı (AES) gibi şifrelemeleri engelle, n baytlık giriş bloğunu şifreli baytlardan oluşan bir çıkış bloğuna şifreli olarak dönüştürür. Bir bayt dizisini şifrelemek veya şifresini çözmek istiyorsanız, bunu blok blok yapmanız gerekir. n küçük olduğundan (DES ve TripleDES için 8 bayt; 16 bayt [varsayılan], 24 bayt veya AES için 32 bayt), n'den büyük veri değerlerinin bir seferde bir blok şifrelenmesi gerekir. n'den küçük olan veri değerlerinin işlenebilmesi için n olarak genişletilmesi gerekir.

Blok şifrelemesinin basit bir biçimi elektronik kod defteri (ECB) modu olarak adlandırılır. ECB modu, ilk düz metin bloğunu başlatmak için bir başlatma vektöru kullanmadığından güvenli olarak kabul edilmez. Belirli bir gizli anahtar k için, başlatma vektörünün kullanılmadığı basit bir blok şifrelemesi, aynı düz metin giriş bloğunu aynı şifreleme metni çıkış bloğuna şifreler. Bu nedenle, giriş düz metin akışınızda yinelenen bloklarınız varsa, çıkış şifreleme metni akışınızda yinelenen bloklar olur. Bu yinelenen çıkış, yetkisiz kullanıcıları kullanılmış olabilecek algoritmaları ve olası saldırı modlarını kullanan zayıf şifrelemeye karşı uyarır. Bu nedenle ECB şifreleme modu analize ve nihai olarak anahtar bulmaya karşı oldukça savunmasızdır.

Temel sınıf kitaplığında sağlanan blok şifreleme sınıfları, şifreleme bloğu zincirleme (CBC) adlı varsayılan bir zincirleme modu kullanır, ancak isterseniz bu varsayılanı değiştirebilirsiniz.

CBC şifreleri, ilk düz metin bloğunu şifrelemek için bir başlatma vektör (IV) kullanarak ECB şifreleriyle ilişkili sorunların üstesinden gelir. Sonraki her düz metin bloğu, şifrelenmeden önce önceki şifreleme metni bloğuyla bit düzeyinde özel VEYA (XOR) işlemine tabi tutulur. Bu nedenle her şifreleme metni bloğu önceki tüm bloklara bağlıdır. Bu sistem kullanıldığında, yetkisiz bir kullanıcı tarafından bilinen ortak ileti üst bilgileri bir anahtarı tersine mühendislik uygulamak için kullanılamaz.

CBC şifrelemesi ile şifrelenen verilerin güvenliğini aşmanın bir yolu, olası tüm anahtarlarda kapsamlı bir arama yapmaktır. Şifreleme gerçekleştirmek için kullanılan anahtarın boyutuna bağlı olarak, bu tür aramalar en hızlı bilgisayarları bile kullanarak çok zaman alır ve bu nedenle mümkün değildir. Daha büyük anahtar boyutlarının deşifre edilmesi daha zordur. Şifreleme, bir saldırganın şifrelenmiş verileri almasını teorik olarak imkansız hale getirmese de, bunu yapmanın maliyetini yükseltir. Yalnızca birkaç gün boyunca anlamlı olan verileri almak için kapsamlı bir arama yapmak üç ay sürerse, kapsamlı arama yöntemi pratik değildir.

Gizli anahtar şifrelemesinin dezavantajı, iki tarafın bir anahtar ve IV üzerinde anlaştığını ve değerlerini bildirdiğini varsayıyor olmasıdır. IV bir gizli dizi olarak kabul edilmez ve ileti ile düz metin olarak iletilebilir. Ancak anahtarın yetkisiz kullanıcılardan gizli tutulması gerekir. Bu sorunlar nedeniyle gizli anahtar şifrelemesi genellikle anahtar ve IV değerlerini özel olarak iletmek için ortak anahtar şifrelemesi ile birlikte kullanılır.

Alice ve Bob'ın güvenli olmayan bir kanal üzerinden iletişim kurmak isteyen iki taraf olduğunu varsayarsak, gizli anahtar şifrelemesini şu şekilde kullanabilirler: Alice ve Bob belirli bir anahtar ve IV ile belirli bir algoritmayı (örneğin AES) kullanmayı kabul eder. Alice bir ileti oluşturur ve iletinin gönderildiği bir ağ akışı (adlandırılmış kanal veya ağ e-postası olabilir) oluşturur. Ardından, anahtarı ve IV'yi kullanarak metni şifreler ve şifrelenmiş iletiyi ve IV'yi intranet üzerinden Bob'a gönderir. Bob şifrelenmiş metni alır ve IV ve daha önce üzerinde anlaşmaya varılan anahtarı kullanarak şifresini çözer. İletim kesiliyorsa, anahtarı bilmediğinden, kesme noktası özgün iletiyi kurtaramaz. Bu senaryoda yalnızca anahtarın gizli kalması gerekir. Gerçek bir dünya senaryosunda Alice veya Bob bir gizli anahtar oluşturur ve gizli anahtarı (simetrik) diğer tarafa aktarmak için ortak anahtar (asimetrik) şifreleme kullanır. Ortak anahtar şifrelemesi hakkında daha fazla bilgi için sonraki bölüme bakın.

.NET, gizli anahtar şifreleme algoritmaları uygulayan aşağıdaki sınıfları sağlar:

  • Aes

  • HMACSHA256HMACSHA512ve HMACSHA384 . (Bunlar teknik olarak gizli anahtar algoritmalarıdır çünkü gizli anahtarla birlikte şifreleme karma işlevi kullanılarak hesaplanan ileti kimlik doğrulama kodlarını temsil eder. Bu makalenin devamında yer alan Karma Değerler'e bakın.)

Ortak Anahtar Şifrelemesi

Ortak anahtar şifrelemesi, yetkisiz kullanıcılardan gizli tutulması gereken bir özel anahtar ve herkese açık hale getirilebilen bir ortak anahtar kullanır. Ortak anahtar ve özel anahtar matematiksel olarak bağlantılıdır; ortak anahtarla şifrelenen verilerin şifresi yalnızca özel anahtarla çözülebilir ve özel anahtarla imzalanan veriler yalnızca ortak anahtarla doğrulanabilir. Ortak anahtar herkesin kullanımına sunulabiliyor; özel anahtarın bekçisine gönderilecek verileri şifrelemek için kullanılır. Verileri şifrelemek için bir anahtar ve verilerin şifresini çözmek için başka bir anahtar gerektiğinden ortak anahtar şifreleme algoritmaları asimetrik algoritmalar olarak da bilinir. Temel bir şifreleme kuralı anahtarın yeniden kullanılmasını engeller ve her iki anahtar da her iletişim oturumu için benzersiz olmalıdır. Ancak uygulamada asimetrik anahtarlar genellikle uzun ömürlüdür.

İki taraf (Alice ve Bob) ortak anahtar şifrelemesini şu şekilde kullanabilir: İlk olarak, Alice bir ortak/özel anahtar çifti oluşturur. Bob, Alice'e şifreli bir ileti göndermek istiyorsa, ondan ortak anahtarını ister. Alice, Güvenli olmayan bir ağ üzerinden Bob'a ortak anahtarını gönderir ve Bob, iletiyi şifrelemek için bu anahtarı kullanır. Bob şifrelenmiş iletiyi Alice'e gönderir ve özel anahtarını kullanarak şifresini çözer. Bob, genel ağ gibi güvenli olmayan bir kanal üzerinden Alice'in anahtarını aldıysa ortadaki adam saldırısına açıktır. Bu nedenle Bob, Alice'e ortak anahtarının doğru bir kopyasına sahip olduğunu doğrulamalıdır.

Alice'in ortak anahtarının iletilmesi sırasında yetkisiz bir aracı anahtarı kesebilir. Ayrıca, aynı aracı Bob'dan gelen şifreli iletiyi kesebilir. Ancak aracı, iletinin şifresini ortak anahtarla çözemez. İletinin şifresi yalnızca Alice'in iletilmeyen özel anahtarıyla çözülebilir. Ortak anahtara sahip olan herkes iletinin şifresini çözebildiğinden Alice, Bob'a bir yanıt iletisini şifrelemek için özel anahtarını kullanmaz. Alice, Bob'a bir ileti göndermek isterse, Bob'dan ortak anahtarını ister ve bu ortak anahtarı kullanarak iletisini şifreler. Ardından Bob, ilişkili özel anahtarını kullanarak iletinin şifresini çözer.

Bu senaryoda, Alice ve Bob bir gizli anahtarı (simetrik) aktarmak için ortak anahtar (asimetrik) şifreleme kullanır ve oturumlarının geri kalanında gizli anahtar şifrelemesi kullanır.

Aşağıdaki liste ortak anahtar ile gizli anahtar şifreleme algoritmaları arasında karşılaştırmalar sunar:

  • Ortak anahtar şifreleme algoritmaları sabit bir arabellek boyutu kullanırken gizli anahtar şifreleme algoritmaları değişken uzunlukta bir arabellek kullanır.

  • Yalnızca az miktarda veri şifrelenebilir, çünkü ortak anahtar algoritmaları, verileri akışlara gizli anahtar algoritmaları gibi zincirleme amacıyla kullanılamaz. Bu nedenle, asimetrik işlemler simetrik işlemler ile aynı akış modelini kullanmaz.

  • Ortak anahtar şifrelemesi, gizli anahtar şifrelemesinden çok daha büyük bir anahtar alanına (anahtar için olası değerler aralığı) sahiptir. Bu nedenle, ortak anahtar şifrelemesi olası her anahtarı deneyen kapsamlı saldırılara daha az duyarlıdır.

  • Ortak anahtarların dağıtılması kolaydır çünkü gönderenin kimliğini doğrulamak için bir yol olması koşuluyla güvenli hale getirilmesi gerekmez.

  • Verileri gönderenin kimliğini doğrulamak için dijital imzalar oluşturmak için bazı ortak anahtar algoritmaları (RSA ve DSA gibi ancak Diffie-Hellman gibi) kullanılabilir.

  • Ortak anahtar algoritmaları gizli anahtar algoritmalarıyla karşılaştırıldığında çok yavaştır ve büyük miktarda veriyi şifrelemek için tasarlanmamıştır. Ortak anahtar algoritmaları yalnızca çok az miktarda veriyi aktarmak için kullanışlıdır. Genellikle ortak anahtar şifrelemesi, gizli anahtar algoritması tarafından kullanılacak bir anahtarı ve IV'yi şifrelemek için kullanılır. Anahtar ve IV aktarıldıktan sonra, oturumun geri kalanı için gizli anahtar şifrelemesi kullanılır.

.NET, ortak anahtar algoritmaları uygulayan aşağıdaki sınıfları sağlar:

RSA hem şifrelemeye hem de imzalamaya izin verir, ancak DSA yalnızca imzalama için kullanılabilir. DSA, RSA kadar güvenli değildir ve RSA'yı öneririz. Diffie-Hellman yalnızca anahtar oluşturma için kullanılabilir. Genel olarak ortak anahtar algoritmaları, kullanımlarında özel anahtar algoritmalarına göre daha sınırlıdır.

Dijital İmzalar

Ortak anahtar algoritmaları dijital imzalar oluşturmak için de kullanılabilir. Dijital imzalar bir gönderenin kimliğini doğrular (gönderenin ortak anahtarına güveniyorsanız) ve verilerin bütünlüğünü korumaya yardımcı olur. Alice tarafından oluşturulan ortak anahtarı kullanarak, Alice'in verilerinin alıcısı, dijital imzayı Alice'in verileriyle ve Alice'in ortak anahtarıyla karşılaştırarak Alice'in gönderdiğini doğrulayabilir.

Bir iletiyi dijital olarak imzalamak için ortak anahtar şifrelemesini kullanmak için, Alice önce iletiye bir karma algoritması uygulayarak ileti özeti oluşturur. İleti özeti, verilerin küçük ve benzersiz bir gösterimidir. Ardından Alice, kişisel imzasını oluşturmak için ileti özetini özel anahtarıyla şifreler. İletiyi ve imzayı aldıktan sonra Bob, alice'in ortak anahtarını kullanarak imzanın şifresini çözerek ileti özetini kurtarır ve Alice'in kullandığı karma algoritmayı kullanarak iletinin karmasını oluşturur. Bob'un işlediği ileti özeti Alice'ten alınan ileti özetiyle tam olarak eşleşiyorsa, Bob iletinin özel anahtarın sahibinden geldiğinden ve verilerin değiştirilmediğinden emin olur. Bob, Alice'in özel anahtarın sahibi olduğuna güveniyorsa, mesajın Alice'ten geldiğini biliyordur.

Not

Gönderenin ortak anahtarı ortak bilgi olduğundan ve genellikle dijital imza biçiminde bulunduğundan, imza herkes tarafından doğrulanabilir. Bu yöntem iletinin gizliliğini korumaz; iletinin gizli olması için de şifrelenmelidir.

.NET, dijital imza algoritmaları uygulayan aşağıdaki sınıfları sağlar:

Karma Değerler

Karma algoritmalar rastgele uzunluktaki ikili değerleri, karma değerler olarak bilinen sabit uzunluktaki daha küçük ikili değerlerle eşler. Karma değer, bir veri parçasının sayısal gösterimidir. Düz metin içeren bir paragrafı karma olarak oluşturur ve paragrafın bir harfini bile değiştirirseniz, sonraki karma farklı bir değer üretir. Karma şifreleme açısından güçlüyse değeri önemli ölçüde değişir. Örneğin, bir iletinin tek bir biti değiştirilirse, güçlü bir karma işlevi yüzde 50 farklılık gösteren bir çıkış üretebilir. Birçok giriş değeri aynı çıkış değeriyle karma olabilir. Ancak, aynı değere karma oluşturan iki ayrı girişi bulmak işlem açısından mümkün değildir.

İleti bütünlüğünü sağlamak için iki taraf (Alice ve Bob) bir karma işlevi kullanabilir. İletilerini imzalamak için bir karma algoritması seçerler. Alice bir ileti yazar ve seçili algoritmayı kullanarak bu iletinin karması oluşturur. Daha sonra aşağıdaki yöntemlerden birini izlerler:

  • Alice düz metin iletisini ve karma iletiyi (dijital imza) Bob'a gönderir. Bob, iletiyi alır ve karma yapar ve karma değerini Alice'ten aldığı karma değerle karşılaştırır. Karma değerler aynıysa, ileti değiştirilmedi. Değerler aynı değilse, Alice yazdıktan sonra ileti değiştirildi.

    Ne yazık ki, bu yöntem gönderenin orijinalliğini belirlemez. Herkes Alice'in kimliğine bürünebilir ve Bob'a bir ileti gönderebilir. İletilerini imzalamak için aynı karma algoritmayı kullanabilirler ve Bob'un belirleyebileceği tek şey iletinin imzasıyla eşleşip eşleşmediğini belirlemektir. Bu ortadaki adam saldırısının bir biçimi. Daha fazla bilgi için bkz . Şifreleme Yeni Nesil (CNG) Güvenli İletişim Örneği.

  • Alice, güvenli olmayan bir ortak kanal üzerinden Bob'a düz metin iletisi gönderir. Karma iletiyi güvenli bir özel kanal üzerinden Bob'a gönderir. Bob düz metin iletisini alır, karma olarak ekler ve karmayı özel olarak değiştirilen karmayla karşılaştırır. Karmalar eşleşiyorsa Bob iki şey bilir:

    • İleti değiştirilmedi.

    • İletinin göndereni (Alice) özgündür.

    Bu sistemin çalışması için Alice'in özgün karma değerini Bob dışındaki tüm taraflardan gizlemesi gerekir.

  • Alice, güvenli olmayan bir genel kanal üzerinden Bob'a düz metin iletisi gönderir ve karma iletiyi genel olarak görüntülenebilir Web sitesine yerleştirir.

    Bu yöntem, herhangi birinin karma değerini değiştirmesini engelleyerek ileti üzerinde değişiklik yapılmasını engeller. İleti ve karması herkes tarafından okunabiliyor olsa da, karma değeri yalnızca Alice tarafından değiştirilebilir. Alice'in kimliğine bürünmek isteyen bir saldırgan, Alice'in Web sitesine erişim gerektirebilir.

Önceki yöntemlerden hiçbiri, birinin Alice'in iletilerini okumasını engellemez, çünkü bunlar düz metin olarak iletilir. Tam güvenlik için genellikle dijital imzalar (ileti imzalama) ve şifreleme gerekir.

.NET, karma algoritmaları uygulayan aşağıdaki sınıfları sağlar:

.NET ayrıca ve SHA1sağlarMD5. Ancak MD5 ve SHA-1 algoritmalarının güvenli olmadığı bulunmuştur ve artık bunun yerine SHA-2 önerilir. SHA-2 SHA256, SHA384 ve SHA512'yi içerir.

Rastgele Sayı Oluşturma

Rastgele sayı oluşturma, birçok şifreleme işlemi için tam sayıdır. Örneğin, şifreleme anahtarlarının yeniden üretilmesi mümkün olmayacak şekilde mümkün olduğunca rastgele olması gerekir. Şifreleme rastgele sayı oluşturucuları, yarımdan daha iyi bir olasılıkla tahmin etmek için hesaplama açısından mümkün olmayan bir çıkış oluşturmalıdır. Bu nedenle, sonraki çıkış bitini tahmin etmek için herhangi bir yöntem rastgele tahminden daha iyi performans göstermemelidir. .NET'teki sınıflar, şifreleme anahtarları oluşturmak için rastgele sayı oluşturucuları kullanır.

RandomNumberGenerator sınıfı, rastgele sayı oluşturucu algoritmasının bir uygulamasıdır.

ClickOnce Bildirimleri

Aşağıdaki şifreleme sınıfları, ClickOnce teknolojisi kullanılarak dağıtılan uygulamalar için bildirim imzaları hakkında bilgi edinmenizi ve doğrulamanızı sağlar:

Ayrıca, aşağıdaki sınıflar belirli imza bilgilerini sağlar:

Şifreleme Yeni Nesil (CNG) Sınıfları

Şifreleme Yeni Nesil (CNG) sınıfları, yerel CNG işlevleri çevresinde yönetilen bir sarmalayıcı sağlar. (CNG, CryptoAPI'nin yerini alır.) Bu sınıfların adlarının bir parçası olarak "Cng" vardır. CNG sarmalayıcı sınıflarının merkezi, CNG anahtarlarının CngKey depolamasını ve kullanımını soyutlayan anahtar kapsayıcı sınıfıdır. Bu sınıf, bir anahtar çiftini veya ortak anahtarı güvenli bir şekilde depolamanıza ve basit bir dize adı kullanarak buna başvurmanıza olanak tanır. Üç nokta eğri tabanlı ECDsaCng imza sınıfı ve ECDiffieHellmanCng şifreleme sınıfı nesneleri kullanabilir CngKey .

CngKey sınıfı anahtarları açma, oluşturma, silme ve dışarı aktarma gibi çeşitli ek işlemler için kullanılır. Ayrıca, yerel işlevleri doğrudan çağırırken kullanılacak temel anahtar tanıtıcısına erişim de sağlar.

.NET ayrıca aşağıdakiler gibi çeşitli destekleyici CNG sınıfları içerir:

Ayrıca bkz.