سؤال

لدي بعض التعليمات البرمجية مثل هذه في تطبيق winforms الذي كنت أكتبه للاستعلام عن حصة تخزين صندوق بريد المستخدم.

DirectoryEntry mbstore = new DirectoryEntry(
      @"LDAP://" + strhome, 
      m_serviceaccount, 
      [m_pwd], 
      AuthenticationTypes.Secure);

بغض النظر عن النهج الذي جربته (مثل SecureString)، أستطيع بسهولة رؤية كلمة المرور (m_pwd) إما باستخدام العاكس أو باستخدام علامة تبويب السلاسل في Process Explorer للملف القابل للتنفيذ.

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

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

التجزئة غير ممكنة لأنني بحاجة إلى معرفة كلمة المرور الدقيقة (وليس فقط التجزئة لغرض المطابقة).آليات التشفير/فك التشفير لا تعمل لأنها تعتمد على الآلة.

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

المحلول

الطريقة المقدسة هي استخدام CryptoAPI وواجهات برمجة تطبيقات حماية البيانات.

للتشفير، استخدم شيئًا مثل هذا (C++):

DATA_BLOB blobIn, blobOut;
blobIn.pbData=(BYTE*)data;
blobIn.cbData=wcslen(data)*sizeof(WCHAR);

CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut);
_encrypted=blobOut.pbData;
_length=blobOut.cbData;

فك التشفير هو العكس:

DATA_BLOB blobIn, blobOut;
blobIn.pbData=const_cast<BYTE*>(data);
blobIn.cbData=length;

CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut);

std::wstring _decrypted;
_decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR));

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

نصائح أخرى

وكما ذكرنا سابقًا، تعد واجهة برمجة تطبيقات حماية البيانات طريقة جيدة للقيام بذلك.لاحظ أنه إذا كنت تستخدم .NET 2.0 أو إصدار أحدث، فلن تحتاج إلى استخدام P/Invine لاستدعاء DPAPI.يقوم إطار العمل بتغليف المكالمات باستخدام فئة System.Security.Cryptography.ProtectedData.

لقد وجدت هذا الكتاب من تأليف كيث براون دليل مطور .NET لأمان Windows.لديها بعض العينات الجيدة التي تغطي جميع أنواع السيناريوهات الأمنية.حر النسخة على الانترنت متاح أيضا.

إذا قمت بتخزينها كسلسلة آمنة وحفظت السلسلة الآمنة في ملف (ربما باستخدام تخزين معزول, ، المرة الوحيدة التي ستحصل فيها على كلمة مرور نصية عادية هي عندما تقوم بفك تشفيرها لإنشاء mbstore الخاص بك.لسوء الحظ، لا يأخذ المنشئ SecureString أو كائن بيانات الاعتماد.

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