[ Log On ]

ConnectionStrings enkripcija

Posted by frennky on 10/31/2011 @ 11:48 PM in Web Development

S obzirom da se celokupna konfiguarcija ASP.NET aplikacije nalazi u čistom obliku u web.config fajlu, uključujući i connection stringove, ovo svakako predstavlja sigurnosnu pretnju.

Na svu sreću .Net poseduje mehanizme kojima se ova pretnja lako može otkloniti. Postoje provajderi enkripcije koji mogu da izvrše šifromanje i dešifrovanje određenih web.config sekcija.

U primeru koji sledi, prikazana je upotreba RSAProtectedConfigurationProvider-a za šifrovanje i dešifrovanje connectionStrings sekcije.

Napravićemo novu ASP.NET MVC aplikaciju i izmeniti Index akciju HomeController-a tako da sadrži sledeći kod:

public ActionResult Index()
{
    ViewBag.ConnectionStringsSection = GetConnectionStringsSection();
    return View();
}

Zatim ćemo u HomeController-u napraviti privatnu metodu GetConnectionStringsSection:

private string GetConnectionStringsSection()
{
    var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    var xml = XDocument.Load(config.FilePath);
    var connectionStringsSection = xml.Descendants().SingleOrDefault(e => e.Name == "connectionStrings");
    return connectionStringsSection != null ? connectionStringsSection.ToString() : string.Empty;
}

A potom ćemo promeniti Index view tako da izgleda ovako:

<div>
    <h2>Connection string encryption example</h2>
    <p>@Html.ActionLink("Encrypt", "Encrypt")</p>
    <p>@Html.ActionLink("Decrypt", "Decrypt")</p>
</div>
<div>
    <h3>Connection Strings section</h3>
    <p>@ViewBag.ConnectionStringsSection</p>
</div>

Enkripcija

Za enkripciju connectionStrings sekcije napravićemo Encryption akciju u HomeController-u:

public ActionResult Encrypt()
{
    EncryptConnectionStrings();
    return RedirectToAction("Index");
}

Suština je naravno u metodi EncryptConnectionStrings koja izgleda ovako:

public void EncryptConnectionStrings()
{
    var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    var section = config.ConnectionStrings;
    if (section.SectionInformation.IsProtected) return;

    section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
    config.Save();
}

Dekripcija

Slično enkripciji, za dekripciju connectionStrings sekcije napravićemo Decryption akciju u HomeController-u:

public ActionResult Decrypt()
{
    DecryptConnectionStrings();
    return RedirectToAction("Index");
}

I naravno, suština je u metodi DecryptConnectionStrings koja izgleda ovako:

private string GetConnectionStringsSection()
{
    var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    var xml = XDocument.Load(config.FilePath);
    var connectionStringsSection = xml.Descendants().SingleOrDefault(e => e.Name == "connectionStrings");
    return connectionStringsSection != null ? connectionStringsSection.ToString() : string.Empty;
}

Treba imati na umu da su enkripcija i dekripcija skupe operacije, kao i da svaka izmena web.config fajla dovodi do restarta aplikacije.

Pored ovakvog, programskog načina enkripcije i dekripcije, moguće je ovo postići i pomoću aspnet_regiis.exe konzole. Više informacija o tome možete naći na MSDN-u.