#加入随机salt的哈希运算验证
import random
from hashlib import sha256
from hmac import HMAC
#意义在于,随机halt哈希混淆运算后的数据极难被反推出密码原文,彩虹字典的暴力破解难度极大
#参数r_pass为密码原文,salt可选,返回一个带slat与加密后的字符串
def get_pass(r_pass,salt=None):
if salt == None:
salt=sha256(str(random.random()).encode('utf-8')).hexdigest()[-8:]
#先生成一个HMAC()对象,然后再调用digest()生成hash之后的结果
password=HMAC(salt.encode('utf-8'),r_pass.encode('utf-8'),sha256).hexdigest()
return ('%s$%s'%(salt,password))
#参数r_pass为再次输入的原文密码,password为第一次哈希后的字符串
def check_pass(r_pass,password):
salt=password.split('$')[0]
return password == get_pass(r_pass,salt)
#run
if __name__ == "__main__":
password=input('请输入密码:\n')
p=get_pass(password)
while True:
pass_=input('请再次输入密码:\n')
if check_pass(pass_,p):
print('密码正确')
break
else:
print('密码错误')