AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 160125
Accepted
Ben Thul
Ben Thul
Asked: 2017-01-06 15:10:43 +0800 CST2017-01-06 15:10:43 +0800 CST 2017-01-06 15:10:43 +0800 CST

如何检查数据库主密钥加密是否有效?

  • 772

我有一个场景,我正在将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,里面的行sys.key_encryptions仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 加密?

sql-server encryption
  • 1 1 个回答
  • 23297 Views

1 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2017-01-06T19:06:47+08:002017-01-06T19:06:47+08:00

    为了以编程方式确定当前 SMK 是否用于保护 DMK,您应该能够简单地尝试需要 DMK 的操作。这样的操作需要首先解密 DMK 才能使用它。假设您没有明确打开 DMK(使用创建时提供的密码),解密 DMK 将需要 SMK。如果当前的 SMK 不是正确的SMK,则 DMK 不会被自动解密,操作会失败。所以:

    • 如果您有一个保证存在于正在恢复的数据库中的证书,请尝试使用它:

      SELECT SIGNBYCERT( CERT_ID( '{certificate_name}' ), 'test' );
      

      那应该返回一个非NULLVARBINARY 值。如果返回值为NULL,则需要重新生成 DMK(按照以下说明)。

    • 如果不能保证正在恢复的数据库中存在证书,则尝试创建一个。如果 SMK 可用于自动解密 DMK,则将创建证书,否则操作将失败:

      BEGIN TRY
        CREATE CERTIFICATE [TestCert] WITH SUBJECT = 'yadda yadda yadda';
        DROP CERTIFICATE [TestCert];
        PRINT 'All good, yo!';
      END TRY
      BEGIN CATCH
        PRINT ERROR_MESSAGE();
      END CATCH;
      

    但是,由于您刚刚恢复了来自另一个实例的数据库并且没有将该其他实例的 SMK 恢复到新实例中,因此可以安全地假设答案是:“不,DMK没有使用此服务器的 SMK加密。”

    这是一种预期的情况,需要采取以下步骤进行补救:

    USE [newly_restored_db];
    OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK
    ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}';
    CLOSE MASTER KEY;
    

    状态的 MSDN 页面CREATE MASTER KEY(已添加重点):

    对于 SQL Server 和并行数据仓库,主密钥通常由服务主密钥和至少一个密码保护。如果数据库被物理移动到不同的服务器(日志传送、恢复备份等),数据库将包含由原始服务器服务主密钥加密的主密钥副本(除非使用 ALTER 显式删除此加密MASTER KEY DDL),以及由在 CREATE MASTER KEY 或后续 ALTER MASTER KEY DDL 操作期间指定的每个密码加密的副本。为了恢复主密钥,以及在数据库移动后使用主密钥作为密钥层次结构中的根加密的所有数据,用户必须 [to]使用 [the] OPEN MASTER KEY 语句,使用其中之一用于保护主密钥的密码,恢复主密钥的备份,或在新服务器上恢复原始服务主密钥的备份。

    状态的 MSDN 页面OPEN MASTER KEY:

    当数据库第一次附加或恢复到 SQL Server 的新实例时,数据库主密钥的副本(由服务主密钥加密)尚未存储在服务器中。您必须使用OPEN MASTER KEY语句来解密数据库主密钥 (DMK)。解密 DMK 后,您可以选择在将来启用自动解密,方法是使用ALTER MASTER KEY REGENERATE语句为服务器提供 DMK 的副本,并使用服务主密钥 (SMK) 加密。从早期版本升级数据库后,应重新生成 DMK 以使用较新的 AES 算法。有关重新生成 DMK 的详细信息,请参阅ALTER MASTER KEY (Transact-SQL). 重新生成 DMK 密钥以升级到 AES 所需的时间取决于受 DMK 保护的对象的数量。重新生成 DMK 密钥以升级到 AES 只需要一次,并且作为密钥轮换策略的一部分对未来的重新生成没有影响。

    ALTER MASTER KEY的 MSDN 页面指出:

    REGENERATE 选项重新创建数据库主密钥及其保护的所有密钥。密钥首先用旧的主密钥解密,然后用新的主密钥加密。这种资源密集型操作应安排在需求量低的时期,除非主密钥已被泄露。

    • 8

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve