Snippet

Vytvoření a smazání kontejneru pro RSA klíče

Přidáno: 20.6.2010       Kategorie: VB.NET - Zabezpečení       Autor: Ondřej Linhart

Pokud jste se někdy setkali s asymetrickým šifrováním (RSA je nejběžnější algoritmus, ve Frameworku používaný např. pro šifrované sekce v konfiguračních souborech), jistě jste si všimli, že šifrovací klíče (soukromý + veřejný klíč) jsou uloženy v tzv. kontejnerech, ze kterých je musí algoritmus vyzvednout.

Kontejner je fyzický soubor s klíči (1 kontejner = max. 2 páry soukromého a veřejného klíče) a existuje na úrovni systému (společný pro všechny uživatele) nebo na úrovni uživatele (pouze pro konkrétního uživatele).

Následující kód obsahuje statickou třídu (modul), která umožňuje vytvořit nový nebo načíst existující kontejner a získat z něho veřejnou část ve formátu XML, která se dá použít pro algoritmus RSACryptoServiceProvider a také metodu pro smazání existujícího kontejneru s klíči.

Imports System.Security.Cryptography
Module RSAKeyManager
  'Parametry pro algoritmus RSA (nedotazovat se uživatele při
  'použití klíče, označit soukromý klíč jako exportovatelný,
  'použít kontejner na úrovni systému (pro všechny uživatele).
  Private Const PROV_RSA_FULL As Integer = 1
  Private Const RSA_KEY_FLAGS As CspProviderFlags =
    CspProviderFlags.NoPrompt Or
    CspProviderFlags.UseArchivableKey Or
    CspProviderFlags.UseMachineKeyStore
  ''' <summary>
  ''' Vrací veřejnou část nově vytvořeného nebo existujícího páru klíčů.
  ''' </summary>
  ''' <param name="containerName">Název kontejneru klíčů.</param>
  ''' <returns>Veřejná část páru klíčů ve formátu XML.</returns>
  ''' <remarks>Pokud kontejner s názvem containerName neexistuje, bude vytvořen nový.</remarks>
  Public Function CreateOrOpenPublicKey(ByVal containerName As String) As String
    Dim parameters As New CspParameters(PROV_RSA_FULL)
    parameters.Flags = RSA_KEY_FLAGS
    parameters.KeyContainerName = containerName
    'Požadavek na pár klíčů určený pro podepisování
    parameters.KeyNumber = KeyNumber.Signature
    Using provider As New RSACryptoServiceProvider(parameters)
      Return provider.ToXmlString(False)
    End Using
  End Function
  ''' <summary>
  ''' Smaže kontejner klíčů.
  ''' </summary>
  ''' <param name="containerName">Název kontejneru klíčů.</param>
  ''' <remarks>Pokud kontejner s názvem containerName neexistuje, nedojde k vyjímce.</remarks>
  Public Sub DeleteContainer(ByVal containerName As String)
    Dim parameters As New CspParameters(PROV_RSA_FULL)
    parameters.Flags = RSA_KEY_FLAGS
    parameters.KeyContainerName = containerName
    parameters.KeyNumber = KeyNumber.Signature
    Using provider As New RSACryptoServiceProvider(parameters)
      provider.PersistKeyInCsp = False
    End Using
  End Sub
End Module 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.