4 Nisan 2015

Sql Bağlantımızı App.config içerisinde şifrelemek ve çözümlemek.



Sql bağlantılarının güvenli bir şekilde saklanması için internet üzerinde biraz araştırma yapmamla birlikte bu konu hakkında Türkçe kaynağın eksikliği dikkatimi çekti. Bende bu konu hakkında bir deneme yazmak istedim.
                Programlarımızı yazarken sql bağlantı cümlemizi configuration dosyası içerisine çoğumuz kaydediyoruzdur. Fakat configuration dosyası sıradan bir xml dosyası olduğu için güvenlik anlamında hiçbir katkısı yoktur.  Notepad  kullanarak dahi app.config dosyasının içerisindeki ayarları ve bağlantıları görebiliyoruz.  Burada dikkat ederseniz sql kullanıcı adınız, şifreniz ve server bilgileri de bulunabilir. Kötü niyetli kişiler bu tür bilgileri kullanarak bilgi hırsızlığı yapabilir ya da bilgileri değiştirip silebilirler. Bu durumla karşılaşmamak için  size birkaç öneride bulunacağım;

  • ·         Sql admin kullanıcı adı şifremizi kullanarak kesinlikle bağlantımızı oluşturmayalım. Bu tür durumlar için yetkilerini minimum düzeyde olabilecek ihtiyaçlarımızı karşılayabilecek bir sql schema(kullanıcı) oluşturmamız bence en gerekli ve en önemli  önlemdir.

  • ·         İkincisi ise configuration dosyamızda bağlantı bilgilerimizi şifreleyerek de önlemlerimizi arttırabiliriz.

Ben ikinci durum için basit bir uygulama göstereceğim. Daha ilerisi için internette araştırma yapabilir ve sizde paylaşarak Türkçe kaynakların artmasında yardımcı olabilirsiniz.
Burada anlattığım yöntemi internetten bulduğum için linkini vermek istiyorum.Ben üzerinde çok az değişiklik yaptım.
Amacımız: configuration dosyası içerisinde <connectionStrings> tagı arasındaki bağlantıyı şifrelemek.
Programımızı build ettiğimizde ya da çalıştırdığımızda “Debug”  klasörü altında projenin adıyla bir
Config dosyası oluşturmaktadır. Mesela benim proje ismim “EncryptConfiguration” olduğu için
“EncryptConfiguration.exe.config”  türünde ayarların kaydedildiği bir dosya türü var. Bu dosya türünde eğer bağlantı cümlenizi oluşturduysanız notepad ile açtığınızda görmeniz gerekir. Ben kendi bağlantı cümlemi gösteriyorum.

<connectionStrings>
    <add name="LinkSaverEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=ONUR-YAZILIM;initial catalog=LinkSaver;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
 Önce bu yapıda bir form oluşturalım.
Burada ek olarak "OpenFileDialog" oluşturuldu.
Ve kullanılacak olan kütüphaneler şunlardır.

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Configuration;=>"References" üzerinden eklemeniz gerekebilir.






 



 Şimdi Programda kullanılacak metodları gösterelim.
/////////////////////////////////////////////////////
Kullanıdığımız ana metod bu.
 public static void BaglantiCumlesiniSifrele(bool sifrelensinmi, string dosyaAdi)
        {
            Configuration configuration = null;
            try
            {
                //Dosyayı açıp connectionString bölgesini arıyoruz.
                configuration = ConfigurationManager.OpenExeConfiguration(dosyaAdi);
                ConnectionStringsSection configSection = configuration.GetSection("connectionStrings") as ConnectionStringsSection;
                if ((!(configSection.ElementInformation.IsLocked)) && (!(configSection.SectionInformation.IsLocked)))
                {
                    if (sifrelensinmi && !configSection.SectionInformation.IsProtected)
                    {
                        //Bu satır dosyayı şifreleyecek
                        configSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                    }

                    else if (!sifrelensinmi && configSection.SectionInformation.IsProtected)//encrypt is true so encrypt
                    {
                        //Bu satır dosyayı çözümleyecek
                        configSection.SectionInformation.UnprotectSection();
                    }
                    //Dosyayı Kaydedecek

                    configuration.Save();
                    Process.Start("notepad.exe", configuration.FilePath);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
 BURADA HER İŞLEMİN SIRASIYLA METODUNU TANIMLADIK
private void DosyayiSifrele()
        {
            if (File.Exists(FileName))
            {
                BaglantiCumlesiniSifrele(true, FileName);
            }
            else
            {
                MessageBox.Show("Dosya bulunamadı");
            }
        }
////////////////////////////////////////////////////////
        private void DosyayiCozumle()
        {
            if (File.Exists(FileName))
            {
                BaglantiCumlesiniSifrele(false, FileName);
            }
            else
            {
                MessageBox.Show("Dosya bulunamadı");
            }
        }
 //////////////////////////////////////////////////////////////////////////////////////////////////////
  private void OpenFile()
        {
            openFileDialog1.Filter = ".Net Executables|*.exe";
            openFileDialog1.FileName = "";
            openFileDialog1.ShowDialog();
            FileName = openFileDialog1.FileName;
            txtSifreleme.Text = FileName;
        }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
BURADA BUTONLARA GEREKLİ İŞLEVLERİ YÜKLEDİK.

private void btnAc_Click(object sender, EventArgs e)
        {
            OpenFile();
        }

        private void btnEncrypt_Click(object sender, EventArgs e)
        {
            DosyayiSifrele();
        }

        private void btnDecrypt_Click(object sender, EventArgs e)
        {
            DosyayiCozumle();
        }
 /////////////////////////////////////////////////////////////////////////////////////////////////////
ARTIK PROGRAM ÇALIŞMAYA HAZIR.
TEK YAPMAMIZ GEREKEN UYGULANACAK PROGRAMI SEÇMEK BU KADAR.
BUNUN İÇİN DEBUG İÇERİSİNDE PROGRAMI SEÇİP ŞİFRELE DEMENİZ YETERLİ.

ŞİFRELEDİKTEN SONRA CONNECTION STRIN FORMATIMIZ ŞU ŞEKİLDE OLUR.

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
      <CipherData>
        <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAT/YbI8lzDkSbLPDGsYZ29QQAAAACAAAAAAAQZgAAAAEAACAAAADTZU6ibjz9C9V4xAJA+WgGcTh0wUnBi5V2JtD0m8C62AAAAAAOgAAAAAIAACAAAABz9YWZehg5NQyHtsvjVA/V47lcboiwT1sUn/FJsIOpojADAAD29m1aDf/FTnPtSpjOdYvQIQgV+7edjRv6ajlIbwgr98TK82QgbMmhrljE+EyPkYbWcgR5LhA0LHBmS0jGMTwC2RCvVWuY0nC+cq+ci1MN1d8HxF4FOh/3SuiGS3znREKaUjzlmTXivR1cxe79s9qofykTkO67z7LyXLliDIzD6dqx/Ijb/RgeRt5BOKP4l7Lk1ZZtu1hHbZ/h8EzTEdkwGiYumAy0X77IpMWAQq+L4wZmD6YMfmZmSdZxWWN2fnW4UftWZ0Da6O+TbF71lilMRlUVd9YIlmm+88sM98n9Ncsu8TfCXQzXMaVK0ToEI4EBVDYnMrYtN4qbza8ILGfZ0YCKjxrAzIEyaS3WeSlCeL6Vu9j6YscdTbR9ot8rS1PvIRFAK3MvjXJuuO+UtPqr6DJp/FtcGPbyxz2mqFFuVzlaloMax3v2GwTLTaZ0Vc36/ezkb9zIiJFXH/BXls+tTdi8h/M3tPaLnOQKRdQPNc+D93uO1Y4aTtatTyR9dHtp1oP7Tc7nWd64fU/uPlJRFyV0YN8kQlkoQEah/N6PZbsd5Xghe3tYvs7/MnQD6kAjhxJCqhZJEqqYljv2Nyz+YScz6wk8ZTXjLJSTJEW+O8iEL+4HaDxwSHoJRIwDQPU6wOe5e5ejUKSbYDhGNG40NmeftKBDh5l4rlkIoSRbDxecB1JITIHkSqKP5E4NyrYTjwUxPpSCkj/zdN7M5uh5H3C4KaAjzkVRIMyPf5dRr8kyc8WyHMQD/BbKCQ2TCZoxAjz7r2cc0UWX4zkWcvtdl19Qz07Iiu1ecUHtbmZJIAr2OOJ9W1HS5YVSuRdHEX5vB9VkAYv4OlBdVmv0oldi9r/fPMovRb2ys1PVeJRTWHl0Y/GuFkRN73TMtfntVTxevqVGcslTjxw9bY1X073wRTMvmjoRj9Oxn080f3j3w3hD5G47+aAurpXbm6haAYjvXWcHhVkuUN0NBsRMjoBg77v5HwyIz62b1r21HfhhX+pdOCrFKUChAx3mZUl2PFZau/XFGB5s1f3dn52ws9cphRjDg46CkMfSRbNGhWxE2upzqyFisG4iwggZJlm6Z+xAAAAAG6Cnf/IhB/i70VDnoDQf21iOtG5b+bUrM7UDFZQbCscvS6009P75/dfgLR1kJ6XJtYqdLSoORx/9zsVHvxdjqQ==</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>


Ek Dosya:https://drive.google.com/file/d/0B3kuxcwuextldlVTY3FkaWV6bU0/view?usp=sharing