判断密码强度/判断密码强度(1)

去社区提问

简介:用程序对用户输入的密码安全性强度进行判断,并输出结果。

案例描述

欢迎继续学习小象学院Python认知打卡课~

这节课开始我们将一起学习新的案例。无论注册邮箱,微信还是门户网站会员,都需要我们设置密码,保障账户安全。

为了简单好记,很多同学草率地把密码设置成’123456’(是我本人),这种形式的密码非常容易被破解,也就不能起到保护账户的作用。

因此现在设置密码时,会要求用户设置一定长度并且带有大小写字母和特殊符号的密码,也就是提前判断用户设置的密码强度,强密码可以降低安全漏洞的整体风险。只有满足安全条件的密码才能被使用。

那么如何判断用户输入的密码是否满足要求呢?这节课我们就一起来探索一下。

先来设置一个简易版的密码规则:

用户输入设置的密码后,程序自动判断密码是否满足上面三个规则要求。

案例分析

先来梳理一下大致思路。我们设置一个变量strengh_level用于记录密码的强度,初始值为0,满足一个条件就对其增加1。

如果strengh_level等于3则密码强度合格,否则不合格。

接下来就要思考如何判断密码是否满足三个条件,需要用到三个方法,我来一一为你介绍一下。

  • 长度判读:使用len()方法

len()可以用来判断字符串长度,举一个简单的例子:

代码练习:

编程区

  1. s = '这里有六个字'
  2. print(len(s))

终端区

利用len()就可以轻松帮我们得到密码长度啦。

  • 包含数字判断:使用isnumeric()方法

str.isnumeric()用来检测字符串是否只由数字组成,是则返回True,否则返回False。

代码练习:

编程区

  1. s = '13579'
  2. s.isnumeric()

终端区

代码练习:

编程区

  1. s = 'abc135'
  2. s.isnumeric()

终端区

当字符串中数字和文本混合时,也会返回Fals,只有字符串是纯数字才会得到结果True。

  • 包含字母判断:使用isalpha()方法

str.isalpha()检测字符串是否只由字母组成,是则返回True,否则返回False。

来看下面两个应用的例子:

代码练习:

编程区

  1. s = 'school'
  2. s.isalpha()

终端区

代码练习:

编程区

  1. s = '123school'
  2. s.isalpha()

终端区

除此之外str.islower()方法可以判断字符串中所有字母是否都为小写;str.isupper()可以检测字符串中的字母是否都为大写,大家可以课后自己尝试使用。

有了这些知识铺垫,就可以开始动手写程序了~

首先需要使用input()语句完成密码输入:

  1. password = input('请输入密码:')

下面再逐一判断密码是否满足三个条件:

用变量strength_level记录密码强度,设置初始值为0:

  1. strength_level = 0

用if条件语句判断密码长度是否大于8,前面讲过获取字符串长度的的len()方法在这里就要派上用场了。

密码长度大于8则给变量strength加1,否则提示用户密码过短:

  1. # 规则1:密码长度大于8
  2. if len(password) >= 8:
  3. strenth_level += 1
  4. else:
  5. print('密码长度要求至少8位')

接下来再继续判断密码中是否含有数字。我们可以定义一个函数,它的功能就是判断所给字符串中是否包含数字,是则返回True,否则返回False。

请你判断下面的函数是不是能满足要求呢?

  1. def check_number_exist(password_str):
  2. return password_str.isnumeric()

还记得我们前面提到isnumeric()方法判断字符串是否为纯数字;而我们对密码的要求是只要其中含有数字就可以。这样一来上面定义的函数就和我们的要求不匹配了。

那应该怎么解决这个问题呢?其实非常简单,我们可以利用for循环遍历字符串中的每个字符,只要出现数字,就满足条件返回True,如果一直遍历到最后一个字符都没有出现数字,就返回False。

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. for c in password_str:
  4. if c.isnumeric():
  5. return True
  6. return False

我们再来解读一下这个函数。c在for循环中会依次等于password_str字符串中的每一个字符;当c不是数字时,c.isnumeric()为False,if条件语句不成立,不执行任何操作;当c是数字时,c.isnumeric()为True,执行下面的return语句;当函数遇到return语句时就意味着函数结束,需要回到主程序,后面的循环也就不再执行了。

当c一直遍历到字符串的最后一个字符,都没有返回主程序时,就证明字符串不包含数字,返回False。

判断规则2时可以直接调用这个函数:

  1. # 规则2:包含数字
  2. if check_number_exist(password):
  3. strength_level += 1
  4. else:
  5. print('密码要求包含数字!')

我们可以类比上面的思路来完成’判断密码中是否包含字母’的函数:

  1. def check_letter_exist(password_str):
  2. # 判断字符串中是否含有字母
  3. for c in password_str:
  4. if c.isalpha():
  5. return True
  6. return False

同样在主程序中调用函数来完成判断:

  1. # 规则3:包含字母
  2. if check_letter_exist(password):
  3. strength_level += 1
  4. else:
  5. print('密码要求包含字母!')

来看看现在完成的程序~

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. for c in password_str:
  4. if c.isnumeric():
  5. return True
  6. return False
  7. def check_letter_exist(password_str):
  8. # 判断字符串中是否含有字母
  9. for c in password_str:
  10. if c.isalpha():
  11. return True
  12. return False
  13. password = input('请输入密码:')
  14. # 密码强度
  15. strength_level = 0
  16. # 规则1:密码长度大于8
  17. if len(password) >= 8:
  18. strength_level += 1
  19. else:
  20. print('密码长度要求至少8位!')
  21. # 规则2:包含数字
  22. if check_number_exist(password):
  23. strength_level += 1
  24. else:
  25. print('密码要求包含数字!')
  26. # 规则3:包含字母
  27. if check_letter_exist(password):
  28. strength_level += 1
  29. else:
  30. print('密码要求包含字母!')

最后再来判断strength_level是否等于3,等于3输出密码合格,否则提示用户密码强度不合格。

  1. if strength_level == 3:
  2. print('恭喜,密码强度合格!')
  3. else:
  4. print('密码强度不合格!')

下面我们运行代码看看结果。

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. for c in password_str:
  4. if c.isnumeric():
  5. return True
  6. return False
  7. def check_letter_exist(password_str):
  8. # 判断字符串中是否含有字母
  9. for c in password_str:
  10. if c.isalpha():
  11. return True
  12. return False
  13. password = input('请输入密码:')
  14. # 密码强度
  15. strength_level = 0
  16. # 规则1:密码长度大于8
  17. if len(password) >= 8:
  18. strength_level += 1
  19. else:
  20. print('密码长度要求至少8位!')
  21. # 规则2:包含数字
  22. if check_number_exist(password):
  23. strength_level += 1
  24. else:
  25. print('密码要求包含数字!')
  26. # 规则3:包含字母
  27. if check_letter_exist(password):
  28. strength_level += 1
  29. else:
  30. print('密码要求包含字母!')
  31. if strength_level == 3:
  32. print('恭喜!密码强度合格!')
  33. else:
  34. print('密码强度不合格!')
本关总结

本节课我们完成了判断密码强弱1.0版本的程序,主要运用复习了之前学过的函数和条件判断的内容,还学习了几个字符串操作的方法,下面一起来总结一下~

下节预告

下节课中,我们将限制密码设置次数,例如最多让用户尝试设置5次密码。

还会介绍循环控制的方法,任何终止循环,让我们下节课不见不散吧~

想要获取课程资料和更多小伙伴一起交流学习,欢迎添加班主任微信。

扫描二维码添加班主任微信

已经添加班主任的同学无需重复扫码,直接联系对应老师即可。

判断密码强度 1/3

判断密码强度(1)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时