0 votes

Comment utiliser les noms d'assemblages forts et les fichiers clés pour vérifier que la DLL que je charge est bien celle que j'attends ?

J'ai un projet en cours où j'ai besoin de charger des DLL de manière programmatique et d'exécuter du code dans ces DLL. Les DLLs et leurs dépendances sont stockées dans une base de données, et je les écris sur le disque, mais je veux vérifier si une DLL est déjà là avant de l'écrire à nouveau. Actuellement, la base de données contient le nom d'assemblage fort et les données binaires du fichier ainsi qu'un numéro de version. Je pense que je dois également stocker la clé publique de l'assemblage pour la comparer à la clé des fichiers existants dans le répertoire DLL.

Je sais que je peux obtenir la clé publique des assemblages en utilisant AssemblyName.GetPublicKey(). Devrais-je simplement stocker la clé publique du fichier dans la base de données également ? Comment un assemblage peut-il être vérifié si la clé publique ne figure pas dans votre code (est-ce possible) ? Tous les exemples de code que j'ai trouvés montrent simplement l'obtention de la clé publique ou la vérification de l'existence d'un nom fort.

En ce moment, je travaille sur un cours de gestion de bibliothèque qui est juste un dictionnaire à la base. Elle vérifie le répertoire dll au démarrage et ajoute la clé publique de chaque fichier au dictionnaire. Ensuite, lorsque j'ai besoin de vérifier si un assemblage est déjà sur le disque, je peux simplement vérifier le dictionnaire (mais cela nécessite que je stocke la clé publique dans la base de données). Il utilise également FileSystemWatcher pour surveiller tout changement apporté aux bibliothèques. Si je dois écrire un assemblage mis à jour, il me suffit d'écraser celui qui se trouve sur le disque et la classe met à jour le dictionnaire.

0voto

David Rutten Points 2460

J'ai constaté que je ne peux pas compter sur le cadre DotNET pour charger réellement l'assemblage que je demande. Il renvoie parfois un autre assemblage qui a un numéro de version plus élevé (il est trop intelligent).

Maintenant, je lis le fichier d'assemblage en mémoire, puis je charge l'assemblage à partir du flux COFF :

''' <summary>
''' Converts a DotNET class library to a COFF-based image containing the entire assembly
''' </summary>
Public Shared Function ReadAssembly(ByVal iPath As String) As Byte()
  If (Not IO.File.Exists(iPath)) Then Return Nothing

  Try
    Dim file_info As New FileInfo(iPath)
    Dim file_byte(Convert.ToInt32(file_info.Length)) As Byte
    Dim file_stream As New FileStream(iPath, FileMode.Open)

    file_stream.Read(file_byte, 0, file_byte.Length)
    file_stream.Close()

    Return file_byte

  Catch ex As Exception
    Kernel.EH_LogServer.AddMessage("Assembly reading failed: " & ex.Message, EH_RuntimeMessageType.Error)
    Return Nothing
  End Try
End Function

Il suffit ensuite d'appeler Assembly.Load(coff_image).

Je ferais un contrôle CRC sur la matrice d'octets pour voir s'il y a une différence entre les deux assemblages.

0voto

Steven Sudit Points 13793

Je suppose que vous pourriez réutiliser les données SN, mais je ne le ferais pas. Tout d'abord, il ne suffit pas d'obtenir la clé publique, qui ne va pas changer d'une version à l'autre. Il faudrait plutôt extraire le hachage qui est chiffré avec la clé privée. Je ne sais pas à l'avance comment faire cela, c'est pourquoi j'essaierais autre chose.

Au lieu de cela, je m'assurais que le numéro de version de chaque build était unique et je l'utilisais. Si vous devez vraiment le faire, vous pouvez utiliser la classe SHA1 pour exécuter votre propre hachage, mais cela semble paranoïaque.

modifier

Pour être clair, la clé publique est utilisée pour décrypter le hachage stocké, qui est ensuite comparé à un hachage fraîchement généré. Toute clé publique fonctionnera, c'est pourquoi le programme de chargement doit utiliser le nom fort, qui spécifie la clé publique autorisée.

De plus, vous devriez stocker le nom complet de la force, et pas seulement la clé publique. Cela inclut la version et la clé publique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X