不使用 EntLibConfig.exe 恢复 RijndaelManaged 密钥

Restore RijndaelManaged key without using EntLibConfig.exe

我正在使用一个较旧的应用程序,它使用企业库加密应用程序块进行数据加密。

目前,我们必须手动 运行 EntLibConfig.exe(一个 ui 应用程序),导入从另一台机器导出的密钥,然后恢复密钥新服务器。

这个手动过程需要取消。有没有办法可以使用命令行重新创建此密钥?也许通过编写应用程序来生成密钥?我没有运气使用 .NET 文档中的 RijndaelManaged 引用解决这个问题。

使用对称提供程序,RijndaelManaged。

实际上,任何基于当前密钥恢复 RijndaelManaged 密钥的解决方案都可能有用。没有用户界面或手册 processes/clicks!

在阅读企业库源代码一段时间后,我想出了一个方法来做到这一点。这只是 POC 代码,没有检查等

假设:

  • c:\key\engagementproviderexport.txt 是从工作服务器导出的密钥
  • c:\key\engagementprovider.key 是为新机器新建的 RijndaelManaged key
  • exportKeyPw是用来保护导出密钥的密码
  • Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll 添加参考
  • System.Security.dll 添加参考
  • ProtectedKey 是 Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.ProtectedKey class
  • KeyManager 是 Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.KeyManager 静态的 class,它在这里完成所有工作!

POC:

using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
using System.Security;
using System.IO;

string exportKeyFile = @"C:\key\EngagementProviderExport.txt";
string exportKeyPw = "p@ssword";
string saveKeyFile = @"C:\key\EngagementProvider.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);
}