SKey 身份认证协议的代码实现

本项目为课程实验内容,简单模拟了通过S/Key协议进行身份认证的过程。

运行环境

系统:Arch Linux

语言:Python 3.9

IDE:Pycharm

实现的功能

  1. S/Key协议身份认证
  2. 用户登录日志记录

本项目中S/Key协议认证过程

  1. 客户端连接服务器,提示用户输入用户名,将输入的用户名发送到服务器
  2. 服务器在用户信息字典中查询,根据用户名是否存在向客户端发送不同的反馈信息
  3. 客户端收到反馈信息,根据内容判断:
  4. 用户名不存在,接受服务器发送的 Seed,与用户名首尾相连后进行一次 MD5 哈希,然后前 8 位与后 8 位进行异或运算,得到 S。对 S 进行 MD5 运算 1 次,得到第 n 个密码;2 次得到第 n-1 个密码;…;n 次得到第 1 个密码。将第一个密码发送到服务器保存在用户信息字典中,依次使用第 2 到 n 个口令进行登录。www.biyezuopin.vip
  5. 用户名存在,但是生成的 n 个口令已使用完,则进行初始化,过程和用户名不存在的情况一样。
  6. 用户名存在,且 n 个口令未使用完,则直接提示用户输入口令。
  7. 用户输入口令,然后输入验证码(若输入错误,则验证码重新生成,提示用户再次输入,直到输入正确)发送到服务器,服务器接收到客户端发送的口令之后,对其进行一次 MD5 哈希运算,将所得结果与用户信息字典中的上一个口令进行比较,根据是否一致发送不同的反馈信息给客户端。
  8. 客户端收到反馈,若两者一致,则允许登录;否则不允许登录。

对于每一次登录,无论是否成功,都需要记录,记录信息包括时间、用户名、登录是否成功。

结果分析

服务器端正常情况下没有任何输出,只会记录日志文件。

客户端连接上服务器后输入用户名(初始,不存在该用户,进行注册并生成新的口令):

[

auth登录认证python python用户认证_协议

]

手动将生成的口令复制到本地文件中,然后使用第 1 个口令(实际是生成的第二个口令,因为真正的第一个口令已经发送到了服务器端进行保存)登录,登录成功。www.biyezuopin.vip

[

auth登录认证python python用户认证_协议_02

]

然后再次登录,此时仍使用第一个口令,查看结果,发现登录失败。

auth登录认证python python用户认证_协议_03

使用第二个口令尝试,登录成功。

auth登录认证python python用户认证_身份认证_04

当四个口令使用完后,再次尝试登录,重新生成口令。

auth登录认证python python用户认证_协议_05

注册一个新的用户,确保服务器在多个用户存在的前提下仍能正常工作。

[

auth登录认证python python用户认证_身份认证_06

]

对于每一次的用户登录,服务器均会记录日志,对于以上登录过程,记录的日志内容如下图所示。

auth登录认证python python用户认证_身份认证_07