كيفية تنفيذ حماية كلمة المرور للملفات الفردية؟

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

سؤال

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

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

  • الخطوة 1:يقوم المستخدم بإدخال كلمة المرور ذات النص العادي، على سبيل المثال."كلمة المرور الصعبة"
  • الخطوة 2:يقوم التطبيق بتجزئة كلمة مرور المستخدم ويستخدم تلك القيمة كمفتاح متماثل لتشفير/فك تشفير ملف البيانات.على سبيل المثال"MyDifficultPassword" --> "HashedUserPwdAndKey".
  • الخطوه 3:يقوم التطبيق بتجزئة القيمة المجزأة من الخطوة 2 ويحفظ القيمة الجديدة في رأس ملف البيانات (أي.الجزء غير المشفر من ملف البيانات) ويستخدم هذه القيمة للتحقق من صحة كلمة مرور المستخدم.على سبيل المثال"HashedUserPwdAndKey" --> "HashedValueForAuthentication"

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

فهل هذا التصميم آمن إلى حد معقول، أم أنه ساذج إلى حد يائس، أم أنه في مكان ما بينهما؟شكرًا!

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

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

هل هذا يعني أنه يمكنني تخزين قيمة الملح في نفس المكان/الملف مثل المفتاح المجزأ وما زلت أكثر أمانًا مما لو لم أستخدم أي ملح على الإطلاق عند التجزئة؟كيف يعمل هذا؟

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

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

المحلول

جيل المفتاح

أوصي باستخدام خوارزمية معروفة مثل PBKDF2 المحددة في PKCS #5 الإصدار 2.0 لإنشاء مفتاح من كلمة المرور الخاصة بك.إنها تشبه الخوارزمية التي حددتها، ولكنها قادرة على إنشاء مفاتيح متماثلة أطول للاستخدام مع AES.يجب أن تكون قادرًا على العثور على مكتبة مفتوحة المصدر تستخدم مولدات مفاتيح PBE لخوارزميات مختلفة.

تنسيق الملف

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

التحقق من صحة كلمة المرور

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

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

ملح التشفير

ملح يساعد على إحباط هجمات القاموس المحسوبة مسبقًا.

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

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

لذلك، ليس من الضروري الحفاظ على سر الملح.يعد التأكد من أن المهاجم ليس لديه قاموس محسوب مسبقًا يتوافق مع هذا الملح المعين أمرًا كافيًا.

نصائح أخرى

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

بالطبع القراءة بروس شنايرالتشفير التطبيقي لا يخطئ أبدًا أيضًا.

إذا كنت تستخدم خوارزمية تجزئة قوية (SHA-2) وخوارزمية تشفير قوية (AES)، فستنجح في استخدام هذا النهج.

لماذا لا تستخدم مكتبة ضغط تدعم الملفات المحمية بكلمة مرور؟لقد استخدمت ملفًا مضغوطًا محميًا بكلمة مرور يحتوي على محتوى XML في الماضي :}

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

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

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