单机环境下基于口令的身份认证
Posted caishunzhe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单机环境下基于口令的身份认证相关的知识,希望对你有一定的参考价值。
背景知识
(1)口令字段信息的处理方法
① 接收用户提供的口令Dpw ;
② 生成一个盐值:Dsalt=Arandom( ) ;
③ 生成口令信息:s=Agen(Dsalt,Dpw) ;
④ 把口令信息s 和Dsalt 存入数据库的口令字段中。
(2)口令字段信息的生成算法
① 给口令Dpw 撒盐:Dpw=Asalt(Dsalt,Dpw) ;
② 用撒盐结果做密钥:K=Dpw ;
③ 用一个64 位的全0 的二进制位串构造一个数据块Dp ;
④ 设循环次数初值:i=0 ;
⑤ 对数据块加密:Dc=Acrypt(K,Dp) ;
⑥ Dp=Dc, i=i+1 ;
⑦ 如果i<25 ,则回到⑤;
⑧ 把数据块变换成字符串:s=Atrans(Dc) ;
⑨ 返回s 。
(3)给口令撒盐的算法
① 把盐值附加到口令上:Dtmp=Dpw||Dsalt ;
② 生成哈希值:Dhash=Ahash(Dtmp) ;
③ 以Dhash 作为返回结果。
(4)身份认证算法
① 接收用户提供的账户名Dname 和口令Dpw ;
② 在账户信息数据库中检查Dname 的合法性,如果合法,则找出其对
应的s 和Dsalt ;
③ 生成临时口令信息:sr=Agen(Dsalt,Dpw) ;
④ 如果sr=s ,则认证成功,否则,认证失败。
具体操作过程
编写代码pwprocessing.py
import random import string #给口令加盐 def addsalt(salt, pw): print("Adding salt...") pw = pw + salt print("Salt added.") return hash(pw) #加密的实现 def ecrypt(dp, key, i): print("Ecrypting data using your password...(round " + str(i+1) + ")") for i in range(0, len(dp)): index = i % len(key) if(key[index] == ‘-‘): dp[i] = str(int(dp[i]) % 10) else: dp[i] = str((int(dp[i]) + int(key[index])) % 10) return dp #口令字段信息的生成算法 def generate(salt, pw): print("Generating data ecrypted by your password...") #给口令Dpw 撒盐,用撒盐结果做密钥 saltedpw = str(addsalt(salt, pw)) dp = [] #用一个64 位的全0 的二进制位串构造一个数据块 for i in range(0, 64): dp.append(‘0‘) #对数据块加密 for i in range(0, 25): dp = ecrypt(dp, saltedpw, i) print("Data ecrypted by your password generated.") return dp #创建用户 def createuser(database): print("Creating user...") print("Input ‘q‘ as username if you want to quit.") while(1): name = input("username: ") if name == ‘q‘: break pw = input("password: ") salt = ‘‘.join(random.sample(string.ascii_letters + string.digits, 8)) s = generate(salt, pw) dic = {} dic[‘name‘] = name dic[‘salt‘] = salt dic[‘pw‘] = s database.append(dic) print("User " + name + " is created.") #直接通过字典匹配用户,检查此用户是否存在 def has_user(database, name): for dic in database: if dic[‘name‘] == name: return 1 return 0 #得到用户的具体信息 def get_info(database, name): for dic in database: if dic[‘name‘] == name: salt = dic[‘salt‘] s = dic[‘pw‘] return salt, s #身份认证算法 def authenticate(database): print("Authenticating user...") print("Input ‘q‘ as username if you want to quit.") while(1): #接收用户提供的账户名Dname ; name = input("username: ") if name == ‘q‘: break flag = has_user(database, name) if flag == 0: print("Sorry, user " + name + " does not exist.") continue #接受用户提供的口令 pw = input("password: ") #在账户信息数据库中检查Dname 的合法性,如果合法,则找出其对 #应的s 和Dsalt salt, s = get_info(database, name) #生成临时口令信息 sr = generate(salt, pw) print("Comparing ecrypted data...") if(s == sr): print("User " + name + " authenticated.") else: print("Sorry, the password is wrong.") database = [] createuser(database) authenticate(database)
创建用户
① 创建第一个用户”csz”,密码为”csz”
② 创建第二个用户”cy”,密码为”cy”
验证用户
① 输入不存在的用户名”feng”
② 输入用户名”csz”和正确的密码”csz”
③ 输入用户名”cy”和错误的密码”521”
③ 输入用户名”cy”和正确的密码”cy”
以上是关于单机环境下基于口令的身份认证的主要内容,如果未能解决你的问题,请参考以下文章