Como criar chaves simétricas idênticas em dois servidores

Para descriptografar texto cifrado, você precisa da chave que foi usada para criptografá-lo. Quando ocorrem criptografia e descriptografia em um único banco de dados, a chave é armazenada no banco de dados e fica disponível, dependendo das permissões, tanto para criptografia quanto para descriptografia. Mas quando a criptografia e a descriptografia ocorrem em bancos de dados ou servidores separados, a chave armazenada em um banco de dados não estará disponível para uso no segundo banco de dados. Este tópico mostra como fornecer uma chave simétrica compartilhada a bancos de dados em dois servidores separados.

Visão geral

Criar chaves simétricas idênticas não é difícil. Chaves simétricas criadas com as mesmas opções de chave KEY_SOURCE, ALGORITHM e IDENTITY_VALUE serão idênticas. Antes de criar uma chave simétrica, verifique se os mecanismos de gerenciamento de chave do SQL Server foram inicializados. Se ainda não existirem, crie uma chave mestra de banco de dados para habilitar o gerenciamento automático de chave e um certificado com o qual criptografar a chave simétrica. Opcionalmente, você pode proteger a chave simétrica com uma senha. Para obter mais informações, consulte CREATE SYMMETRIC KEY (Transact-SQL).

Exemplo

Este exemplo cria chaves simétricas idênticas em dois servidores. O exemplo usa o algoritmo de criptografia AES_256. Os algoritmos de criptografia AES não têm suporte no Windows XP ou Windows Server 2000; talvez seja necessário especificar outro algoritmo, como TRIPLE_DES.

  1. Crie as chaves executando as instruções CREATE MASTER KEY, CREATE CERTIFICATE e CREATE SYMMETRIC KEY nos dois 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. Teste as chaves executando primeiro a instrução OPEN e a instrução SELECT em um 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. No segundo servidor, cole o resultado da instrução SELECT anterior no seguinte código como o valor de @blob e execute esse código para verificar se a chave duplicada pode descriptografar o 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. Feche a chave simétrica em ambos os servidores.

    CLOSE SYMMETRIC KEY [key_DataShare];
    GO