تخزين الانتروبيا الاختيارية بشكل آمن أثناء استخدام DPAPI

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

سؤال

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

لذا فإن سؤالي هو - ما هي أفضل طريقة لتخزين الانتروبيا باستخدام DPAPI؟

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

المحلول

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

سأشير إلى إنتروبيك الخاص بك مفتاح, ، لأنه من الناحية الوظيفية مفتاح إضافي.

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

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

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

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

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

نصائح أخرى

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

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

بالنظر إلى كل ذلك ، أود أن أقترح إنشاء خدمة WCF (Windows Communication Foundation) المستخدمة لاسترداد المعلومات الحساسة. من الواضح أنه يمكن استخدامه لاسترداد جميع المعلومات ، ولكن أقل قدر من التغيير هو حصر الخدمة على المعلومات الحساسة.

باستخدام WCF ، يمكنك تكوين كل من العميل والخادم لاستخدام قناة آمنة. لدى WCF الكثير من الخيارات لإنشاء قناة اتصال آمنة للخادم.

<wsHttpBinding>
    <binding>
        <security mode="Transport">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</wsHttpBinding>

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

نرى كيفية: إنشاء جلسة آمنة للمزيد من.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top