Admin Admin
عدد المساهمات : 234 تاريخ التسجيل : 30/10/2012
| موضوع: تشفير Connection String الجمعة نوفمبر 02, 2012 1:50 am | |
| مقدمة : من الأشياء التي وجدناها بكثرة في المقالات وينصح بها دائما هي كتابة الConnection Strting داخل ملف الـweb.config وما لذلك من فوائد عديدة من حيث سهولة التعديل على المشروع لاحقاً اذا تم تغيير اسم الملقم أو اذا تم نشره الى عميل اخر وكذلك سخولة ادارة الكود و ضمان توحد الاتصال لكل صفحات المشروع ولكن هذه الفكرة التي دأب الكثير منا على القيام بها تحوي مخاطرة كبيرة وهي سرية نص الاتصال Connection String الذي يحمل نص لبيانات الاتصال كاملة من اسم ملقم قاعدة البيانات الى كلمة المرور ؟؟؟ مما يشكل خطراً كبيراً فكل من بامكانه الوصول الى هذا الملف وفتحه عن طريق المذكرة فسيصبح مستوى السرية للتطبيق أقرب للصفر . ولذا وجب تشفير نص الاتصال للوصول الى مستوى سرية أعلى لتطبيقاتنا ولا نخاف من نشرها للزبون التالي وهذا هو الشي الذي سنقوم باحتوائه في هذا المقال.
حفظ الـConnection String من غير تشفير : لنلقي نظرة على شكل ملف الweb.config من دون أن نقوم بأي تشفير فانها ستكون بالشكل : - الكود:
-
[b][font=Times New Roman]< configuration > < appSettings > < add key = "ConnectionString" value = "server = localhost;uid = sa;pwd =;database = DBPerson" / > < /appSettings > < /configuration >[/font][/b] Connection String وهذه هي أسوأ طريقة قد نكتب بها الـ حيث أنه بكل سهولة يمكننا رؤية اسم المستخدم وكلمة المرور (userid , passwordلقاعدة البيانات ( وبالتالي فان أي شخص بامكانه الاتصال بقاعدة البيانات والحصول على ما يريد . فلنلقي نظرة على طريقة أفضل من السابقة :
- الكود:
-
[b][font=Times New Roman]< configuration > < appSettings > < add key = "DBConnStr" value = "server = (local);Integrated Security = SSPI;database = northwind"/ > < /appSettings > < /configuration >[/font][/b] كما تلاحظ فان هذا الإتصال أكثر سرية من سابقه لعدم احتوائه على اسم المستخدم ولا كلمة المرور ولكنه لا يزال يحوي اسم قاعدة البينات !!!!
الان لنلقي نظرة على استخدام التشفير لكيلا يقوم أي مخترق بالوصول الى بيناتي السرية التي من الواجب علي توفير أعلى مستوى حماية لها . في البداية سنقوم بكتابة دالة بسيطة نقوم بتمريرالـConnection String لها بدون تشفير كمعامل (parameter) وتقوم هذه الدالة بارجاع القيمة مشفرة وليكن اسمها EncryptConnectionString لتكون بالشكل التالي : - الكود:
-
[b][font=Times New Roman]// This method is used to encrypt the connection string private string EncryptConnectionString(string connectionString) { Byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes(connectionString); string encryptedConnectionString = Convert.ToBase64String(b); return encryptedConnectionString; }[/font][/b] شرح الكود : 1- تقوم الدالة بأخذ الـConnectionString وتعيده مشفراً . 2- قمنا باستخدام ASCIIEncoding التي تقوم باخذ البايتات لنص الاتصال وتقوم بحفظه في المصفوفة b . 3- قمنا بتشفير نص الاتصال عن طريق الدالة ToBase64String الموجودة ضمن الفئة convert وحفظ ناتج التشفير في المتغير النصي : encryptedConnectionString 4- تقوم الدالة بارجاع النص مشفراً . واذ1 أحببت طباعة النص بعد التشفير عن طريق Response.Write(encryptedConnectionString) فانك ستحصل على النتيجة التالية : ZGF0YSBzb3VyY2U9Llx2c2RvdG5ldDtpbml0aWFsIA0KICAgY2F0YWx وهي نص الاتصال مشفراً ومن ثم نقوم بنسخه ولصقه داخل الweb.config ليصبح شك الملف بالشكل التالي : - الكود:
-
[b][font=Times New Roman]< appSettings > < add key = "ConnectionString" value = "ZGF0YSBzb3VyY2U9Llx2c2RvdG5ldDtpbml0aWFsIA0KICAgY2F"/ > < /appSettings >[/font][/b] وبالتالي تحقق لنا المطلوب وهو عدم قدرة أي متطفل على فهم نص الاتصال . قد يتبادر الى ذهنك سؤال وهو : ولكن كيف ستقوم المكونات SqlConnection مثلاً بفهم هذا الرمز المشفر ؟؟؟!!! الاجابة هي أن نقوم ببساطة بكتابة دالة بسيطة أخرى مثل سابقتها تقوم بعكس وظيفتها وهي فك التشفير ولتكن DecryptConnectionString والتي ستكون بالشكل : - الكود:
-
[b][font=Times New Roman]// This method is used to decrypt the connection string private string DecryptConnectionString() { Byte[] b = Convert.FromBase64String(ConfigurationSettings.AppSettings["ConnectionString"]); string decryptedConnectionString = System.Text.ASCIIEncoding.ASCII.GetString(b); return decryptedConnectionString; }[/font][/b] شرح الكود : 1- في البدأ تقوم الدالة بأخذ القيمة المشفرة من خلال ملف الweb.config . 2- نقوم بفك تشفير النص المأخوذ باستخدام نفس الدالة التي استخدمناها في التشفير ونقوم بارجاع القيمة بعد التشفير . قد يدور في ذهنك ان أي شخص قد قرأ هذه المقالة فك تشفير التطبيق الخاص بي !!! ولكن لا اجزع فبامكانك اختيار الطريقة الأمثل لك في التشفير فالبعض قد يستخدم التشفير الى النظام الستعشري Hexadecimal على مستوى الحرف لذا فالخيار يعود اليك ولكن الطريقة التي قمنا باستخدمها هنا هي واحدة من أبسط خوارزميات التشفير التي يمكن تطبيقها . | |
|