Cómo crear claves simétricas idénticas en dos servidores

Para descifrar el texto cifrado, se necesita la clave que se usó para cifrarlo. Cuando el cifrado y el descifrado tienen lugar en una sola base de datos, la clave se almacena en la base de datos y está disponible, según los permisos, tanto para el cifrado como para el descifrado. Pero cuando ambos procesos ocurren en bases de datos diferentes o en servidores diferentes, la clave almacenada en una base de datos no está disponible para utilizarla en la segunda base de datos. En este tema se muestra cómo proporcionar una clave simétrica compartida a bases de datos de dos servidores diferentes.

Información general

Crear claves simétricas idénticas no es difícil. Las claves simétricas creadas con las mismas opciones de clave, KEY_SOURCE, ALGORITHM e IDENTITY_VALUE, serán idénticas. Antes de crear una clave simétrica, debe comprobar que se hayan inicializado los mecanismos de administración de claves de SQL Server. Si aún no existen, debe crear una clave maestra de base de datos para habilitar la administración automática de claves y un certificado con el que cifrar la clave simétrica. Si lo desea, puede proteger la clave simétrica con una contraseña. Para obtener más información, vea CREATE SYMMETRIC KEY (Transact-SQL).

Ejemplo

En este ejemplo se crean claves simétricas idénticas en dos servidores. En el ejemplo se utiliza el algoritmo de cifrado AES_256. Los algoritmos de cifrado AES no se admiten en Windows XP ni en Windows Server 2000; es posible que tenga que especificar otro algoritmo, como TRIPLE_DES.

  1. Cree las claves ejecutando las siguientes instrucciones, CREATE MASTER KEY, CREATE CERTIFICATE y CREATE SYMMETRIC KEY, en ambos servidores.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'My p@55w0Rd';
    GO
    CREATE CERTIFICATE [cert_keyProtection] WITH SUBJECT = 'Key Protection';
    GO
    CREATE SYMMETRIC KEY [key_DataShare] WITH
        KEY_SOURCE = 'My key generation bits. This is a shared secret!',
        ALGORITHM = AES_256, 
        IDENTITY_VALUE = 'Key Identity generation bits. Also a shared secret'
        ENCRYPTION BY CERTIFICATE [cert_keyProtection];
    GO
    
  2. Pruebe las claves ejecutando primero la instrucción OPEN SYMMETRIC KEY y la instrucción SELECT en un servidor.

    OPEN SYMMETRIC KEY [key_DataShare] 
        DECRYPTION BY CERTIFICATE cert_keyProtection;
    GO
    SELECT encryptbykey(key_guid('key_DataShare'), 'MyData' )
    GO
    -- For example, the output might look like this: 0x2152F8DA8A500A9EDC2FAE26D15C302DA70D25563DAE7D5D1102E3056CE9EF95CA3E7289F7F4D0523ED0376B155FE9C3
    
  3. En el segundo servidor, pegue el resultado de la instrucción SELECT previa en el siguiente código como el valor de @blob y ejecute el siguiente código para comprobar que la clave duplicada pueda descifrar el texto cifrado.

    OPEN SYMMETRIC KEY [key_DataShare] 
        DECRYPTION BY CERTIFICATE cert_keyProtection;
    GO
    DECLARE @blob varbinary(8000);
    SET @blob = SELECT CONVERT(varchar(8000), decryptbykey(@blob));
    GO
    
  4. Cierre la clave simétrica en ambos servidores.

    CLOSE SYMMETRIC KEY [key_DataShare];
    GO