实验内容
1 、 身份认证系统设计
设计身份认证系统的功能、主要界面、主要软件模块,以及采用的认证技术路线和方法。
2 、 编程实现所设计的身份认证系统
在C++、Python或Java程序设计环境下,编程实现基于S/Key协议的身份认证系统。要求实现的身份认证系统至少具备以下功能:
(1)支持用户名/口令/验证码机制的身份认证;
(2)满足动态口令的技术要求;
(3)当前口令序列使用完毕后能够继续协商;
(4)记录用户登录日志,支持日志查看。
3 、 软件测试及优化。
在实验室所在的局域网内,对设计实现的身份认证系统进行简单的测试,对发现的问题和软件存在的缺陷进行改进和优化。
4 、实验分析和 总结 。
实验思路
本实验采用客户端/服务器的交互模式,来模拟实现基于S/Key协议的身份认证系统
S/Key协议身份认证流程
1.初始化
①用户在客户端输入用户名(应限制用户名的格式,如长度、包含的字符等),并将其发送到服务器
②服务器接收到客户端发送来的用户名,判断该用户名是否已经注册,如果未注册,则向用户发送一个种子:SEED(注意:客户端每次向用户发送的种子应当不同);然后再服务器端应当保存该用户名
③客户端接收到种子之后进行预处理:先将用户名和种子拼接成一个字符串,然后对该字符串进行MD5哈希,再将MD5加密后的结果前16字节和后16字节进行异或运算,结果记为S
2.生成口令序列
①对S进行MD5哈希,得到口令
②将第一个口令发送到服务器,作为初始登录的密码;接下来依次使用第2—N个口令进行登录
3.登录流程
①用户输入口令序列,将输入的内容发送到服务器,在服务器通过对保存下来的密码进行MD5哈希,与口令序列进行比对,验证口令是否正确
②在用户输入用户名时,如果用户名已注册,则直接使用注册时生成的口令序列依次登录
③如果口令验证成功,则服务器生成验证码,发送给用户,用户输入验证码进行登录
④验证码输入正确,则登录成功
4.口令序列使用完毕后的协商策略
①在服务器端记录当前用户可用的口令条数
②每当口令验证成功后,可用的口令条数减一
③口令使用完毕,服务器向用户发送提示和种子,再客户端依据种子重新生成N条口令序列用于登录
实验结果
1. 用户名还未注册:
客户端输入用户名,进行注册:
注册成功后生成5条口令,其中第一条口令存储到服务器端:
客户端可以使用剩下的4条口令进行登录:
使用第1条口令进行登录:
口令验证正确,然后服务器生成验证码,发送给客户端,接下来输入验证码进行登录:
验证码输入正确,登录成功;
2. 用户名已经注册:
如果用户名存在,则直接输入口令进行登录
由于第一条口令已经使用过,再次使用第一条口令会提示登录失败:
此时我们更换第二条口令即可:
如果验证码输入错误,也会导致登录失败:
如果输入正确的验证码,就会登录成功:
3. 用户名已注册,但是生成的口令已经使用完:
会重新进行初始化,生成4条口令,依次使用这四条口令即可进行登录
4. 多个客户端同时登录的情况
可以看到两个客户端同时连接服务器,都成功进行了登录
5. 日志查看功能:
生成log.txt文件,将日志内容添加到文件中
实验源码
基于S/Key协议的身份认证系统设计与实现