Где я могу сохранить настройки своей роли Azure, которые не должны храниться в виде обычного текста?
Похоже, стандартный способ хранения настроек ролей Azure находится под <ConfigurationSettings>
тег в файле.cscfg. Выглядит удобно, но файл никак не зашифрован - это XML, который загружается на портал Azure в виде обычного текста, сохраняется в виде обычного текста и может быть отредактирован в любое время.
В моем приложении мне понадобятся настройки, которые не должны храниться в виде простого текста - например, пароль для моей базы данных SQL Azure. Я бы предпочел не иметь открытого XML-файла с этим паролем. Как мне сохранить такие настройки роли?
2 ответа
Типичный способ сделать это локально - использовать DPAPI на одной машине. Конечно, это имеет проблемы на веб-ферме. Чтобы обойти это, вы можете поделиться одним ключом на каждой машине и зашифровать. Самый простой способ сделать это - использовать шифрование на основе сертификатов.
Ничего не имею против постов 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, они точно об этом написали!
- Защита строки подключения в Windows Azure: часть 1 ( оригинал).
- Защита строки подключения в Windows Azure: часть 2 ( оригинал).
- Защита строки подключения в Windows Azure: часть 3 ( оригинал).
также, предыдущие посты на http://blogs.msdn.com/b/sqlazure/archive/tags/security/