鱼C论坛

 找回密码
 立即注册
查看: 1803|回复: 3

关于密码生成的问题

[复制链接]
发表于 2021-7-5 18:56:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大佬们,我在做作业的时候遇到了个问题
这是代码
# 密码安全性检查代码
#
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位
import string

word = string.ascii_letters
number = '1234567890'
punctuation = '~!@#$%^&*()_=-/\,.?<>;:[]{}|'


def checking(password):
    str(password)
    if len(password) <= 8 and (password.isalpha() == 0 or password.isnumeric() == 0):
        return '低级密码'

    length = len(password)
    print(length)
    word_check = 0
    number_check = 0
    punctuation_check = 0
    for i in range(0, length + 1):
        cache = password[i:i + 1]
        if cache in word:
            word_check = 1
            print('wordfound')
        if cache in number:
            number_check = 1
            print('numberfound')
        if cache in punctuation:
            punctuation_check = 1
            print('punctuationfound')
    if word_check + number_check + punctuation_check == 2 and length >= 8:
        return '中级密码'
    elif word_check + number_check + punctuation_check == 3 and length >= 16 and password[0:1] in word:
        return '高级密码'
    else:
        print(word_check,number_check,punctuation_check)
        return '不符合规定'


if __name__ == '__main__':
    password = input('请输入密码')
    print('正在检查')
    print(checking(password))
调试数据是这样的
请输入密码123456789
正在检查
9
numberfound
numberfound
numberfound
numberfound
numberfound
numberfound
numberfound
numberfound
numberfound
wordfound #这三个哪里来的
numberfound #这三个哪里来的
punctuationfound #这三个哪里来的
1 1 1
不符合规定

进程已结束,退出代码为 0
有大佬帮我下吗?苦思不得其解啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-6 01:26:59 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-7-6 01:30 编辑
import re 

def passwd_test(pw):

    # 低强度
    if re.fullmatch(r"(\d{1,8})|(\w{1,8})", pw):
        # print(re.fullmatch(r"(\d{1,8})|(\w{1,8})", pw))
        return "弱密码"

    # 中强度
    # https://gist.github.com/leadfast/1932460490b637260b92ad9a200d4eac 
    pt0 = re.compile(r"(?=^.{8,15}$)(?=(?:.*?\d){1})(?=(?:.*?[a-zA-Z]){1})(?=(?:.*?[-~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]){1})[-0-9a-zA-Z~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]*$")
    pt1 = re.compile(r"(?=^.{8,}$)(?=(?:.*?[a-zA-Z]){1})(?=(?:.*?[-~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]){1})[-a-zA-Z~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]*$") # 字母和特殊字符的组合,无数字
    pt2 = re.compile(r"(?=^.{8,}$)(?=(?:.*?\d){1})(?=(?:.*?[-~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]){1})[-0-9~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]*$")  # 数字和特殊字符组合,无字母
    pt3 = re.compile(r"\d\w{8,}")  # 数字和字母组合,无特殊字符
    for p in [pt0, pt1, pt2, pt3]:
        if re.search(p, pw):
            return "中强度"

    # 高强度
    pt = re.compile(r"(?=^[a-zA-Z]{1,}.{15,}$)(?=(?:.*?\d){1})(?=(?:.*?[a-zA-Z]){1})(?=(?:.*?[-~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]){1})[-0-9a-zA-Z~!@#\$%\^&\*\(\)_=\/\,.\?<>;:\[\]\{\}\|\\]*$")
    if re.search(pt, pw):
        return "强密码"

print(passwd_test('1234678'))
print(passwd_test('123z678@'))
print(passwd_test('password1234!@#'))   # 中强度,位数不够
print(passwd_test('password1234!@#$'))   # 强密码,刚够16位
print(passwd_test('password1234!@#$.'))  # 强密码
print(passwd_test('100password1234!@#$.')) # 中强度,不是字母开头


正则。。you make me crazy!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-6 09:06:10 | 显示全部楼层
for i in range(0, length + 1):        #  改成  for i in range(0, length):
        cache = password[i:i + 1]            #  改成password[i]  

数组下标越界所致,你仔细数一数,实际上已经输出了9次正确结果
第10次的时候 cache = password[i:i + 1]    实际上 cache还被赋予了一次值,  值的结果为 ''  
然后因为你的  if 为并列关系,所以  cache   匹配了3次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-4 14:42:07 | 显示全部楼层
caps = [i for i in range(65, 91)]+[i for i in range(97, 123)]
digits = [i for i in range(48, 58)]
symbols = [i for i in range(33, 48)]+[i for i in range(58, 65)]+[91, 92, 93, 94, 95, 96, 123, 124, 125]

def isHigh(p: 'passwords') -> bool:
    if len(p) < 16:
        return False
    elif ord(p[0]) not in caps:
        return False
    return (any([bool(ord(i) in caps) for i in p])\
        and any([bool(ord(i) in digits) for i in p])\
            and any([bool(ord(i) in symbols) for i in p]))

def isMedium(p: 'passwords') -> bool:
    if len(p) < 8:
        return False
    x = any([bool(ord(i) in caps) for i in p])
    y = any([bool(ord(i) in digits) for i in p])
    z = any([bool(ord(i) in symbols) for i in p])
    a = x and y and (not z)
    b = x and z and (not y)
    c = y and z and (not x)
    return any([a, b, c])

def isLow(p: 'passwords') -> bool:
    if len(p) > 8:
        return False
    x = any([bool(ord(i) in caps) for i in p])
    y = any([bool(ord(i) in digits) for i in p])
    z = any([bool(ord(i) in symbols) for i in p])
    return y and (not x) and (not z)

def check(p: 'passwrods') -> str:
    if isHigh(p):
        return "高級密碼"
    elif isMedium(p):
        return "中級密碼"
    elif isLow(p):
        return "低級密碼"
    else:
        return "密碼不合法"

def main():
    print(check(input("請輸入密碼:\n")))

if __name__ == "__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表