在两台服务器上创建相同的对称密钥

本主题介绍如何使用 Transact-SQL 在 SQL Server 2014 中的两个不同的服务器上创建相同的对称密钥。 若要解密密码文本,需要用于加密密码的密钥。 当加密和解密同时发生在单一数据库中时,密钥将存储在数据库中,根据加密和解密的权限,该密钥可用。 但是,当加密和解密发生在单独的数据库或单独的服务器上时,存储在一个数据库中的密钥不能用于第二个数据库

本主题内容

在您开始之前

局限性与限制

  • 创建对称密钥时,必须使用以下至少一项来加密对称密钥:证书、密码、对称密钥、非对称密钥或 PROVIDER。 密钥可以具有每种类型的多个加密。 换句话说,可以使用多个证书、密码、对称密钥和非对称密钥同时加密单个对称密钥。

  • 使用密码而不是数据库主密钥的公钥对对称密钥进行加密时,将使用 TRIPLE DES 加密算法。 因此,使用强加密算法(如 AES)创建的密钥本身受较弱算法保护。

安全

权限

需要在数据库上拥有 ALTER ANY SYMMETRIC KEY 的权限。 如果指定 AUTHORIZATION,则需要数据库用户的 IMPERSONATE 权限或应用程序角色的 ALTER 权限。 如果加密由证书或非对称密钥进行,则需要对证书或非对称密钥具有 VIEW DEFINITION 权限。 只有 Windows 登录名、SQL Server 登录名和应用程序角色才能拥有对称密钥。 组和角色不能拥有对称密钥。

使用 Transact-SQL

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

  1. “对象资源管理器” 中,连接到某个数据库引擎实例。

  2. 在标准栏上,单击“新建查询”

  3. 通过运行以下 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  
    
  4. 连接到单独的服务器实例,打开不同的查询窗口,并运行上述 SQL 语句以在另一台服务器上创建相同的密钥。

  5. 首先在第一台服务器上运行 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  
    
  6. 在第二台服务器上,将上一个 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  
    
  7. 关闭两台服务器上的对称密钥。

    CLOSE SYMMETRIC KEY [key_DataShare];  
    GO  
    

有关详细信息,请参阅以下内容: