我正在使用一个较旧的应用程序,该应用程序使用企业库加密应用程序块进行数据加密。
目前,对于每个设置的新服务器,我们必须手动运行EntLibConfig.exe(一个UI应用程序(,导入从另一台机器导出的密钥,并恢复新服务器的密钥。
这个手动过程需要消失。有没有办法使用命令行重新创建此密钥?也许通过编写应用程序来生成密钥?我没有运气使用 .NET 文档中的 RijndaelManaged 引用来解决这个问题。
使用对称提供程序,RijndaelManaged。
实际上,任何基于当前密钥还原 RijndaelManaged 密钥的解决方案都可能很有用。没有用户界面或手动流程/点击!
在通读了一段时间的企业库源代码后,我想出了一种方法来做到这一点。这只是POC代码,没有检查等。
假设:
c:keyengagementproviderexport.txt
是从工作服务器导出的密钥c:keyengagementprovider.key
是新创建的 Rijndael为新计算机管理的密钥exportKeyPw
是用于保护导出密钥
的密码- 添加了
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
引用 - 添加了
System.Security.dll
引用 ProtectedKey
是Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.ProtectedKey类KeyManager
是Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.KeyManager静态类,它在这里完成所有工作!
POC:
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
using System.Security;
using System.IO;
string exportKeyFile = @"C:keyEngagementProviderExport.txt";
string exportKeyPw = "p@ssword";
string saveKeyFile = @"C:keyEngagementProvider.key";
ProtectedKey NewServerKey;
using (FileStream fs = File.OpenRead(exportKeyFile))
{
NewServerKey = KeyManager.RestoreKey(fs, exportKeyPw, System.Security.Cryptography.DataProtectionScope.LocalMachine);
}
using (FileStream ofs = File.OpenWrite(saveKeyFile))
{
KeyManager.Write(ofs, NewServerKey);
}