如何在两个服务器上创建相同的对称密钥

为了对密码进行解密,需要用于加密密码的密钥。在一个数据库中同时执行加密和解密时,密钥保存在数据库中并可同时用于(取决于权限)加密和解密。但在不同的数据库或服务器中执行加密和解密时,保存在一个数据库中的密钥不能用于另一数据库。本主题说明了如何为两个不同的服务器中的数据库提供共享的对称密钥。

概述

创建相同的对称密钥非常容易。使用相同的 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 的值粘贴到以下代码中,并运行以下代码以验证复制的密钥可对密码进行解密。

    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