Condividi tramite


Creare chiavi simmetriche identiche su due server

Questo argomento descrive come creare chiavi simmetriche identiche in due server diversi in SQL Server 2014 usando Transact-SQL. Per decrittografare il testo cifrato, è necessario disporre della chiave usata per crittografarlo. Quando si verificano sia la crittografia che la decrittografia in un singolo database, la chiave viene archiviata nel database ed è disponibile, a seconda delle autorizzazioni, sia per la crittografia che per la decrittografia. Tuttavia, quando si verificano la crittografia e la decrittografia in database separati o in server separati, la chiave archiviata in un database non è disponibile per l'uso nel secondo database

Contenuto dell'articolo

Prima di iniziare

Limitazioni e restrizioni

  • Quando si crea una chiave simmetrica è necessario crittografarla con almeno uno degli elementi seguenti: certificato, password, chiave simmetrica, chiave asimmetrica o PROVIDER. La chiave può avere più di una crittografia di ciascun tipo. ovvero una singola chiave simmetrica può essere crittografata contemporaneamente con più certificati, password, chiavi simmetriche e chiavi asimmetriche.

  • Se si crittografa una chiave simmetrica con una password anziché con la chiave pubblica della chiave master del database, viene usato l'algoritmo di crittografia TRIPLE DES. Per questo motivo, le chiavi create con un algoritmo di crittografia avanzato, come AES, vengono a loro volta protette con un algoritmo meno avanzato.

Sicurezza

Autorizzazioni

È richiesta l'autorizzazione ALTER ANY SYMMETRIC KEY per il database. Se si specifica AUTHORIZATION, è richiesta l'autorizzazione IMPERSONATE per l'utente del database o l'autorizzazione ALTER per il ruolo applicativo. Se la crittografia viene applicata con un certificato o una chiave asimmetrica, è richiesta l'autorizzazione VIEW DEFINITION per il certificato o la chiave asimmetrica. Solo gli account di accesso di Windows e di SQL Server e i ruoli applicazione possono avere chiavi simmetriche. I gruppi e i ruoli non possono possedere chiavi simmetriche.

Uso di Transact-SQL

Per creare chiavi simmetriche identiche su due server diversi

  1. In Esplora oggetti, collegarsi a un'istanza di Database Engine.

  2. Sulla barra Standard fare clic su Nuova query.

  3. Creare una chiave eseguendo le seguenti istruzioni CREATE MASTER KEY, CREATE CERTIFICATE e CREATE SYMMETRIC KEY.

    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  
    
  4. Connettersi a un'istanza del server separata, aprire una finestra Query diversa ed eseguire le istruzioni SQL precedenti per creare la stessa chiave nel secondo server.

  5. Verificare le chiavi eseguendo prima l'istruzione OPEN SYMMETRIC KEY e quindi l'istruzione SELECT seguente nel primo server.

    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  
    
  6. Nell'altro server incollare il risultato dell'istruzione SELECT precedente nel codice indicato di seguito come valore di @blob ed eseguire il codice per verificare che la chiave duplicata sia in grado di decrittografare il testo crittografato.

    OPEN SYMMETRIC KEY [key_DataShare]   
        DECRYPTION BY CERTIFICATE cert_keyProtection;  
    GO  
    DECLARE @blob varbinary(8000);  
    SET @blob = SELECT CONVERT(varchar(8000), decryptbykey(@blob));  
    GO  
    
  7. Chiudere la chiave simmetrica in entrambi i server.

    CLOSE SYMMETRIC KEY [key_DataShare];  
    GO  
    

Per altre informazioni, vedere quanto segue: