根据MSDN,如果您正在开发开源软件,建议您将用于强命名程序集的私钥和公钥都包含在公共源代码控制系统中:
如果您是一名开源开发人员并且希望获得具有强名称的程序集的身份优势,请考虑将与程序集关联的私钥检入您的源代码管理系统。
这让我感到非常困惑。将私钥公开?在这种情况下,不对称加密的整个目的和安全性是否会失败?
我在同一篇文章中看到这个说明:
不要依赖强名称来保证安全。它们只提供独特的身份。
这无助于减少我的困惑。如果安全不是目的,为什么然后使用私钥 - 公钥对? .NET中的强命名机制是否以不恰当的方式使用私有 - 公共密钥对?我的猜测是我错过了或误解了什么。
答案 0 :(得分:4)
强名称签名不是为了安全,而是为了保证唯一性。如果有两个人Foo.dll v1.0.0.0
你就有办法在GAC中告诉他们。
如果您有一个开源库,并希望最终用户的MyOpenSource.dll v1.0.0.0
能够用作已发布的MyOpenSource.dll v1.0.0.0
的替代品,那么用户都可以副本和正式副本必须使用相同的密钥签名(或两者都不能签名)。这就是为什么你想分发它。
强名称密钥不是用于说"这是MyOpenSource.dll
"的官方未经修改的副本,这是Authenticode signing的用途。它仅用于防止来自不同发布者的名称冲突。
答案 1 :(得分:1)
我不同意签署你的程序集没有安全性。是的,它用于识别装配体。默认情况下,签名不会强制执行。所以在这方面,是的,只有签署才能直接影响安全性。但是,您可以使用密钥对来强制执行签名验证,而无需为CA证书提供支持。要执行此操作,您必须P / Invoke此功能:
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
从那里设计一个受保护的程序集可以继承的基类:
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
然后从派生类中调用基础构造函数:
Public Class Utils
Inherits SignedClassBase
Shared Sub New()
RuntimeHelpers.RunClassConstructor(GetType(SignedClassBase).TypeHandle)
End Sub
Public Sub New()
MyBase.New()
End Sub
End Class
现在,如果实例化了修改过的程序集,CryptographicException将从基类构造函数抛出,从而阻止使用派生类。
因此,虽然单独签名代码并不直接与安全性相关联,但强制执行程序集签名肯定可以添加到您已有的任何安全性,并在需要时结合强大的混淆。在这方面,私钥必须保密。在开源项目中共享私钥只是让所涉及的开发人员更轻松的生活方式。最好将程序集作为官方构建过程的一部分进行签名,并使您的私钥完全保密。否则,任何人都可以使用潜在的恶意代码重新编译程序集,并使用您的私钥对其进行签名,并分发项目的污染副本。