一个简单的密码登录系统,md5加密,输入回显*,强密码,该有的都有,用来学习是极好的。

# 简单密码登录系统V0.3,功能:注册,登录和修改密码,操作成功返回1
# 新注册和修改密码必须输入两次密码,新注册的用户名不能与已有用户重复。
# 限制登录操作次数为3次。密码用md5加密存储。密码为强密码,输入回显为'*'
import hashlib
import re

def md5(arg):
    md5 = hashlib.md5(bytes("admin", encoding="utf-8"))
    md5.update(bytes(arg, encoding="utf-8"))
    return md5.hexdigest()

def log(user,pwd):
    with open('passwd.txt', 'r') as f:
        for line in f:
            u = line.strip().split('|')
            if u[0] == md5(user) and u[1] == md5(pwd):
                return True

def register(user,pwd):
    with open('passwd.txt', 'r+') as f:
        f.seek(0)
        t = md5(user)
        for line in f:
            u = line.strip().split('|')
            if t == u[0]:
                return False
        f.write(t+'|'+md5(pwd)+'\n')
        return True

def modify(user,pwd):
    with open('passwd.txt', 'r') as f:
        lines = f.readlines()
    with open('passwd.txt', 'w') as wf:
        t = md5(user)
        for line in lines:
            u = line.strip().split('|')
            if t == u[0]:
                line = line.replace(u[1], md5(pwd))
            wf.write(line)
        return True

def pwd_input(msg):
    import msvcrt
    import sys
    if msg:
        print(msg, end='', flush=True)
    pw = []
    while True:
        ch = msvcrt.getch()
        if ch == b'\r' or ch == b'\n':    # 回车
            print('')
            return b''.join(pw).decode()  # 把pw转换为字符串返回
            break
        elif ch == b'\x08':    # 退格
            if pw:
                pw.pop()
                msvcrt.putch(b'\b')
                msvcrt.putch(b' ')
                msvcrt.putch(b'\b')
        elif ch == b'\x1b' or ch == b'\x03':    # ESC或者Ctrl+C
            break
        else:
            pw.append(ch)
            msvcrt.putch(b'*')
    return b''.join(pw).decode()

def menu(i):
    if i == 1:
        count = 1
        while count <= 3:
            user = input("请输入用户名:")
            pwd = pwd_input("请输入密码:")
            if user == '' or user.strip() == '' or pwd == '' or pwd.strip() == '':
                print("用户名,密码不能为空,请重新输入!")
            elif log(user, pwd):
                print("登录成功!")
                exit(1)
            else:
                print("用户名或密码不对,登录失败!")
            count += 1
            if count == 4:
                print("密码输入次数过多!")
                exit(0)
            else:
                print("还有%d次尝试机会!" % (4 - count))
    elif i == 2:
        while True:
            user = input("请输入用户名:")
            pwd1 = pwd_input("请输入密码:")
            pwd2 = pwd_input("请再次输入密码:")
            if user == '' or user.strip() == '' or pwd1 == '' or pwd1.strip() == ''\
                or pwd2 == '' or pwd2.strip() == '':
                print("用户名,密码不能为空,请重新输入!")
            elif pwd1 != pwd2:
                print("两次输入的密码不同,请重新输入!")
            else:
                break
        p_match = re.match(r'.*(?=.{8,})(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*?]).*$', pwd1)
        if not p_match:
            print("密码必须为8位以上大小写字母、数字和符号的组合!")
        elif register(user, pwd1):
            print("注册成功!")
            exit(1)
        else:
            print("注册失败,该用户已存在!")
    elif i == 3:
        while True:
            user = input("请输入用户名:")
            pwd1 = pwd_input("请输入旧密码:")
            pwd2 = pwd_input("请输入新密码:")
            pwd3 = pwd_input("请再次输入新密码:")
            if user == '' or user.strip() == '' or pwd1 == '' or pwd1.strip() == ''\
                or pwd2 == '' or pwd2.strip() == '' or pwd3 == '' or pwd3.strip() == '':
                print("用户名,密码不能为空,请重新输入!")
            elif log(user, pwd1):
                if pwd2 != pwd3:
                    print("两次输入的密码不同,请重新输入!")
                else:
                    break
            else:
                print("用户名或密码不对,请重新输入!")
        p_match = re.match(r'.*(?=.{8,})(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*?]).*$', pwd2)
        if not p_match:
            print("密码必须为8位以上大小写字母、数字和符号的组合!")
        else:
            modify(user, pwd2)
            print("密码修改成功!")
            exit(1)
    elif i == 0:
        print("谢谢使用,再见!")
        exit(0)
    else:
        print("输入错误,请重新输入")

while True:
    i = input('****系统登录****\n'
             '    0.退出\n'
             '    1.登录\n'
             '    2.注册\n'
             '    3.修改密码\n'
             '**************\n'
             '请输入您的选择:')
    if i.isdigit():
        menu(int(i))
    else:
        print("输入错误,请重新输入")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值