كيفية حماية كلمة مرور النص العادي في البرنامج النصي الخاص بي؟(روبي)

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

سؤال

في البرنامج النصي روبي الخاص بي أحتاج إلى تمرير اسم المستخدم و

  • كلمة المرور كنص عادي في النموذج لتسجيل الدخول.يتم حاليًا تخزين اسم المستخدم وكلمة المرور في البرنامج النصي الخاص بي.

  • أملك لا تحكم عبر الخادم أقوم بتسجيل الدخول من البرنامج النصي.يعمل البرنامج النصي بشكل جيد محليًا وأريد في المستقبل الانتقال إلى ملفي

  • مزود استضافة المواقع وتشغيله من هناك (لدي وصول SSH)

  • باستخدام كرون.هل هناك أي طريقة/طريقة لكيفية ذلك

  • حماية كلمة المرور في حال تمكن شخص ما من الوصول إلى هذا البرنامج النصي بأي فرصة؟

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

المحلول

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

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

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

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

الإجابة السابقة، وجدت أنها غير قابلة للتطبيق، أسفل السطر.


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

إذا كان الأمر مهمًا حقًا، فتأكد من أن اتصالك لتشغيل البرنامج النصي مشفر (ssh، ssl، وما إلى ذلك)، وتأكد من أن البرنامج النصي يستخدم https فقط لتسجيل الدخول.

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

محدث:إن شرط أن يكون ذلك آليًا يجعل الحل المذكور أعلاه غير جيد.

نصائح أخرى

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

الحيلة هي تجاوز جزء "الأتمتة" من خلال بدء التشغيل مرة واحدة:قم بتشغيل البرنامج النصي كعملية مستمرة صغيرة يتم تنشيطها بشكل دوري وتشغيلها.اطلب من العملية أن تطلب كلمة المرور عند بدء التشغيل أو عبر نوع آخر من طلبات واجهة برمجة التطبيقات (وليس في سطر الأوامر!).

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

قد تحتاج إلى وظيفة cron للتحقق من العملية وتنبيهك إذا لم تكن قيد التشغيل.

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

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

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

قم بإنشاء طريقة لتجزئة كلمة المرور، وقم بشيء مثل هذا:

require "digest/sha1"
class User
  attr_accessor :password

  def initialize(password)
    @password = hash_password(password)
  end

  def hash_password(password)
    Digest::SHA1.hexdigest(password)
  end

  def valid_password?(password)
    @password == hash_password(password)
  end
end

u = User.new("12345")
p u.password # => "8cb2237d0679ca88db6464eac60da96345513964"
p u.valid_password?("not valid") # => false
p u.valid_password?("12345") # => true

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

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