ما هي أفضل طريقة لتخزين سلسلة الاتصال في ملفات .NET DLL؟

StackOverflow https://stackoverflow.com/questions/6113

سؤال

يحتوي التطبيق الذي يقوم فريقي على تطويره حاليًا على ملف DLL يُستخدم لإجراء جميع عمليات الوصول إلى قاعدة البيانات.لا يمكن للتطبيق استخدام اتصال موثوق لأن قاعدة البيانات موجودة خلف جدار حماية وخادم المجال ليس كذلك.لذلك يبدو أن سلسلة الاتصال تحتاج إلى اسم مستخدم وكلمة مرور لقاعدة البيانات.يحتوي ملف DLL حاليًا على سلسلة اتصال قاعدة البيانات مشفرة بشكل ثابت، لكنني لا أريد القيام بذلك عندما نبدأ التشغيل حيث يمكن تفكيك التجميع وسيكون اسم المستخدم وكلمة المرور موجودين هناك في العلن.

أحد المتطلبات هو ضرورة تغيير كلمة المرور مرة كل بضعة أشهر، لذلك سنحتاج إلى تعميم ذلك على قاعدة المستخدمين الداخلية لدينا.

هل هناك طريقة لتخزين كلمة المرور المشفرة بحيث يمكننا توزيعها بسهولة على قاعدة المستخدمين بأكملها دون تخزينها في التجميع؟

تحديث:شكرا لكل من أجاب.سأحاول الرد على بعض الأسئلة التي ترد علي..يتم استخدام بيانات DLL بواسطة كل من ASP.NET WebForms وVB.NET WinForms.أدرك أن التطبيقات يمكن أن يكون لها ملفات التكوين الخاصة بها، لكنني لم أر أي شيء في ملفات التكوين لمكتبات DLL.لسوء الحظ، لا أستطيع الوصول إلى موقع جون جالواي في العمل، لذا لا أستطيع الحكم على ما إذا كان ذلك سينجح أم لا.من وجهة نظر التطوير، لا نريد استخدام خدمات الويب داخليًا، ولكن قد نقوم بتوفيرها لأطراف ثالثة في وقت ما من العام المقبل.لا أعتقد أن انتحال الهوية سينجح لأننا لا نستطيع التحقق من المستخدم من خلال جدار الحماية.نظرًا لأن المستخدم (أو المستخدم السابق) يمكن أن يكون مهاجمًا، فإننا نخفي ذلك عن الجميع!

هل كانت مفيدة؟

المحلول

لست متأكدًا، ولكن أعتقد أنه يمكنك وضعه في ملف التكوين وتشفير ملف التكوين.

تحديث:راجع مشاركة جون جالواي هنا.

نصائح أخرى

فقط افترض أن الأشرار سيحصلون على بيانات الاعتماد من ملف التكوين الخاص بك.وهذا يعني أنهم سيكونون قادرين على تسجيل الدخول إلى قاعدة البيانات الخاصة بك والقيام بكل ما يستطيع هذا المستخدم القيام به.لذا تأكد فقط من أن المستخدم لا يمكنه فعل أي شيء سيئ مثل الوصول إلى الجداول مباشرةً.اجعل هذا المستخدم قادرًا فقط على تنفيذ بعض الإجراءات المخزنة وستكون في حالة أفضل.هذا هو المكان الذي تتألق فيه Sprocs.

أنا أكره أن أقول هذا ولكن بمجرد وضع شيء ما على جهاز العميل، فإن أمان تلك البيانات يخرج من النافذة.

إذا كان برنامجك سيقوم بفك تشفير تلك السلسلة، فعليك أن تفترض أن المهاجم يمكنه أن يفعل الشيء نفسه.سيكون إرفاق مصحح الأخطاء ببرنامجك إحدى الطرق.

يبدو تخزين سلسلة الاتصال على الخادم والحصول عليها من خلال اتصال الويب أمرًا جيدًا، حتى تدرك أنك بحاجة إلى الأمان على اتصال الويب هذا أيضًا، وإلا فقد يتمكن المهاجم من انتحال شخصية برنامجك والتحدث إلى اتصال الويب.

دعني أسأل سؤال.ممن تخفي سلسلة الاتصال؟المستخدم أم المهاجم؟وإذا كان المستخدم، لماذا؟

هناك بعض الأفكار الأخرى أيضا.يمكنك دائمًا استخدام انتحال الهوية.يمكنك أيضًا استخدام مكتبة المؤسسة (المكتبة العامة).

<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<enterpriseLibrary.ConfigurationSource selectedSource="Common">
<sources>
  <add name="Common" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    filePath="Config\Exception.config" />
</sources>

يدعم .NET التشفير على قيم التكوين مثل هذا.يمكنك تركه في ملف التكوين، ولكن مشفرة.

أنت تريد أن تكون قادرًا على توزيع ملف DLL مع وجود كافة معلومات الإعداد في مكان قابل للتكوين، ولكن الحقيقة هي أنه لا يمكنك الحصول على أحد ملفات التكوين .NET سهلة الاستخدام لملف DLL إلا إذا قمت بشيء مخصص.

ربما تحتاج إلى إعادة التفكير في المسؤولية التي يجب أن يتحملها ملف DLL الخاص بك.هل من الممكن أو من المنطقي أن نطلب أن يتم تمرير سلسلة الاتصال من قبل مستخدم مكتبتك؟هل من المنطقي حقًا أن يقرأ ملف DLL الخاص بك ملف التكوين؟

إذا كان التطبيق عبارة عن تطبيق ASP.NET، فما عليك سوى تشفير قسم سلاسل الاتصال الخاص بك web.config.

إذا كان التطبيق عبارة عن تطبيق عميل يعمل على أجهزة متعددة، فبدلاً من تخزين سلسلة الاتصال محليًا، فكر في استخدام خدمة ويب أو أي نوع آخر من الآليات الآمنة لتخزينه مركزيًا.سيؤدي هذا إلى تسهيل التحديثات في المستقبل ولن تقوم بتخزين سلسلة الاتصال محليًا.

فقط بعض الأفكار.

محدث: @lassevk

"يبدو تخزين سلسلة الاتصال على الخادم والحصول عليها من خلال اتصال الويب أمرًا جيدًا، حتى تدرك أنك بحاجة إلى الأمان على اتصال الويب هذا أيضًا، وإلا فقد يتمكن المهاجم من انتحال شخصية برنامجك والتحدث إلى اتصال الويب. "

كان الأمان على خدمة الويب ضمنيًا.اعتمادًا على نوع النشر، هناك العديد من الخيارات...على سبيل المثال، الشهادات من جانب العميل.

العديد من الخيارات:

  1. تخزينها في web.config وتشفيرها
  2. التخزين في ملف dll والتعتيم (dotfuscator)
  3. قم بتخزين واحد في web.config (مشفر بالطبع) واسترح في قاعدة البيانات (إذا كان عليك استخدام عدة أدوات وأصبح التشفير/فك التشفير أمرًا مؤلمًا)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top