我将一个SQL Server数据库从一个系统复制到下一个相同的设置,但完全不同的物理机器。我使用Norton Ghost手动恢复文件,例如,重新安装SQL Server 2008 Express后,在c:\ Program Files中找到的整个SQL Server 2008文件夹。
我的一个数据库在其中一个表列上启用了AES_256加密。我重置我的IIS7并试图运行访问数据库的应用程序,检索数据后,我收到此错误:
>'/'应用程序中的服务器错误。 请在中创建一个主密钥 数据库或打开主密钥 执行此操作前的会话 操作。描述:未处理 期间发生了异常 执行当前的Web请求。 请查看堆栈跟踪了解更多信息 有关错误的信息和位置 它起源于代码。异常详细信息: System.Data.SqlClient.SqlException: 请在中创建一个主密钥 数据库或打开主密钥 执行此操作前的会话 操作
来源错误:
生成了未处理的异常 在执行当前 网络请求。有关的信息 异常的起源和位置 可以使用例外来识别 堆栈跟踪下面。
我已经完成了一些阅读,并找到了一些关于AES加密如何与机器密钥相关联的链接,但是如何将其复制到新系统却不知所措。或者甚至可能不是这样。
注意:我尝试删除对称密钥,证书和主密钥并重新创建它们。这消除了错误,但是通过AES_256加密的数据没有显示出来。但是,未加密的列会这样做。
非常感谢任何帮助。提前致谢!
答案 0 :(得分:68)
使用服务器主密钥对数据库主密钥进行加密,该主密钥特定于安装SQL Server的计算机。将数据库移动到另一台服务器时,您将无法自动解密并打开数据库主密钥,因为本地服务器密钥很可能不同。如果无法解密数据库主密钥,则无法解密依赖于它的任何其他内容(证书,对称密钥等)。
基本上,您希望针对新服务器密钥重新加密数据库主密钥,这可以使用此脚本完成(使用管理员权限):
-- Reset database master key for server (if database was restored from backups on another server)
OPEN MASTER KEY DECRYPTION BY PASSWORD = '---your database master key password---'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
GO
请注意,在创建数据库主密钥时,也应始终提供密码,以便在无法使用服务主密钥的情况下使用密码打开密钥 - 希望您拥有该密码存储在某处!
或者,您可以还原数据库主密钥的备份 - 但是您需要为目标服务器创建一个备份,而不是源服务器。
如果您还没有备份或密码,那么我不确定您是否能够在新服务器上恢复加密数据,因为您必须删除并重新创建数据库主密钥。新密码,将杀死任何依赖的密钥和数据。
答案 1 :(得分:3)
我刚遇到类似的情况,OS驱动器死后服务器重建。我重新安装了SQL并将其重新连接到未经修改的数据驱动器上的所有旧数据库。除了我的加密列,一切都有效。但我的问题是主服务密钥已被清除。我可以通过返回到移动之前一直是我的SQL服务器服务帐户的相同域凭据来修复我的主服务密钥。
这article给了我修复(对于他的优秀文章,感谢Matt Bowler)。我知道本地机器密钥已经改变,但我的救赎是我可以使用相同的服务帐户。
服务主密钥:密钥层次结构的顶部是服务主密钥。每个SQL Server实例有一个,它是一个对称密钥,它存储在master数据库中。用于加密数据库主密钥,链接服务器密码和凭据,它是在第一次SQL Server启动时生成的。
没有与此密钥关联的用户可配置密码 - 它由SQL Server服务帐户和本地计算机密钥加密。在启动时,SQL Server可以使用这些解密之一打开服务主密钥。如果其中一个失败 - SQL Server将使用另一个并“修复”失败的解密(如果两者都失败 - SQL Server将出错)。这是为了解决故障转移后本地计算机密钥不同的群集等情况。这也是使用SQL Server配置管理器更改服务帐户的一个原因 - 因为这样可以正确地重新生成服务主密钥加密。