Procedura: utilizzare la firma completa per assegnare un nome sicuro a un assembly dinamico
È possibile assegnare un nome sicuro a un assembly dinamico tramite firma parziale o firma completa. Per la firma parziale è necessario specificare la chiave pubblica nell'AssemblyName passato al metodo DefineDynamicAssembly. Common Language Runtime alloca, all'interno del file eseguibile portabile (PE, Portable Executable) lo spazio per un blob di firma di un nome sicuro, ma non firma effettivamente l'assembly. Sarà possibile assegnare una firma completa all'assembly risultante al termine dell'elaborazione utilizzando gli strumenti forniti in Windows Software Development Kit (SDK).
Per la firma completa è necessario fornire una coppia di chiavi pubblica/privata. Queste entità sono in genere memorizzate in un file, su un disco oppure in un contenitore di chiavi fornito da un provider del servizio di crittografia (CSP, Cryptographic Service Provider) di API crittografiche. Le chiavi a bassa sicurezza vengono spesso generate da provider CSP basati su software ed esportate in un file in modo da poter essere verificate nei sistemi di gestione del codice sorgente durante lo sviluppo del progetto. Le chiavi ad alta sicurezza vengono spesso generate da hardware che in genere impedisce l'esportazione delle chiavi per ragioni di sicurezza. È possibile accedere alle coppie di chiavi di questo tipo solo indirettamente attraverso un contenitore di chiavi. La coppia di chiavi con nome sicuro è specificata tramite la classe System.Reflection.StrongNameKeyPair
Nell'esempio che segue è mostrato l'utilizzo della firma completa per assegnare un nome sicuro all'assembly dinamico.
Esempio
Imports System
Imports System.IO
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Class SNKToAssembly
Public Shared Sub Main()
Dim fs As New FileStream("SomeKeyPair.snk", FileMode.Open)
Dim kp As New StrongNameKeyPair(fs)
fs.Close()
Dim an As new AssemblyName()
an.KeyPair = kp
Dim appDomain As AppDomain = Thread.GetDomain()
Dim ab As AssemblyBuilder = _
appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave)
End Sub
End Class
' Construct a StrongNameKeyPair object. This object should obtain
' the public key from the Company.keys file.
Dim k As Reflection.StrongNameKeyPair = _
New Reflection.StrongNameKeyPair(fs)
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
class SNKToAssembly
{
public static void Main()
{
FileStream fs = new FileStream("SomeKeyPair.snk", FileMode.Open);
StrongNameKeyPair kp = new StrongNameKeyPair(fs);
fs.Close();
AssemblyName an = new AssemblyName();
an.KeyPair = kp;
AppDomain appDomain = Thread.GetDomain();
AssemblyBuilder ab = appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
}
}
// Construct a StrongNameKeyPair object. This object should obtain
// the public key from the Company.keys file.
StrongNameKeyPair k = new StrongNameKeyPair(fs);
using namespace System;
using namespace System::IO;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class SNKToAssembly
{
public:
static void Main()
{
FileStream^ fs = gcnew FileStream("SomeKeyPair.snk", FileMode::Open);
StrongNameKeyPair^ kp = gcnew StrongNameKeyPair(fs);
fs->Close();
AssemblyName^ an = gcnew AssemblyName();
an->KeyPair = kp;
AppDomain^ appDomain = Thread::GetDomain();
AssemblyBuilder^ ab = appDomain->DefineDynamicAssembly(an, AssemblyBuilderAccess::RunAndSave);
}
};
int main()
{
SNKToAssembly::Main();
}
// Construct a StrongNameKeyPair object. This object should obtain
// the public key from the Company.keys file.
StrongNameKeyPair^ k = gcnew StrongNameKeyPair(fs);
Vedere anche
Concetti
Creazione e utilizzo degli assembly con nome sicuro