2016-03-21 50 views
3

MSDN göre, dahil etmek için önerilen bir uygulamadır hem siz açık kaynak yazılımlar geliştirmek konum kamu kaynak kontrol sistemine güçlü adlandırma meclisleri için kullanılan özel ve genel anahtarlar: Eğer varsaNeden açık kaynak depolarda montaj imzalamak için kullanılan özel anahtarı eklemeniz önerilir?

Açık kaynaklı bir geliştirici ve güçlü adlandırılmış bir derlemenin kimlik avantajlarını istiyorsanız, kaynak denetleme sisteminize bir montajla ilişkili özel anahtarı denetlemeyi düşünebilirsiniz.

Bu, beni çok şaşırtan bir şey. Özel anahtarı herkese açık mı? Bu durumda asimetrik kriptografinin amacı ve güvenliği yok olmaz mıydı?

güvenlik için güçlü isimlerin güvenmeyin:

Aynı makalede bu nota bakın. Sadece benzersiz bir kimlik sağlarlar.

Bu, karışıklığımı azaltmaya yardımcı olmuyor. Güvenlik neden amaç değilse, o zaman neden bir özel-kamu anahtar çifti kullanın? .NET'teki güçlü adlandırma mekanizması, gizli anahtar çiftlerini uygunsuz bir şekilde kullanıyor mu? Benim tahminim eksik ya da bir şeyi yanlış anlamadığım.

cevap

3

Güçlü ad imzalaması güvenlik için değil, benzersizliği garanti etmektir. İki kişi 'u yaparsa, onları GAC'de ayırmanın bir yolu vardır.

(bir açık kaynak kütüphanesi varsa ve son kullanıcının MyOpenSource.dll v1.0.0.0 kullanıcının kopyalama ve resmi kopya hem de aynı anahtarla imzalanmış olmalıdır sonra serbest MyOpenSource.dll v1.0.0.0 için bir yedek olarak kullanılacak edebilmek istiyor veya her ikisi de imzalanmamış olmalıdır). Bu yüzden onu dağıtmak istersiniz.

Güçlü ad anahtarı, "Bu, MyOpenSource.dll'un resmi, değiştirilmemiş bir kopyasıdır" demek değildir; bu, Authenticode signing için geçerlidir. Sadece farklı yayıncılardan isim çarpışmasının önlenmesi içindir.

+0

Bu özel anahtarın, yalnızca söz konusu montajı imzalamak için kullanıldığı sürece yayınlama konusunda hiçbir zararı yoktur? Veya, başka bir şekilde söylemek gerekirse, Microsoft, tüm .NET temel sınıf kitaplıklarını GitHub'da açmaya karar verdiyse, bu derlemeleri imzalamak için kullanılan .snk dosyasını da içerir mi? –

+1

İnsanların resmi meclisleri GAC'de kendi kopyalarıyla değiştirmelerine izin vermek istiyorlarsa, evet. Ve zarar için, özel anahtar sadece güçlü adlandırılmış imzalama için kullanıldığı sürece, onu dağıtmak iyidir. Authenticode imzalamak için aynı anahtarı kullanıyorsanız, o zaman kesin bir risk var (Ama iki ayrı anahtar kullanmamak için bir neden yok) –

+0

Şimdi biraz daha açık, ama yine de bu özel anahtarı yaptıktan sonra söyleyeyim kamuya artık benzersizliği garanti edemezsin. Dünyadaki herkes artık tam olarak aynı güçlü ada sahip bir derleme oluşturabilir. Özel kaldığında sahip olduğunuz tüm avantajları kaybedersiniz. "C# ile CLR" deki Jeffrey Richter bile, montaj imzalamada kullanılan özel anahtarların güvenli cihazlarda saklanması gerektiğini ve asla şirketler arasında paylaşılmaması gerektiğini söylüyor. –

0

Montajlarınızı imzalamanın güvenlik konusunda bir parçası olmadığını kabul ediyorum. Evet, bir montajı tanımlamak için kullanılır. Ve varsayılan olarak, imza zorunlu DEĞİLDİR. Dolayısıyla bu bağlamda, güvenlik sadece imzalama yoluyla doğrudan etkilenmez. Ancak, bir CA sertifikası almak zorunda kalmadan imza doğrulamasını zorunlu tutmak için anahtar çiftinizi kullanabilirsiniz. P/bu fonksiyonu çağır gerekir ancak Bunun için: Oradan

Imports System.Runtime.InteropServices 

Friend Class NativeMethods 
    <DllImport("mscoree.dll", CharSet:=CharSet.Unicode)> _ 
    Public Shared Function StrongNameSignatureVerificationEx(wszFilePath As String, fForceVerification As Byte, ByRef pfWasVerified As Byte) As Boolean 
    End Function 
End Class 

, korunan montajlar dan devralabilir bir temel sınıf tasarımı:

Imports System.Reflection 
Imports System.Security.Cryptography 

Public Class SignedClassBase 
    Shared Sub New() 
     VerifyAssemblySignature(Assembly.GetCallingAssembly()) 
    End Sub 

    Public Sub New() 
     VerifyAssemblySignature(Assembly.GetCallingAssembly()) 
    End Sub 

    Private Shared Sub VerifyAssemblySignature(assembly As Assembly) 
     Dim wasVerified As Boolean 
     If Not (NativeMethods.StrongNameSignatureVerificationEx(assembly.Location, True, wasVerified) AndAlso wasVerified) Then 
      Throw New CryptographicException("Verification failed: Assembly signature did not match.") 
     End If 
    End Sub 
End Class 

Ve sonra türetilmiş gelen temel kurucu çağırmak sınıfı: bir tadil edilmiş montaj örneği ise

Public Class Utils 
    Inherits SignedClassBase 

    Shared Sub New() 
     RuntimeHelpers.RunClassConstructor(GetType(SignedClassBase).TypeHandle) 
    End Sub 

    Public Sub New() 
     MyBase.New() 
    End Sub 
End Class 

Şimdi, CryptographicException kullanılan türetilen sınıf önlenmesi, temel sınıf kurucuda fırlatır.

Bu nedenle, yalnızca kodu imzalarken doğrudan güvenlikle bağlantı kuramazken, montaj imzasını zorunlu kılmak, gerektiği yerde güçlü bir gizleme ile bağlantılı olarak, halihazırda sahip olduğunuz güvenliğe kesinlikle katkıda bulunabilir. Bu bakımdan, özel anahtarın gizli kalması ZORUNLUDUR.Özel anahtarın açık kaynaklı bir projede paylaşılması, yalnızca geliştiricilerin dahil olduğu yaşamı kolaylaştırmak için bir yoldur. Bunun yerine derlemeleri resmi oluşturma sürecinin bir parçası olarak imzalamak ve özel anahtarınızı tamamen gizli tutmak daha iyi olur. Aksi taktirde, herhangi biri potansiyel olarak zararlı kod içeren bir derlemeyi yeniden derleyebilir ve özel anahtarınızla imzalayabilir ve projenizin lekelenmiş kopyalarını dağıtabilir.

+0

Özel anahtarın özel tutulmasının önemi konusunda hemfikir olduğumuza sevindim. Kod örnek gelince, ben zihinsel olarak çok daha fazla tanıdık olarak VB.NET C# çevirmek için biraz aldı, ama hala ne zaman ve Utils yapıcı çağırılması gerektiğini anladım emin değilim. –

+0

Türetilmiş sınıf yapıcısını çağırmak zorunda değilsiniz, her ne çağırırsa onu çağırır. Utils sınıfında bir paylaşılan (veya C# statik; C# statik olarak C# özgün etiketini göremedim) yöntemini ilk kez çağırdığınızda, temel sınıf yapıcısını çağıran paylaşılan kurucusu çağrılır. Ve eğer "var bleh = new Utils();" ise, kamu kurucusu çağrılır ve tekrar temel sınıf kurucusu çalıştırılır. –