看起来存储 Azure 角色设置的标准方法是在<ConfigurationSettings>
.cscfg 文件中的标记下。看起来很方便,但文件没有以任何方式加密 - 它是一个 XML,以纯文本形式上传到 Azure 门户,并以纯文本形式存储,可以随时编辑。
在我的应用程序中,我需要不应该以纯文本形式存储的设置——例如我的 SQL Azure 数据库的密码。我宁愿没有带有该密码的纯文本 XML 文件。如何存储此类角色设置?
看起来存储 Azure 角色设置的标准方法是在<ConfigurationSettings>
.cscfg 文件中的标记下。看起来很方便,但文件没有以任何方式加密 - 它是一个 XML,以纯文本形式上传到 Azure 门户,并以纯文本形式存储,可以随时编辑。
在我的应用程序中,我需要不应该以纯文本形式存储的设置——例如我的 SQL Azure 数据库的密码。我宁愿没有带有该密码的纯文本 XML 文件。如何存储此类角色设置?
在本地执行此操作的典型方法是在单台计算机上使用 DPAPI。当然,这在网络场上存在问题。要解决此问题,您可以在每台机器上共享一个密钥并进行加密。最简单的方法是使用基于证书的加密。
没有反对 Michael 引用的 SQL Azure 帖子,但这必须是有史以来最长的系列告诉您使用PKCS12 配置提供程序。使用该提供程序的唯一原因是它与 ASP.NET 的内置工具结合使用,该工具可以自动从 appSettings 读取。它对需要更改的 ServiceConfiguration 没有帮助。
如果您只想安全地保护设置(通常在 ServiceConfig 中)并且您不介意编写实用程序类来执行此操作,那么您可以将这两个函数与上传到 Windows Azure 的任何证书(带有私钥)一起使用。这正是服务配置中远程访问密码的加密方式。
加密:
var passwordBytes = UTF8Encoding.UTF8.GetBytes("p@ssw0rd");
var contentInfo = new ContentInfo(passwordBytes);
var thumb = "F49E41878B6D63A8DD6B3650030C1A06DEBB5E77";
var env = new EnvelopedCms(contentInfo);
X509Store store = null;
try
{
store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var cert = store.Certificates.Cast<X509Certificate2>().Where (xc => xc.Thumbprint == thumb).Single();
env.Encrypt(new CmsRecipient(cert));
Convert.ToBase64String(env.Encode()).Dump();
}
finally
{
if (store != null)
store.Close();
}
解密:
var thumb = "F49E41878B6D63A8DD6B3650030C1A06DEBB5E77";
var cipherText = "MIIBrwYJKoZIhvcNAQcDoIIBoDCCAZwCAQAxggFgMIIBXAIBADBEMDAxLjAsBgNVBAMTJWR1bm5yeTd0YWIucmVkbW9uZC5jb3JwLm1pY3Jvc29mdC5jb20CECNRAOTmySOQTA2HuEpAcD4wDQYJKoZIhvcNAQEBBQAEggEAkIxJNnCb1nkZe3Gk2zQO8JQn2hOYM9+O9yx1eprTn7dCwjIlYulUMIYwFCMDI7TiYCXG7cET2IP/ooNBPYwxzAvEL5dUVIMK9EDE0jyRP3sGPGiSvG0MW8+xZuQx4wMGNSwm2lVW1ReVRGEpTeTcUFSBCPvXsULpbqCqXtSTgjsHngxgOKjmrWBIdrxCDxtfzvNPgSQ2AVqLTRKgFTN9RHUwJJ2zhGW+F+dBfxai3nlr7HN7JKiIdlNA0UjCd/kSIZqNfPlvd2V58RBMpkW+PEp3vpBa/8D/fhU3Qg/XBNXhroES7aVDB5E16QYO6KgPdXMCpLcQ4e9t1UhokEwUizAzBgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECEImLeoQJeVkgBCQ94ZxmHnVkBWrID+S4PEd";
X509Store store = null;
try
{
store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var cert = store.Certificates.Cast<X509Certificate2>().Where (xc => xc.Thumbprint == thumb).Single();
var bytes = Convert.FromBase64String(cipherText);
var env = new EnvelopedCms();
env.Decode(bytes);
env.Decrypt();
Encoding.UTF8.GetString(env.ContentInfo.Content).Dump();
}
finally
{
if (store != null)
store.Close();
}
查看 SQL Azure 博客,他们的博客正是关于这一点的!
此外,以前的帖子 http://blogs.msdn.com/b/sqlazure/archive/tags/security/