1、什么是哈希算法(摘要算法)?
对任意长度的消息可以计算得到固定长度的唯一指纹。(通常用16进制的字符串表示)。
常用的哈希算法有哪些?
MD5,SHA1,SHA224,SH256,SHA384,SHA512
哈希算法通常用在什么场景?
数字签名、用户密码管理、文件完整性检查、防止文件被恶意修改
2、什么是MD5算法?什么是“加盐”,为什么要“加盐”?
md5是一种信息摘要算法,它可以从需要加密的数据中按照一定的规则生成一个特殊的字符串,并且一个文件所对应的MD5摘要是固定的,当文件内容变化后,其MD5值也会不一样。
加盐就是向明文中加入随机数
只要明文相同,那么MD5加密后的密文就相同,于是攻击者就可以通过撞库的方式来破解出明文。加盐就是向明文中加入随机数,然后在生成MD5,这样一来即使明文相同,每次生成的MD5码也不同,如此就加大了暴力破解的难度。
3、编写一个用户注册和登录的程序(两个菜单选项),首先用户输入用户名和密码进行注册,注册时判断用户名是否已存在,若已存在提示用户名已存在;判断用户名是否符合规范(由字母开头,由字母数字下划线组成,长度4-20),否则提示用户名不符合规范;将用户名跟输入的密码所对应的MD5值一起储存在文件user.txt中,并提示注册成功。
登录时输入用户名和密码,判断用户名是否存在user.txt中,否则提示用户名不存在。判断输入的密码跟存在文件中的密码是否一致,不一致则提示密码错误。全部正确则提示登录成功。
(请写出用到的知识点,具体步骤,遇到的问题及解决方法,关键语句说明,以及代码及运行结果截图)
用到的知识点:
文件操作,函数,正则表达式,哈希算法
操作步骤:
利用文件的操作打开并获取了文件的内容,用到了python函数的相关知识,分别完成了注册和登录的两个函数,其次用到了正则表达式,检验了用户名的正确与否,再然后导入了hashlib,完成了MD5值的转化并最终存储在文件中。
关键语句说明:
添加的注释。
import re
import hashlib
flag = True # 循环控制符
def md5(arg): # md5加密函数,将传进来的函数加密并返回加密的值
md5_pwd = hashlib.md5(bytes('admin'.encode('utf-8')))
md5_pwd.update(bytes(arg.encode('utf-8')))
return md5_pwd.hexdigest() # 返回加密的数据
def zhuce():
f = open('user.txt', 'r') # 打开已存在用户的文件,假设文件已经存在
flag = True
name = f.readlines()
f.close()
while flag:
username = input('username:')
check = re.compile("^[a-zA-Z]{1}([a-zA-Z0-9 ]){3,19}$")
if check.match(username):
sign = False # 用户名已存在的标记符
for line in name:
if ( md5(username) == line.split('*')[0]):
sign = True
print('用户名已存在,请重新输入')
if sign != True:
f = open('user.txt', 'a') #注册新的用户
f.write(md5(username))
f.write('*')
password = input('password:')
f.write(md5(password))
f.write('*')
f.write('\n')
f.close()
print('注册成功')
break
else:
print('用户名不符合规范')
def denglu(): # 登录函数
f = open('user.txt', 'r')
flag = True
name = f.readlines()
f.close()
i=0
user = input('输入用户名:')
for line in name:
if (md5(user) == line.split('*')[0]):
print('用户名正确')
pwd = input('输入密码:')
if md5(pwd) == line.split('*')[1]:
print('密码正确,登录成功')
else:
print('密码错误')
else:
i += 1
if len(name)==i:
print('用户名不存在')
break
info = '''
------请输入相关数字-----
1.创建新的用户
2.登陆已有用户
(其他任意键退出菜单)
'''
while flag:
print(info)
i = input()
if i == '1':
zhuce()
elif i=='2':
denglu()
else :
exit()