سؤال

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

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

المحلول

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

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

نصائح أخرى

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

هذا هو الرمز الذي سيقوم بتجزئة بعض البايتات لك.يمكنك بسهولة نقل البايتات من سلسلة باستخدام getBytes() طريقة.

/**
     * Returns the hash value of the given chars
     * 
     * Uses the default hash algorithm described above
     * 
     * @param in
     *            the byte[] to hash
     * @return a byte[] of hashed values
     */
    public static byte[] getHashedBytes(byte[] in)
    {
        MessageDigest msg;
        try
        {
            msg = MessageDigest.getInstance(hashingAlgorithmUsed);
        }
        catch (NoSuchAlgorithmException e)
        {
            throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist.  Epic fail, go change it in the Util file.  SHA(1) or MD5");
        }
        msg.update(in);
        return msg.digest();
    }

لا يوجد.حتى إذا قمت بتشفيره، فسيقوم شخص ما بفك الكود الذي يفك تشفيره.

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

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

على سبيل المثال، إذا كان خادم التطبيقات الخاص بك يعمل على Linux/Unix كـ root ثم اجعل ملف خصائص كلمة المرور مملوكًا لـ root مع 400/-r-------- الأذونات.

ألا يمكنك جعل التطبيق يتصل بالخادم عبر https وينزل كلمة المرور، بعد المصادقة بطريقة ما بالطبع؟

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