作为灾难恢复测试的一部分,我试图确保能够重新创建我的数据库并且仍然能够解密以前加密的字符串。
以下是我正在进行的测试...
- 创建数据库证书。
- 将证书和私钥备份到磁盘。
- 创建对称密钥,并通过证书加密。
- 使用 EncryptByKey 将“Hello World”加密为十六进制字符串。保留此加密字符串以供下文使用。
- 使用 DecryptByKey 将十六进制字符串解密为“Hellow World”。
这一切都很顺利,但是我正在尝试这个……
- 删除密钥和证书。
- 从备份证书再次重新创建证书。
- 创建一个新的对称密钥,与之前完全相同。
- 尝试解密先前加密的字符串,但不起作用。
使其工作的唯一方法是在创建对称密钥时指定 KEY_SOURCE 和 IDENTITY_VALUE,但 MSDN 说 IDENTITY_VALUE 用于创建“临时密钥”,所以不确定是否使用它。
对此有什么想法吗?
答案1
不可能存在需要用户提供对称密钥材料以恢复数据。对称密钥与数据库中的数据一起存储,恢复数据的灾难恢复计划也将在此过程中恢复密钥。
所有加密方案都使用密钥层次结构,该层次结构从用户提供的工件开始:密码或外部密钥。这用于依次加密其他密钥,以简化管理和操作:1) 允许轻松更改密钥而无需重新加密所有数据;2) 允许使用快速对称密钥加密大量数据。恢复后唯一需要的是访问层次结构顶部主密钥的密码。通过丢弃用于加密数据的密钥进行测试基本上是无意义的。
使用已知密钥材料 (KEY_SOURCE) 加密数据是一种非常糟糕且危险的做法。您的密钥源很可能会在脚本和其他存储密钥材料的媒体(电子邮件、配置文件等)中泄露,因此在实践中,您最好不要加密任何内容,因为您的密钥为太多人所知,因此毫无用处。