用tcp协议实现一个并发的socketserver 进行密文登录
先在客户端进行摘要,客户端把用户名作为盐。
然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储。或者和文件中的密文对比。
这样即使在网络上用户信息被截获,和存在服务端文件中的用户密码密文也不同。
如果只能摘要一次(加密一次),就在服务端进行摘要。在客户端摘要,和明文一样,别人都能知道你的盐是什么。
用到的知识点:网络编程,socketserver模块,hashlib模块对密码进行加密,struct模块解决黏包问题
#userinfo文件
zhangsan|5701564ecae32e15698e774d993d6b2306028de0
lisi|099841fab9a5d7ef090eb725059b9b656efe25e5
#服务端代码:
import struct
import socketserver
import hashlib
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
salt = '加盐了'.encode('utf-8')#在服务端设置固定的盐
while True:
try:
len = conn.recv(4)
name_len = struct.unpack('i',len)[0]
name = conn.recv(name_len).decode('utf-8')
ret = conn.recv(1024).decode('utf-8')
sha = hashlib.sha1(salt) #在服务端加固定的盐
sha.update(ret.encode('utf-8'))#对加密后的密码进行二次加密
res = sha.hexdigest()
with open('userinfo',encoding='utf-8',mode='r') as f:
for line in f:
line_lst = line.strip().split('|')
if name == line_lst[0] and res == line_lst[1]:
print('登录成功')
conn.send('登录成功'.encode('utf-8'))
break
else:
print('登录失败')
conn.send('登录失败'.encode('utf-8'))
except ConnectionResetError:
break
server = socketserver.ThreadingTCPServer(('192.168.14.91',9003),Myserver)
server.serve_forever()
#客户端代码:
import socket
import struct
import hashlib
sk = socket.socket()
sk.connect(('192.168.14.247',9003))
name = input('请输入用户名:') #zhangsan
password = input('请输入密码:').encode('utf-8') #123456
sha = hashlib.sha1(name.encode('utf-8'))#针对于每个账户,每个账户的盐都不一样
sha.update(password)
ret = sha.hexdigest()
name_len = struct.pack('i',len(name))
sk.send(name_len)
sk.send(name.encode('utf-8'))#发送用户名
sk.send(ret.encode('utf-8'))#发送摘要后的密码
msg = sk.recv(1024).decode('utf-8')
print(msg)
用tcp协议实现一个并发的socketserver 进行密文登录的更多相关文章
- 网络编程应用:基于TCP协议【实现一个聊天程序】
要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...
- 应用代理 socket TCP协议 的资料
http://blog.csdn.net/guowake/article/details/6615728 Linux下高并发socket最大连接数所受的各种限制 http://stackoverflo ...
- TCP协议学习总结(上)
在计算机领域,数据的本质无非0和1,创造0和1的固然伟大,但真正百花齐放的还是基于0和1之上的各种层次之间的组合(数据结构)所带给我们人类各种各样的可能性.例如TCP协议,我们的生活无不无时无刻的站在 ...
- 浅析TCP协议---转载
https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...
- TCP/IP五层模型-传输层-TCP协议
1.定义:TCP是一种面向连接.可靠的.基于字节流的传输控制协议. 2.应用场景:TCP为可靠传输,适合对数据完整性要求高,对延时不敏感的场景,比如邮件. 3.TCP报文:①TCP报文格式: ②TC ...
- TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- 浅析C#基于TCP协议的SCOKET通信
TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...
- TCP协议可靠性数据传输实现原理分析
http://blog.csdn.net/chexlong/article/details/6123087 TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议.TCP 协议假定其所使 ...
- 【转载】TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
随机推荐
- 使用MSYS2环境中编译Qt5.5.0的补丁
Qt的configure脚本对MinGW静态编译支持不太完善,总有这样那样的问题.如果你不嫌麻烦,而且可以接受高版本的Qt的话,可以考虑使用我做的补丁在MSYS2环境中编译.Qt5.4.2的补丁 Qt ...
- CentOS7中firewalld的安装与使用详解
一.软件环境 [root@Geeklp201 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 二.安装firewall ...
- web.congfig 禁用 ViewState Session
<!--禁用 ViewState Session--> <pages enableViewState="false" enableSessionState=&qu ...
- [转]Android的taskAffinity
Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系.我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Tas ...
- Java系统架构师学习体系图
- 你的http需要“爱情”
目的是为了更白话的认识http,面对业内人,还有一些吃瓜的... 故事背景描述: 男猪脚在情人节这天给他女票发送了一条信息,"I love U",女主角收到后很开心,也回复了一条信 ...
- SkyWorking基础:6.2版本安装部署
就在今天,SkyWorking发布了6.2版本. 概述 什么是SkyWorking SkyWalking是观察性分析平台和应用性能管理系统. 提供分布式追踪.服务网格遥测分析.度量聚合和可视化一体化解 ...
- 搭建minima主题的github博客网站
layout: post title: "搭建minima主题的github博客网站" date: 2019-04-20 19:20:20 +0800 --- 作者:吴甜甜 个人博 ...
- 通过phpmyadmin设置数据库密码后若出现phpmyadmin拒绝访问的情况
方法一:可以修改config.inc.php配置文件中的$cfg['Servers'][$i]['password'] = '你的密码'; 方法二:将config.inc.php配置文件中的$cfg[ ...
- Spring中的配置文件文件位置
在Java开发中,一般在Spring框架中,classpath的位置是指src下,在IDEA中一般是指resource中 配置文件 位置:任意,开发中一般在classpath下(src) 名称:任意, ...