前景
今天学到了一个模块hashlib,通过廖老师的文章,我猛然发现!原来存储在数据库里面的用户名的密码是经过hash算法之后的,而不是明文!真的是学到了!然后转念一想,计从心来,自己模拟了一个登录
思路
- 用一个字典充当数据库
- 四个方法,分别实现
- 注册
- 验证码
- 登录(验证输入的信息)
- 将新用户的信息储存进字典里面,密码用md5算后,再存储
主要功能
- 注册
- 对密码进行检验,必须由大,小写字母、数字、特殊字符构成
- 检验用户名是否已存在
- 输入验证码
- 验证
- 对用户名检验,必须为已存的用户
- 验证码检验
- 密码检验
代码
import hashlib
from PIL import Image, ImageFont, ImageDraw, ImageFilter
import random
def image():
str1 = ''
total = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789'
# 图片大小130 x 50
width = 130
height = 50
# 先生成一个新图片对象
im = Image.new('RGB', (width, height), 'white')
# 设置字体
font = ImageFont.truetype('FreeSans', 40)
# 创建draw对象
draw = ImageDraw.Draw(im)
# 输出每一个文字
for item in range(5):
temp = random.choice(total)
draw.text((5 + random.randint(4, 7) + 20 * item, 5 + random.randint(3, 7)), text=temp,
fill='black', font=font)
str1 += temp
# 划几根干扰线
for num in range(8):
x1 = random.randint(0, width / 2)
y1 = random.randint(0, height / 2)
x2 = random.randint(0, width)
y2 = random.randint(height / 2, height)
draw.line(((x1, y1), (x2, y2)), fill='black', width=1)
# 模糊下,加个帅帅的滤镜~
im = im.filter(ImageFilter.FIND_EDGES)
im.show()
return str1
def store(user, secret, db):
md5 = hashlib.md5()
md5.update(secret.encode('utf-8'))
result = md5.hexdigest()
db[user] = result
def verify(db):
while True:
result1 = image()
username = input('输入你的用户名\n')
secret = input('输入你的密码:\n')
code = input('输入你的验证码:\n')
md5 = hashlib.md5()
md5.update(secret.encode('utf-8'))
result = md5.hexdigest()
if username not in db:
print('用户名不存在')
elif result1 != code:
print('验证码输入错误')
elif db[username] == result:
print('验证通过,欢迎光临')
break
else:
print('密码不正确,请重新输入')
def register(db):
while True:
username = input('输入你的用户名\n')
if username in db.keys():
print('用户名已存在,请重新输入')
continue
result = image()
secret = input('输入你的密码:\n')
code = input('输入你的验证码:\n')
dicta = {'number': 0, 'lower': 0, 'upper': 0, 'other': 0}
for item in secret:
if item.isdigit():
dicta['number'] += 1
elif item.islower():
dicta['lower'] += 1
elif item.isupper():
dicta['upper'] += 1
else:
dicta['other'] += 1
if dicta['lower'] < 1 or dicta['upper'] < 1 or dicta['number'] < 1 or dicta['other'] < 1:
print('密码必须有大、小写字母,数字,和特殊字符四部分组成,请重新输入')
elif code != result:
print('验证码输入错误')
else:
print('验证通过,欢迎光临')
break
return username, secret
if __name__ == '__main__':
database = {'肖鑫': '67ae79674e56657bb652bd02f7251474'}
receive = input('欢迎光临,输入您的身份,新用户(1),老客户(2)\n')
if receive == '1':
user, password = register(database)
store(user, password, database)
print(database)
elif receive == '2':
verify(database)
实验结果
欢迎光临,输入您的身份,新用户(1),老客户(2)
1
输入你的用户名
肖鑫
用户名已存在,请重新输入
输入你的用户名
hello
输入你的密码:
Lyy1314520!
输入你的验证码:
XtvzG
验证通过,欢迎光临
{'肖鑫': '67ae79674e56657bb652bd02f7251474', 'hello': '67ae79674e56657bb652bd02f7251474'}
总结
经过上次折腾了验证码,现在拿出来用咯~这个是我第一次完全由自己编写的小程序,实现了简单的功能,是我现在想到的最好的方案,如果读者有更好的,望不吝赐教。