信息系统安全实验(九):单机环境下的基于口令的身份认证(含python代码:撒盐+哈希)
这是信息系统安全实验系列的第九篇~
1. 实验目的
掌握单机环境下的基于口令的身份认证:掌握口令处理方法、掌握撒盐身份认证的原理、编程实现本实验的三个部分:口令字段生成算法,口令字段维护算法,身份认证算法。
2. 背景知识
(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 ,则认证成功,否则,认证失败。
3. 实验过程记录
(1)代码
运行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...")
saltedpw = str(addsalt(salt, pw))
dp = []
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):
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: ")
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)
(2)创建用户
① 创建第一个用户’xiuxiu’,密码为’suhanting98’
② 创建第二个用户’yaoyao’,密码为’youling99’
(2)验证用户
① 输入不存在的用户名’mimi’
② 输入用户名’xiuxiu’和正确的密码’suhanting98’
③ 输入用户名’yaoyao’和错误的密码’youling98’