رمزنگاری و رمزگشایی رشته اتصال(Connection String) در ASP.NET

پنجشنبه 19 آذر 1394

در این مقاله می خواهیم نشان دهیم که چگونه می توان با استفاده از کد، و به صورت یک خط فرمان در Comand line، رشته اتصال را رمزنگاری کنیم. در این روش می توان از aspnet_regiis.exe استفاده کرده و مجموعه ای از دستورات را برای انجام رمزنگاری و رمزگشایی در نظر بگیریم.

رمزنگاری و رمزگشایی رشته اتصال(Connection String) در ASP.NET

اما چرا باید رشته اتصال و دیگر اطلاعات حساس را رمزنگاری کنیم؟ دلایل بسیاری وجود دارند که نیاز به رمزنگاری اطلاعات حساس در Web.config را نشان می دهند. برای مثال فرض کنید کلاینت(مشتری) شما از یک سرور میزبانی(hosting) مشترک استفاده می کند، اگر سرور به خطر بیفتد، هکر به راحتی می تواند به فایل های سیستمی دسترسی داشته باشد، همچنین می تواند به راحتی اطلاعات موجود در Web.config را استفاده کرده و به پایگاه داده شما دسترسی داشته باشد یا اگر شما پسورد ایمیل ها را در آنجا داشته باشید هکر می تواند از آن برای اهداف مخرب استفاده کند.

 روش استفاده از کد ایده خوبی برای رمزنگاری داده های حساس شماست، البته با این کار نمی توان تضمین کرد که سایت شما را از هر نوع حمله ای در امان است، اما این روش یک لایه اضافی امنیتی ایجاد می کند که کار هکرها را دشوار می سازد. همچنین در روش کدنویسی انعطاف پذیری از دست می رود اما این روش بسیار تمیزتر و منعطف تر است.

رمزنگاری یک نود XML

فرض کنید ما یک رشته اتصال مانند زیر داریم:

<connectionStrings>
    <add name="OurDb"
         connectionString="Data Source=(LocalDB)\MSSQLLocalDB;
         AttachDbFilename=|DataDirectory|\OurDb.mdf;
         Initial Catalog=OurDb;
         Integrated Security=True" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>

برای رمزنگاری آن از کد زیر استفاده می کنیم:

 public static void EncryptConnString()
 {
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
     ConfigurationSection section = config.GetSection("connectionStrings");

     if (!section.SectionInformation.IsProtected)
     {
         section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
         config.Save();
     }
 }

ابتدا، المان ریشه(root) را در Web.config خود با استفاده از کلاس مدیریت تنظیمات WebConfigurationManager در نظر بگیرید، سپس از آن متغیر و متد GetSection استفاده کرده و کنترل می کنیم که ببینیم گره ما از قبل رمزنگاری شده یا خیر اگر نه که پیش می رویم و از متغیر section استفاده می کنیم و متد ProtectSection را فراخوانی کرده و از RsaProtectedConfigurationProvider برای رمزنگاری section استفاده می کنیم و سپس Web.config خود را نجات می دهیم.

اگر بخواهیم ایمیل خود را رمزنگاری کنیم همین روند مشابه را به کار می گیریم، برای رمزنگاری نود smtp با یک XML به صورت زیر عمل می کنیم:

<mailSettings>
      <smtp from="info@Site.com">
        <network
          host="mail.Site.com"
          port="25"
          userName="info@site.com"
          password="password" />
      </smtp>
  </mailSettings>

 

و از کد استفاده می کنیم:

public static void EncryptMailSettings()
 {
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
     ConfigurationSection section = config.GetSection("system.net/mailSettings/smtp");

     if (!section.SectionInformation.IsProtected)
     {
         section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
         config.Save();
     }
 }

توجه داشته باشید که باید یک بخش مشخص را با ( / ) slash مانند زیر drill down کنیم:

"system.net/mailSettings/smtp"

 

رمزگشایی یک گره XML

رمزگشایی نود XML شبیه به رمزنگاری آن است و تنها تفاوت آن این است که در رمزنگاری باید کنترل کنیم که آیا نود رمزنگاری شده یا نه ، اما حالا کنترل می کنیم که اگر نود XML رمزنگاری شده باشد آنگاه متد UnprotectSection را فراخوانی می کنیم تا گره XML را رمزگشایی کند، کد نهایی باید چیزی شبیه به کد زیر شود:

public static void DecryptConnString()
 {
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
     ConfigurationSection section = config.GetSection("connectionStrings");
     if (section.SectionInformation.IsProtected)
     {
         section.SectionInformation.UnprotectSection();
         config.Save();
     }
 }

همین روند برای رمزگشایی بخش ایمیل تکرار می شود:

public static void DecryptMailSettings()
 {
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
     ConfigurationSection section = config.GetSection("system.net/mailSettings/smtp");
     if (section.SectionInformation.IsProtected)
     {
         section.SectionInformation.UnprotectSection();
         config.Save();
     }
 }

 

فراخوانی متد موردنظر برای رمزنگاری و رمزگشایی نود XML

حالا می توانیم متدی در Global.asax و در رخداد ( )Application_Start برای رمزنگاری فراخوانی کنیم و یا نودهای XML حساس را رمزگشایی کنیم:

protected void Application_Start()
 {
     EncryptDecryptWebConfig.EncryptConnString();
     EncryptDecryptWebConfig.EncryptMailSettings();

     //EncryptDecryptWebConfig.DecryptConnString();
     //EncryptDecryptWebConfig.DecryptMailSettings();
 }

 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید