> # ♻️ 资源
> **大小:** 9.82KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010928**](https://www.yuque.com/sxbn/ks/100010928)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87484794**](https://download.csdn.net/download/s1t16/87484794)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 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 个口令进行登录。
5. 用户名存在,但是生成的 n 个口令已使用完,则进行初始化,过程和用户名不存在的情况一样。
6. 用户名存在,且 n 个口令未使用完,则直接提示用户输入口令。
7. 用户输入口令,然后输入验证码(若输入错误,则验证码重新生成,提示用户再次输入,直到输入正确)发送到服务器,服务器接收到客户端发送的口令之后,对其进行一次 MD5 哈希运算,将所得结果与用户信息字典中的上一个口令进行比较,根据是否一致发送不同的反馈信息给客户端。
8. 客户端收到反馈,若两者一致,则允许登录;否则不允许登录。
对于每一次登录,无论是否成功,都需要记录,记录信息包括时间、用户名、登录是否成功。
## 代码实现
首先需要写出保证客户端与服务器通信的代码,该内容代码略,使用端口号为 9999。测试成功后,则同时写客户端和服务器的代码。
对于服务器,开启后将监听 9999 端口,当有客户端连接时,则准备接受用户名。服务器有一个用户信息字典,当收到用户名后,在用户信息字典中查找,若没有该用户,则返回’2’给客户端;若当前用户存在,但生成的口令已经用完,则返回’0’;若当前用户存在,且口令还没有用完,则返回’1’。
而客户端在连接上服务器后,提示用户输入用户名并发送,然后等待服务器的回复,根据服务器回复的内容判断下一步的操作。
如果得知当前用户不存在或者口令已用完,则需要初始化,服务器端发送 seed。客户端收到 seed,与当前用户名连接在一起,进行一次 MD5 运算,得到 32 位的字符串后,将其分为左右两部分,每部分 16 位,进行异或运算,得到 S。之后根据 S/Key 协议原理,生成 n 个口令,并将第一个口令发送给服务器进行保存。服务器收到第一个口令后,将其存储起来,然后等待客户端发送来登录口令。收到后,进行一次 MD5 运算(代码和客户端一样),然后与保存的上一条口令比较,若相同,则说明口令正确,返回 “1”;否则,则说明口令错误,返回 “0”。在客户端发送口令之前,还需要输入验证码。验证码为 4 个数字,输入正确则发送口令给服务器进行验证;否则重新生成验证码,提示用户输入,直到用户输入正确,才允许将口令发送给服务器进行验证,根据服务器的反馈结果确定口令是否正确。
服务器端对于每一次用户尝试登录,无论是否成功,都需要记录日志,日志文件保存在 /path/to/SKeyServer/log.txt 处。记录的内容包括时间、用户名、是否登录成功。
## 结果分析
服务器端正常情况下没有任何输出,只会记录日志文件。
客户端连接上服务器后输入用户名(初始,不存在该用户,进行注册并生成新的口令):
[![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224475-3b604b5f-e1ba-4e65-b179-ba9443b2b458.png#averageHue=%23302f2e&from=url&id=S3ntZ&originHeight=254&originWidth=648&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)](https://img.litcu.cn/img/202203251244371.png)
手动将生成的口令复制到本地文件中,然后使用第 1 个口令(实际是生成的第二个口令,因为真正的第一个口令已经发送到了服务器端进行保存)登录,登录成功。
[![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224553-bdcb3709-efee-49d9-8219-b2f27b5f6ce2.png#averageHue=%232e2d2c&from=url&id=g6C5b&originHeight=192&originWidth=392&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)](https://img.litcu.cn/img/202203251244372.png)
然后再次登录,此时仍使用第一个口令,查看结果,发现登录失败。
[![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224648-7546372f-01e8-4cd4-b6cb-0c738b0b7d15.png#averageHue=%232e2d2c&from=url&id=SiUbw&originHeight=287&originWidth=392&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)](https://img.litcu.cn/img/202203251244373.png)
使用第二个口令尝试,登录成功。
[![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224740-a3d38e86-04ff-403f-939c-bb691c82c8b4.png#averageHue=%2332302e&from=url&id=rxhYH&originHeight=333&originWidth=385&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)](https://img.litcu.cn/img/202203251244374.png)
当四个口令使用完后,再次尝试登录,重新生成口令。
[![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224798-4667bbc2-65de-428e-983c-9e8e8eb53a40.png#averageHue=%23312f2e&from=url&id=AETFt&originHeight=346&originWidth=410&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)](https://img.litcu.cn/img/202203251244375.png)
注册一个新的用户,确保服务器在多个用户存在的前提下仍能正常工作。
[![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224870-f14b8d10-0a4e-453c-ad7f-75285371c77c.png#averageHue=%2332302e&from=url&id=AQlSw&originHeight=333&originWidth=385&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)](https://img.litcu.cn/img/202203251244376.png)
对于每一次的用户登录,服务器均会记录日志,对于以上登录过程,记录的日志内容如下图所示。
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1717030224937-9f50bb11-6453-4a2a-9dbc-f531a2dbb5df.png#averageHue=%230f3843&from=url&id=NDT5I&originHeight=228&originWidth=468&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010928 本项目为课程实验内容,简单模拟了通过S/Key协议进行身份认证的过程。
资源推荐
资源详情
资源评论
收起资源包目录
100010928-基于Python SKey 身份认证协议的代码实现.zip (14个子文件)
s-key
SKeyClient
.idea
SKeyClient.iml 284B
misc.xml 196B
inspectionProfiles
profiles_settings.xml 174B
modules.xml 272B
.gitignore 180B
client.py 2KB
LICENSE 1KB
SKeyServer
.idea
misc.xml 196B
inspectionProfiles
profiles_settings.xml 174B
SKeyServer.iml 284B
modules.xml 272B
.gitignore 180B
server.py 3KB
README.md 8KB
共 14 条
- 1
资源评论
- 亦昕.112023-05-10这个资源值得下载,资源内容详细全面,与描述一致,受益匪浅。
- billykan2023-05-01资源不错,对我启发很大,获得了新的灵感,受益匪浅。
神仙别闹
- 粉丝: 2708
- 资源: 7670
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功