مشروع تدريبى بسيط , بمعلومات جديدة!

المشروع منقول من اكاديمية حاسوب بالرابط التالى : مشاريع بايثون عملية تناسب المبتدئين - بايثون - أكاديمية حسوب

مشروع التحقق من قوة كلمة المرور

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

  1. يجب أن تحتوي كلمة المرور على حروف صغيرة (a-z).
  2. يجب أن تحتوي كلمة المرور على حروف كبيرة (A-Z).
  3. يجب أن تحتوي كلمة المرور على محارف خاصة (!@#$^%).
  4. يجب أن تحتوي كلمة المرور على أرقام (0-9).
  5. يجب أن لا يقل طول الكلمة عن 8 محارف ولا يزيد على 20 محرف

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

حلى الشخصى للمشروع :

import string
import time 


while True :                   # loop for renter
 upper_case = []
 lower_case = []
 digits = []
 punctuations = [] 
 new_pass = input('''\nnew password .....
                  
 Note >> Passwrd must Contains :
                        
   1-Contains Small letter (a-z)
   2-Contains Capital leter (A-Z)
   3-Contains special chracters (#@$%^&*)
   4-Contains Numbers (0-9)
   5-Minimum 8 chracter & maximum 20 chracter 
     
                                             Enter a password : ''')             # ask user for pass
 
 for x in new_pass :                                             # loop for adding pass to lists
         if (x in string.ascii_lowercase) and (x not in string.digits) and (x not in string.punctuation) and (x not in string.ascii_uppercase) :
            lower_case.append(x)
         if (x in string.digits) and (x not in string.ascii_lowercase) and (x not in string.punctuation) and (x not in string.ascii_uppercase) :
            digits.append(x)  
         if (x in string.punctuation) and (x not in string.digits) and (x not in string.ascii_lowercase) and (x not in string.ascii_uppercase) :
            punctuations.append(x)
         if (x in string.ascii_uppercase) and (x not in string.digits) and (x not in string.punctuation) and (x not in string.ascii_lowercase) :
             upper_case.append(x)
 if upper_case and lower_case and digits and punctuations :           # pass spell final check
     print ("Checking pass chracters & numbers ! \n")
     time.sleep(2)
     print ("Your pass strength is high 🤩\n")
 else :
     print ("your pass strength is weak \nTry again !")
     continue
                           
 if len(new_pass) >= 8 and len(new_pass) <= 20 :                 # pass length check
     print ("\n Checking pass length !")
     time.sleep(2) 
     print ("\nYour pass length is within range 😊")
     break
 
 else :
     print("Your pass length is not within range \n\nTry again !") 
     continue

print (f"\nYour PassWord :\n\n {new_pass} \n\nis saved successfuly.\n" )    # printing successful pass     

طبعا ده مش clean code أو بمعنى اصح مش افضل حاجة وممكن التعديل فيه لتقليل الكود (بس الوقت ضيق :sweat_smile::sweat_smile:

4 إعجابات

حل الموقع نفسه للمشروع :

أسهل طريقة لتحقيق هذا المشروع هي باستخدام مفهوم التعابير النمطية في البرمجة regular expression والمعروفة اختصارًا باسم Regex، فمن خلالها يمكن تعريف نمط بحث للتحقق من قوة كلمة المرور بالشكل التالي:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*``#?&])[A-Za-z\d@$!#%*?&]{6,20}$

يفحص هذا التعبير النمطي قوة كلمة المرور حيث يبدأ بالرمز ^ الذي يعني أن الاختبار يجب أن يبدأ من بداية كلمة المرور وبعدها يليه (?=.*[a-z]) الذي يتحقق من وجود حرف صغير على الأقل في كلمة المرور ثم القسم (?=.*[A-Z]) الذي يتحقق من وجود حرف كبير على الأقل في كلمة المرور ثم (?=.*\d) الذي يتأكد من وجود رقم واحد على الأقل فيها والقسم (?=.*[@$!%*#?&]) للتأكد من وجود محرف خاص على الأقل في كلمة المرور والقسم [A-Za-z\d@$!#%*?&]{6,20} للتحقق من أن طول كلمة المرور بين 8 إلى 20 محرف وأنهينا التعبير النمطي بكتابة الرمز $ الذي يعني أن الاختبار يستمر حتى نهاية كلمة المرور.

وللتحقق من مطابقة كلمة المرور لهذا النمط في مشروعنا سنعتمد على مكتبة بايثون المسماة re وهي مكتبة قياسية في بايثون تساعدك على تعريف التعابير النمطية والتحقق من مطابقة سلسلة ما لنمط معين.

import re

def is_strong_password(pwd):
    pattern = '^[a-z]+[A-Z]+[!@#$^%]+[0-9]+$'
    return bool(re.search(pattern, pwd))

while True:
    password = input("أدخل كلمة المرور: ")

    if is_strong_password(password):
        print("كلمة المرور قوية")
        break
    else:
        print("\nكلمة المرور ضعيفة، أدخل واحدة أخرى")

شرح التعابير النمطية من أكاديمية حاسوب :

إعجابَين (2)

وهذه طريقتى في حل المشروع :

def is_strong_password (password): # انشاء فانكشن تتحقق من قوة كلمة المرور
    lower, upper, number, symbol, length = False, False, False, False, len (password) in range (8, 21) # تعريف متغيرات وجعل قيمتها تساوي False ما عدا length التى تساوي طول كلمه المرور في range (8، 21)
    for letter in password : # عمل لوب داخل كلمة المرور
        symbol = True if letter in "!@#$^%" else symbol # جعل symbol تساويTrue اذا كان الحرف في (!@#$^%) ولا يساوي نفسه
        number = True if letter.isdigit () else number # جعل number يساوي True اذا كان الحرف رقم ولا يساوى نفسه
        upper = True if letter.isupper () else upper # جعل upper يساوي True اذا كان الحرف capital ولا يساوى نفسه
        lower = True if letter.islower () else lower # جعل lower يساوي True اذا كان الحرف small ولا يساوى نفسه
    return lower == upper == number == symbol == length == True # يرجع قيمه أن جميع المتغيرات تساوي True (اذا كان جميع المتغيرات تساوي Trueحقا، سيرجع True والا سيرجع False)
print (is_strong_password (input ("Enter a password : "))) # تجربه الداله password : ")))

المشروع لما بيشتغل بياخذ كلمه المرور ويشوف لو هى كلمه قويه بيطبع True والا بيطبع False.
ممكن تعدل على الكود وتخليه يطبع «كلمه المرور قوية» بدل True و «كلمه المرور ضعيفه» بدل False، بس مش ضروري.

إعجاب واحد (1)

انا اكتشفت إن انا عملت نفس اسم الفانكشن بتاع الحل الحقيقي :joy:، بس الطريقه مختلفه جدا.

إعجاب واحد (1)

تقريبا فهمت الكود لكن من وين عرفت الاختصارات مثل الي في السطر الثاني والسطر الي قبل الاخير, لاني ما شفتهم قبل مع المستر, وبرضو السطر الي قبل الاخير مش فاهمو خالص

إعجاب واحد (1)

مش كل حاجه بعرفها من المستر، لازم يكون عند المبرمج تنوع في المصادر.


بالنسبة للسطر التاني :

lower, upper, number, symbol, length = False, False, False, False, len (password) in range (8, 21)

هتلاحظ إن انا عملت 5 متغيرات
(lower, upper, number, symbol, length)
بعدها كتبت علامة يساوي (=)
وبعدها عملت 5 قيم للخمس متغيرات
(False, False, False, False, len (password) in range (8, 21))

اول اربع قيم تساوي False
والاخيره تساوي طول password من 8 الى 21 حرف
ولاكن لان range لا تصل إلى آخر رقم
سيكون من 8 إلى 20 فقط،
اذا كان حقا طول password من 8 إلى 20
سيكون الناتج True والا سيكون الناتج False.


وبالنسبة للسطر قبل الاخير :

return lower == upper == number == symbol == length == True

فلو كان كل المتغيرات تساوي True هيكون بالظبت كأنى كتبت :

return True == True == True == True == True == True

هيكون الناتج (True) لان True تساوي True.

ولاكن اذا كان في اي متغير منهم يساوي False هيكون كأنى كتبت :

return False == True == True == True == True == True

هيكون الناتج (False) لأن False لا تساوي True.

لو في اي حاجة مش فاهمها اخبرني :heart:

إعجاب واحد (1)

ليه فالاخير كتبت ترو طيب ؟

return lower == upper == number == symbol == length == True

ايش فايدتها يعني

إعجاب واحد (1)

ممكن تبعث الكود مثلا بـ باسوورد صحيح و باسوورد خاطئ ممكن افهم اكثر اذا ممكن

إعجاب واحد (1)

في الآخر كتبت True عشان ممكن كله يكون False، يعنى ممكن كلمه السر تكون (■) وهذا الحرف ليس رقما وليس حرفا كبيرا ولا صغيرا وليس من (!@#$^%) وطوله ليس بين 8 الى 20، ولاكن اذا لم نكتب True في النهايه سيرجع ان كلمه المرور قويه لان False يساوي False.

وكيف هيرجع تقريبا 6 قيم ترو ؟

إعجاب واحد (1)

مش 6 قيم True، قيمه واحده.

لو انت كتبت

retern True, True, True, True, True, True

فده 6 قيم True.

بس لو انت كتبت

retern True == True == True == True == True == True

فده قيمه واحده True.

ولو عايز تتأكد، اكتب :

print (True == True == True == True == True == True)

الناتج هيكون True واحده

اما لو كتبت :

print (True, True, True, True, True, True)

هيكون الناتج 6 True

انت شفت الحاجات دي فين؟ انا مبحبش ابحث كثير عشان متهش عن المستر

إعجاب واحد (1)

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

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

وخليك عارف إن من رابع المستحيلات تلاقي حد يشرح لك كل حاجه عن البرمجه.

بالتوفيق لك يا أخي :sparkling_heart:

إعجابَين (2)

صحيح فعلا لكن انا اعتبر نفسي لازلت مبتدأ ولا اريد ان اغوص مرة بالموضوع, فـ عالاقل انهي الكورس مع المستر بعدين ببدا اتوسع مش مشكلة, لكن حاليا افضل اني اركز على المستر اكثر وما اشوف مصادر ثانية عشان ما اتشتت حاليا لكن لاحقا بالطبع رح اضطر اتعامل مع اكثر من مصدر

إعجاب واحد (1)

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

إعجاب واحد (1)

انا لسا داخل فوحدة التعبان امبارح فحاسس انو لا لسا بدي وقت, لين ما اتعلم كيف اتعامل مع الملفات او ممكن بعد لعبة بينج

إعجاب واحد (1)

أنا أرى انه منذ أول حلقة في المستوي الثاني، فنحن لسنا مبتدئين.

مؤيد لكل ردودك :heart:
واختصار الكود عندك احترافى
اللهم بارك
علمنا الله وإياك

إعجاب واحد (1)

نعم بعد انتهاء الوحدة 1 تستطيع القول انك ملم باغلب اساسيات اللغة

إعجاب واحد (1)