wtorek, 28 lipca 2009

Bezpieczne przechowywanie pary kluczy algorytmu RSA na platformie .NET (przykłady w C#) [PL]

Klucze żadnego algorytmu kryptograficznego nie powinny być przechowywane w postaci otwartego tekstu, dlatego w celu ich przechowywania zostały opracowane odpowiednie kontenery (tzw. key containers). Kontenery kluczy są obszarami pamięci, przeznaczonymi do przechowywania kluczy kryptograficznych, którymi zarządzają dostawcy CSP (Crypto Service Provider); do ochrony zawartości kontenerów stosowane jest silne szyfrowanie i zabezpieczenia systemu operacyjnego.

.NET Framework automatycznie przymusza nas do wykorzystania tych kontenerów, np. przy wykorzystaniu niniejszego wywołania:

CspParameters csp = new CspParameters();
csp.KeyContainerName = "MyKeys";

W tym przypadku jeżeli kontener kluczy o tej nazwie istnieje, wtedy CSP wykorzystuje istniejące w nim klucze. Natomiast, gdy danego kontenera jeszcze nie ma, klucze są automatycznie generowane. Dlatego mylące może być twierdzenie, że powyższe dwie linie generują nowe klucze, a wielokrotne ich wywoływanie powoduje "otrzymanie" tych samych kluczy (przecież klucze zostały wygenerowane w momencie utworzenia kontenera, a później są już tylko z niego odczytywane).

Aby mieć pewność, że otrzymamy za każdym razem inną parę kluczy należy te klucze wykasować z danego kontenera, a może do tego zostać wykorzystana np. poniższa funkcja (jej źródło z MSDN):

public static void DeleteKeyFromContainer(string ContainerName)
{
    // Create the CspParameters object and set the key container
    // name used to store the RSA key pair.
    CspParameters cp = new CspParameters();
    cp.KeyContainerName = ContainerName;

    // Create a new instance of RSACryptoServiceProvider that accesses
    // the key container.
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

    // Delete the key entry in the container.
    rsa.PersistKeyInCsp = false;

    // Call Clear to release resources and delete the key from the container.
    rsa.Clear();

    Console.WriteLine("Key deleted.");
}

Więcej na temat zarządzania kluczami znaleźć można w MSDN, np. pod adresem: http://msdn.microsoft.com/en-us/library/tswxhw92.aspx, lub w książce: "C# - Księga przykładów" (z wyd. Microsoft Press) w rozdziale: "Bezpieczne zapamiętywanie klucza szyfrowania symetrycznego". Jeśli ktoś natomiast ma ochotę dowiedzieć się do czego można klucze wykorzystać, zapraszam do przeczytania mojego wcześniejszego posta: "Podpisywanie danych przy pomocy algorytmu RSA (przykłady w C#)."

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts