信息系统安全实验(九):单机环境下的基于口令的身份认证(含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’

信息系统安全实验(九):单机环境下的基于口令的身份认证(含python代码:撒盐+哈希)

②    创建第二个用户’yaoyao’,密码为’youling99’

信息系统安全实验(九):单机环境下的基于口令的身份认证(含python代码:撒盐+哈希)

(2)验证用户

①    输入不存在的用户名’mimi’

信息系统安全实验(九):单机环境下的基于口令的身份认证(含python代码:撒盐+哈希)

②    输入用户名’xiuxiu’和正确的密码’suhanting98’

信息系统安全实验(九):单机环境下的基于口令的身份认证(含python代码:撒盐+哈希)

③    输入用户名’yaoyao’和错误的密码’youling98’

信息系统安全实验(九):单机环境下的基于口令的身份认证(含python代码:撒盐+哈希)