كيف يمكنني حماية الخلية اسم المستخدم وكلمة المرور من إلغاء ترجمته?

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

سؤال

جافا .class ملفات يمكن decompiled بسهولة إلى حد ما.كيف يمكنني حماية قاعدة البيانات إذا كان لا بد لي من استخدام بيانات تسجيل الدخول في الكود ؟

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

المحلول

لا بجد رمز كلمات السر في التعليمات البرمجية الخاصة بك.هذا وقد وجه مؤخرا في أعلى 25 أخطر أخطاء البرمجة:

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

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

لمزيد من المعلومات حول هذا الخطأ الشائع ، يمكنك قراءة CWE-259 المادة.المقال يحتوي على أكثر شمولا تعريف وأمثلة ، والكثير من المعلومات الأخرى حول المشكلة.

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

import java.util.prefs.Preferences;

public class DemoApplication {
  Preferences preferences = 
      Preferences.userNodeForPackage(DemoApplication.class);

  public void setCredentials(String username, String password) {
    preferences.put("db_username", username);
    preferences.put("db_password", password);
  }

  public String getUsername() {
    return preferences.get("db_username", null);
  }

  public String getPassword() {
    return preferences.get("db_password", null);
  }

  // your code here
}

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

ملاحظة هامة: تفضيل ملفات نص عادي فقط ملفات XML.تأكد من اتخاذ الخطوات المناسبة لمنع المستخدمين غير المصرح به من عرض ملفات الخام (UNIX أذونات ويندوز الأذونات ، إلى آخره).في لينكس, على الأقل, هذه ليست مشكلة لأن الدعوة Preferences.userNodeForPackage سيتم إنشاء ملف XML الحالية في الدليل الرئيسي للمستخدم ، وهو غير قابل للقراءة من قبل المستخدمين الآخرين على أي حال.في نظام التشغيل Windows, قد يكون الوضع مختلف.

المزيد من الملاحظات الهامة: كان هناك الكثير من النقاش في التعليقات من هذا الجواب الآخرين حول ما الصحيح المعمارية لهذا الوضع.السؤال الأصلي لا يذكر السياق الذي يتم استخدام التطبيق, لذلك سوف نتحدث عن حالتين أستطيع أن أفكر.الأول هو الحالة التي يكون فيها الشخص باستخدام برنامج يعرف مسبقا (كما هو المصرح به إلى معرفة) قاعدة بيانات بيانات الاعتماد.والثاني هو الحالة التي أنت, المطور, في محاولة للحفاظ على قاعدة بيانات وثائق سرية من شخص استخدام البرنامج.

الحالة الأولى:أذن المستخدم لمعرفة بيانات اعتماد تسجيل الدخول

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

الحالة الثانية:في محاولة لإخفاء بيانات اعتماد تسجيل الدخول من المستخدم

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

الصحيح في القضية:استخدام متعدد المستويات المعمارية

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

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

الأساسية ترتيب العمليات هي:

  1. العميل المصادقة مع منطق الأعمال الطبقة باستخدام المستخدم الشخصية اسم المستخدم/كلمة المرور.اسم المستخدم وكلمة المرور ومن المعروف أن المستخدم لا تتعلق قاعدة بيانات اعتماد تسجيل الدخول في أي شكل من الأشكال.
  2. إذا المصادقة نجح العميل طلبا إلى منطق الأعمال الطبقة يسأل عن بعض المعلومات من قاعدة البيانات.على سبيل المثال, جرد من المنتجات.علما بأن طلب العميل ليس SQL الاستعلام ؛ بل هو استدعاء الإجراء البعيد مثل getInventoryList.
  3. منطق الأعمال الطبقة يربط قاعدة البيانات و استرداد المعلومات المطلوبة.منطق الأعمال المستوى هو المسؤول عن تشكيل آمنة استعلام SQL بناء على طلب المستخدم.أي المعلمات إلى استعلام SQL يجب أن تكون مطهرة لمنع هجمات حقن SQL.
  4. منطق الأعمال الطبقة يرسل قائمة الجرد العودة إلى تطبيق العميل.
  5. العميل يعرض قائمة الجرد إلى المستخدم.

علما أنه في العملية برمتها ، تطبيق العميل لم يربط مباشرة إلى قاعدة البيانات.منطق الأعمال الطبقة يتلقى طلبا من مصادقة المستخدم ، عمليات العميل طلب قائمة جرد فقط ثم ينفذ استعلام SQL.

نصائح أخرى

ووضع كلمة مرور في ملف أن التطبيق سيتم قراءة. NEVER تضمين كلمات المرور في ملف مصدر. الفترة.

وروبي على وحدة غير معروفة تسمى DBI :: DBRC للحصول على هذا الاستخدام. ليس لدي أي شك في أن جافا لديه ما يعادلها. على أي حال، فإنه ليس من الصعب أن يكتب واحد.

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

<اقتباس فقرة>   

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

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

فإن أفضل طريقة هي عدم تخزين أي من كلمات السر في أي مكان.ويتحقق ذلك عن طريق استخدام وظائف التجزئة لتوليد وتخزين التجزئة كلمة المرور:

hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366

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

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

الآن يأتي السؤال:ما هي أفضل طريقة لتخزين كلمات السر ؟ وأود أن تنظر هذا (مصادقة المستخدم خدمة إدارة stormpath) ، حل جدا مثالية واحدة:

  1. الخاص بك المستخدم بإدخال بيانات الاعتماد ، وهذا هو التحقق من صحة ضد تجزئة كلمة المرور
  2. تجزئات كلمة المرور يتم إنشاؤها وتخزينها ، لا كلمات السر
  3. تجزئات يتم تنفيذها عدة مرات
  4. يتم إنشاء تجزئات تستخدم بشكل عشوائي الملح
  5. الهاشات المشفرة مع مفتاح خاص
  6. المفتاح الخاص هو تخزينها في درجة جسديا من تجزئات
  7. مفاتيح خاصة على على الموضة تحديث
  8. تشفير الهاشات تنقسم إلى قطع
  9. هذه القطع يتم تخزينها في مواقع منفصلة جسديا

من الواضح أنك لست جوجل أو البنك, لذلك هذا هو مبالغة الحل بالنسبة لك.ولكن بعد ذلك يأتي السؤال:كم الأمن يتطلب المشروع الخاص بك, كم من الوقت و المال لديك ؟

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

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

وهذا السؤال يوضح كيفية تخزين كلمات المرور وغيرها من البيانات في ملف مشفر: جافا 256 بت AES-استنادا كلمة المرور التشفير

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

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