عرض مشاركة واحدة
  #1 (permalink)  
قديم 2008-11-13, 11:40 PM
IM.com IM.com غير متواجد حالياً
:: إدارة تقنية المعلومات ::
 
تاريخ التسجيل: 01-11-2008
المشاركات: 145
افتراضي كيف تشفر و تفك تشفير ملف الـ Web.Config باستخدام السي#

بسم الله الرحمن الرحيم ...

من الأمور المهمة في لغة ASP.NET 2.0 ملف الـ Web.Config و الذي يقوم بتخزين التعريفات المهمة لتطبيق الويب.

و من أشهر و أهم المعلومات التي تخزن فيه هي الـ ConnectionString و التي يخزن بداخلها اسم المستخدم و كلمة مرور قواعد البيانات و عنوان سيفر قاعدة البيانات. كما أنه من الأمور المهمة التي تخزن في ملف الـ Web.Config معلومات الـ SMTP Server.

و بالرغم من أن الـ ASP.NET يتكفل بحماية ملف الـ Web.Config و لكن ماذا لو نسينا أن تغلق وصول الـ anonymous للـ FTP مثلاً؟!! سوف يصل بشكل مباشر إلى الـ Web.Config و يقرأه عن طريق الـ Notepad و سوف يجد جميع معلوماتنا الفيمة بداخله.

لذلك كان من أفضل التطبيقات في حماية ملف Web.Config هو تشفير الأجزاء المهمه.



سوف ننشئ الـ Methods التالية لتشفير و فك تشفير هذه الاجزاء بلغة السي#.

كود PHP:
private void ProtectSection(string sectionNamestring provider)
    {   
        
Configuration config 
            
WebConfigurationManager.
                
OpenWebConfiguration(Request.ApplicationPath);  

        
ConfigurationSection section =
                     
config.GetSection(sectionName); 

        if (
section != null &&
                  !
section.SectionInformation.IsProtected)
        {
            
section.SectionInformation.ProtectSection(provider);
            
config.Save();
        }
    } 

    private 
void UnProtectSection(string sectionName)
    {
        
Configuration config =
            
WebConfigurationManager.
                
OpenWebConfiguration(Request.ApplicationPath); 

        
ConfigurationSection section =
                  
config.GetSection(sectionName); 

        if (
section != null &&
              
section.SectionInformation.IsProtected)
        {
            
section.SectionInformation.UnprotectSection();
            
config.Save();
        }
    } 
في الدالة ProtectSection تأخذ هذه الدالة قيمتين هي sectionName و provider.

الـ sectionName تأخذ القسم المراد تشفيره مثلاً "appSettings" و المتغير الثاني provider يأخذ طريقة التشفير و يوجد عندنا طريقتين هما:
The Windows Data Protection API (DPAPI) Provider(DataProtectionConfigurationProvider)
RSA Protected Configuration Provider(RSAProtectedConfigurationProvider)

فالنوع الأول يقوم بالتشفير بناءً على مفتاح الجهازmachine key و لذلك عند نقل الكود إلى جهاز آخر لن يصبح التشفير فعال.

و النوع الآخر يستخدم مفتاح الـ RSA و هنا سوف استخدم النوع الأول .

الآن لنضع 2 Buttons في صفحة الـ ASP.NET. و نكتب بداخلها الكود التالي للتشفير:

كود PHP:
ProtectSection("appSettings","DataProtectionConfigurationProvider"); 
و لفك التشفير:

كود PHP:
UnProtectSection("appSettings"); 
فلو فرضنا انه يوجد لدينا هذا الجزء في ملف الـ Web.Config:

و الذي يحتوي على hسم المستخدم و كلمة المرور.

كود PHP:
<?xml version="1.0"?> 


<configuration>
  <appSettings>
    <add key="userName" value="myUser" />
    <add key="password" value="myPass" />
  </appSettings> 
 <system.web>
و الآن و بعد التشفير سوف يكون شكل الملف:

كود PHP:
<?xml version="1.0"?> 


<configuration>
  <appSettings configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
      <CipherData>
        <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAeqpnrspy5EWNYcNck7YWEgQAAAACAAAAAAADZgAAqAAAABAAAAA12J8TxeAXP5oTR3FRwzTUAAAAAASAAACgAAAAEAAAAD35nzw5BzWwX4kb/ba0k+/oAAAAWrmf/KLUkGMXbc24Un8GXU/q3BLDnuzemCXU2ooqlXVVRCJdOSxU/A34EajaAmPZH/hJY1lDHoqSL2yv69R7Ld2ebIMyA94+gpGJ+5BttQhaUrD8yi19D7j29JOtX1gZ+6dkLVLANI4zU4i46orH7Syy+DOdwaeJ5ZNrj60hu7bSzwMgq5QEKXJ0G/D8XwJY7LD2pdpzls+P7fheqYH5OXFevJKoJWUco+isMdrppE5zPnIF9zD2pmLFU6bUH0maBDjbBnP3QCu+9R3SlQ5ELVQAKx+ThCj3xBvh5P1cUBMaaFZtEaX3EBQAAABl+Fga/ikPCJAGBh1NQNICVKh3Yg==</CipherValue>
      </CipherData>
    </EncryptedData>
  </appSettings> 

 <system.web>
و لابد من العلم أن الأجزاء التالية لا يمكن تشفيرها في الـ Web.Config:
processModel
runtime
mscorlib
startup
system.runtime.remoting
configProtectedData
satelliteassemblies
cryptographySettings
cryptoNameMapping
cryptoClasses

طبعاً الجزء الأجمل أنه عندما تريد قراءة قيمة معينة في ملف الـ Web.Config مثلاً الـ connectionString لن تقوم بفك التشفير و لكن الـ ASP.NET سوف يقوم به نيابة عنك و لن تضطر لتغيير الكود.

اتمنى للجميع الاستفاده من الموضوع
رد مع اقتباس