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.
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? –
İ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) –
Ş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. –