Je ne suis pas d'accord que la signature de vos assemblys n'a aucune part dans la sécurité. Oui, il est utilisé pour identifier un assemblage. Et par défaut, la signature n'est pas appliquée. Donc à cet égard, oui, la sécurité n'est pas directement affectée uniquement par la signature. Cependant, vous pouvez utiliser votre paire de clés pour appliquer la vérification de la signature sans avoir besoin de vous procurer un certificat d'autorité de certification. Pour ce faire, mais vous devez P/Invoke cette fonction:
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
À partir de là, concevoir une classe de base que vos ensembles protégés peuvent hériter de:
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
Et puis appeler le constructeur de base de votre dérivée classe:
Public Class Utils
Inherits SignedClassBase
Shared Sub New()
RuntimeHelpers.RunClassConstructor(GetType(SignedClassBase).TypeHandle)
End Sub
Public Sub New()
MyBase.New()
End Sub
End Class
maintenant, si un ensemble modifié est instancié, un CryptographicException jetteront du constructeur de la classe de base, ce qui empêche la classe dérivée d'être utilisée. Alors que la signature de code seule n'est pas directement liée à la sécurité, l'application de la signature de l'assemblage peut certainement ajouter à la sécurité que vous avez déjà en place, en conjonction avec une obfuscation forte si nécessaire. À cet égard, la clé privée DOIT rester secrète.Le partage de la clé privée dans un projet open-source est simplement un moyen de faciliter la vie des développeurs impliqués. Il serait BEAUCOUP meilleur de signer à la place les assemblages dans le cadre du processus de construction officiel, et de garder votre clé privée complètement secrète. Sinon, n'importe qui peut recompiler un assembly avec un code potentiellement malveillant et le signer avec votre clé privée, et distribuer des copies corrompues de votre projet.
Donc, il n'y a pas de mal à publier cette clé privée aussi longtemps qu'elle est utilisée et uniquement pour la signature de cet assembly particulier? Ou, pour le dire autrement, si Microsoft décidait d'ouvrir toutes ses bibliothèques de classes .NET sur GitHub, inclurait-il aussi le fichier .snk utilisé pour signer ces assemblées? –
S'ils voulaient permettre aux gens de remplacer les assemblées officielles par leurs propres copies dans le GAC, oui. Et en ce qui concerne les dommages, tant que la clé privée n'est utilisée que pour la signature forte, il est bon de la distribuer. Si vous utilisez également la même clé pour authentifier la signature, il y a un risque certain (mais il n'y a aucune raison de ne pas utiliser deux clés séparées) –
C'est un peu plus clair maintenant, mais je dirais quand même qu'une fois cette clé privée public, vous ne pouvez même plus garantir l'unicité. N'importe qui dans le monde peut maintenant créer un assembly avec exactement le même nom fort. Vous perdez tous les avantages que vous aviez quand il est resté privé. Même Jeffrey Richter dans "CLR via C#" dit que les clés privées utilisées dans la signature des assemblages devraient être stockées sur des dispositifs sécurisés et jamais partagées entre les entreprises. –