تعلم البرمجة مع Python


الدرس: إدارة كلمات المرور


الصفحة السابقة
في هذا الفصل ، سنركز على كلمات المرور وكيفية إدارتها في Python ، أي كيفية استقبالها وحمايتها.

سنكتشف وحدتين في هذا الفصل: الأولى ، getpass والتي تتيح لك أن تطلب من المستخدم كلمة مرور ، ثم hashlib تتيح لك تشفير كلمة المرور المستلمة.

تلقي كلمة المرور التي أدخلها المستخدم



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

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

هذا هو المكان الذي تأتي فيه الوحدة getpass . الوظيفة التي نهتم بها لها نفس اسم الوحدة. سوف يتفاعل مثل input، انتظر إدخال المستخدم وأرسله مرة أخرى. ولكن على عكس input ذلك ، لن يعرض ما يكتبه المستخدم.

دعنا نعطيها محاولة:


>>> from getpass import getpass
>>> mot_de_passe = getpass()
Password:
>>> mot_de_passe
'un mot de passe'
>>>
 
كما ترون ... حسنًا ، لا يمكننا رؤية أي شيء! كلمة المرور التي تكتبها غير مرئية. تضغط على المفاتيح الموجودة على لوحة المفاتيح ولكن لا يتم عرض أي شيء. ومع ذلك ، فأنت تكتب ، وعندما تضغط Enter، getpass ترجع الوظيفة ما كتبته.

هنا ، نقوم بتخزينه في المتغير mot_de_passe . إنه أكثر سرية من input الاعتراف بذلك!

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


>>> mot_de_passe = getpass("Tapez votre mot de passe : ")
Tapez votre mot de passe : 
>>>
 
هذا أفضل.

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

تشفير كلمة المرور



هذه المرة ، سوف نركز على الوحدة hashlib . ولكن قبل أن يوضح لك كيف يعمل ، هناك بعض التفسيرات بالترتيب.


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

الآن ما هو التشفير؟ بداهة ، الفكرة بسيطة للغاية: بدءًا من كلمة المرور ، أي واحدة ، نصل إلى سلسلة ثانية من الأحرف ، غير مفهومة تمامًا.

ما الفائدة؟

حسنًا ، إذا رأيت سلسلة مثل السلسلة تمر أمام عينيك b47ea832576a75814e13351dcc97eaa985b9c6b7 ، فلا يمكنك حقًا تخمين كلمة المرور خلفها.

ولا يمكن للكمبيوتر فكها بسهولة أيضًا. بالطبع ، هناك طرق لاختراق كلمة المرور ولكننا بالتأكيد لن نراها هنا. ما نريد معرفته هو كيفية حماية كلمات المرور الخاصة بنا ، وليس كيفية اختراق كلمات المرور الخاصة بالآخرين!

كيف يعمل التشفير؟

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

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

ولكن إذا كنت تريد التدرب ، فلدي شيء ممتع يمنحك فكرة أفضل عن التشفير.

تبدأ من خلال ترقيم كل الحروف الأبجدية (من A إلى Z ) من 1 إلى 26  . مثل كل القيم في مصفوفة ، سيكون أسهل.

A (1) B (2) C (3) D (4) E (5) F (6) &
G (7) H (8) I (9) J (10) K (11) L (12) M (13)
N (14) O (15) P (16) Q (17) R (18) S (19) &
T (20) U (21) V (22) W (23) X (24) Y (25) Z (26)
الآن ، لنفترض أننا سنحاول تشفير الأسماء الأولى. للقيام بذلك ، سوف نبني مثالنا على عملية حسابية بسيطة: في الجدول أعلاه ، خذ القيمة العددية لكل حرف يشكل الاسم الأول وأضف جميع القيم التي تم الحصول عليها.

على سبيل المثال ، لنبدأ بالاسم الأول Eric . أربعة أحرف ، ستذهب بسرعة. انسَ أمر اللهجات ، الأحرف الكبيرة والصغيرة. لدينا E (5) و R (18) و I (9) و A C (3)  . بإضافة قيم كل حرف ، يكون لدينا 5 + 18 + 9 + 3 ، وهو ما يعطينا 35  .

الخلاصة: من خلال تشفير Eric  باستخدام خوارزمية لدينا ، نحصل على الرقم 35  .

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

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

الآن يمكنك أن ترى أنه خلف رقم مثل 35 ، من الصعب تخمين أن الاسم الأول Eric !

إذا كنت تأخذ الاختبار على الأسماء الأولى Louis  و  Jacques   ، فسوف ندرك ... أنها تنتج نفس النتيجة، 76  . في الواقع :

  • Louis   = 12 + 15 + 21 + 9 + 19 = 76
  • Jacques = 10 + 1 + 3 + 17 + 21 + 5 + 19 = 76
يسمى هذا تصادم : بأخذ سلسلتين مختلفتين ، ينتهي بنا الأمر بنفس التشفير.

hashlib تحاول الخوارزميات التي سنراها في الوحدة تقليل التصادمات قدر الإمكان: كل ما علينا فعله هو تبديل أحرف اسمنا الأول وننتهي بالرقم نفسه ، بعد كل شيء.

هنا. في نهاية التمرين ، سنلقي نظرة على الوحدة hashlib الآن.

تشفير كلمة المرور


يمكننا البدء باستيراد الوحدة hashlib :


import hashlib
 
سنختار الآن خوارزمية. لمساعدتنا في اختيارنا ، hashlib تقدم لنا الوحدة قائمتين:
  • algorithms_guaranteed : خوارزميات تضمنها Python ، وهي نفسها من منصة إلى أخرى. إذا كنت تريد إنشاء برامج محمولة ، فمن الأفضل استخدام إحدى هذه الخوارزميات:
  • 
    >>> hashlib.algorithms_guaranteed
    {'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}
    >>>
     
  • algorithms_available : الخوارزميات المتاحة على النظام الأساسي الخاص بك. جميع الخوارزميات المضمونة موجودة ، بالإضافة إلى بعض الخوارزميات الأخرى الخاصة بنظامك.
  • في هذا الفصل ، سوف نركز على sha1 .

    للبدء ، سننشئ كائننا SHA1 . سوف نستخدم منشئ sha1 الوحدة النمطية hashlib . تأخذ سلسلة كمعلمة ، ولكنها تأخذ سلسلة من البايت  (byte) .

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

    
    >>> b'test'
    b'test'
    >>>
     
    دعونا ننشئ كلمة المرور الخاصة بنا:
    
    >>> mot_de_passe = hashlib.sha1(b"mot de passe")
    >>> mot_de_passe
    
    >>>
     
    للحصول على التشفير المرتبط بهذا الكائن ، لدينا احتمالان:
    • الطريقة digest التي تُرجع نوع بايت يحتوي على كلمة المرور المشفرة ؛
    • الطريقة hexdigest التي تُرجع سلسلة str تحتوي على سلسلة من الرموز السداسية العشرية (من 0 إلى 9 ومن A إلى F ) .
    هذه هي الطريقة الأخيرة التي سأعرضها هنا ، لأنها مفضلة لتخزين الملفات إذا كانت الملفات بحاجة إلى الانتقال من نظام أساسي إلى آخر.
    
    >>> mot_de_passe.hexdigest()
    'b47ea832576a75814e13351dcc97eaa985b9c6b7'
    >>>
     
    ولكسر كلمة المرور هذه؟

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

    
    import hashlib
    from getpass import getpass
    
    chaine_mot_de_passe = b"azerty"
    mot_de_passe_chiffre = hashlib.sha1(chaine_mot_de_passe).hexdigest()
    
    verrouille = True
    while verrouille:
        entre = getpass("اكتب كلمة المرور: ") # azerty
        # نقوم بتشفير المدخلات ليكون لها نوع بايت
        entre = entre.encode()
        
        entre_chiffre = hashlib.sha1(entre).hexdigest()
        if entre_chiffre == mot_de_passe_chiffre:
            verrouille = False
        else:
            print("كلمة سر خاطئة ")
    
    print("تم قبول كلمة المرور...")
     
    يبدو واضحا جدا بالنسبة لي. استخدمنا الخوارزمية sha1، وهناك خوارزمية أخرى يمكنك رؤيتها فيها hashlib.algorithms_available .

    أتوقف من جهتي هنا ؛ إذا كنت ترغب في الذهاب أبعد من ذلك ، فسأعيد توجيهك إلى توثيق python على وحدتي getpass و hashlib  .

باختصار


  • لتطلب من المستخدم إدخال كلمة مرور ، يمكنك استخدام الوحدة getpass .
  • الوظيفة getpass الوحدة getpass تعمل بنفس الطريقة مثل input، إلا أنها لا تعرض ما يدخل المستخدم.
  • لتشفير كلمة مرور ، سوف نستخدم الوحدة hashlib .
  • تحتوي هذه الوحدة على سمات الخوارزميات المختلفة التي يمكن استخدامها لتشفير كلمات المرور الخاصة بنا.