방법: 두 서버에서 동일한 대칭 키 만들기

ciphertext를 해독하려면 암호화하는 데 사용된 키가 필요합니다. 단일 데이터베이스에서 암호화와 암호 해독이 모두 수행되는 경우 키가 데이터베이스에 저장되며 사용 권한에 따라 암호화와 암호 해독에 모두 사용할 수 있습니다. 그러나 암호화와 암호 해독이 개별 데이터베이스나 개별 서버에서 수행되는 경우 한 데이터베이스에 저장된 키를 다른 데이터베이스에서 사용할 수 없습니다. 이 항목에서는 두 개의 개별 서버에 있는 데이터베이스에 공유 대칭 키를 제공하는 방법을 보여 줍니다.

개요

동일한 대칭 키를 만드는 것은 어렵지 않습니다. 같은 KEY_SOURCE, ALGORITHM 및 IDENTITY_VALUE 키 옵션을 사용하여 만든 대칭 키는 모두 동일합니다. 대칭 키를 만들기 전에 SQL Server의 키 관리 메커니즘이 초기화되었는지 확인해야 합니다. 키 관리 메커니즘이 없을 경우 대칭 키를 암호화하는 데 사용할 인증서와 자동 키 관리를 설정할 데이터베이스 마스터 키를 만들어야 합니다. 필요에 따라 대칭 키를 암호로 보호할 수 있습니다. 자세한 내용은 CREATE SYMMETRIC KEY(Transact-SQL)를 참조하십시오.

다음 예에서는 두 서버에 동일한 대칭 키를 만듭니다. 또한 AES_256 암호화 알고리즘을 사용합니다. Windows XP 또는 Windows Server 2000에서는 AES 암호화 알고리즘이 지원되지 않습니다. TRIPLE_DES와 같은 다른 알고리즘을 지정해야 할 수도 있습니다.

  1. 두 서버에서 다음 CREATE MASTER KEY, CREATE CERTIFICATE 및 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
    
  2. 한 서버에서 먼저 OPEN SYMMETRIC KEY 문과 SELECT 문을 실행하여 키를 테스트합니다.

    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. 두 번째 서버에서 이전 SELECT 문의 결과를 다음 코드에 @blob 값으로 붙여 넣고 다음 코드를 실행하여 중복 키가 ciphertext를 해독할 수 있는지 확인합니다.

    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. 두 서버에서 대칭 키를 닫습니다.

    CLOSE SYMMETRIC KEY [key_DataShare];
    GO