用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已经有了全面了解的人. ...
随机推荐
- QML被系统缓存的原理是比较时间戳
Gunnar Roth January 25, 2017 at 17:07 Afaik the cached qml file contains a checksum of the original ...
- Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法
最近在Delphi开发中用到了无边框窗体显示时,无法在任务栏使用右键弹出菜单的情况,经过整理,通过以下方法可以使右键菜单出现: procedure Tfrm_Base.InitSysMenu;var ...
- windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)
最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法 ...
- SYN2306A型 GPS北斗双模授时板
SYN2306A型 GPS北斗双模授时板 北斗gps时钟北斗授时设备北斗时钟同步系统使用说明视频链接: http://www.syn029.com/h-pd-211-0_310_36_-1.html ...
- 【转】Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录
转自:http://blog.csdn.net/cloudday/article/details/8640234 1. 启动VSFTP服务器 A:cenos下运行:yum install vs ...
- python三大主流web框架之Django安装、项目搭建
这一篇我们将迎来python强大的web框架Django,相信大家都已经不陌生,本篇将介绍Django的安装及基础项目搭建,大神略过~ Django是需要我们手动pip安装的,首先我们来安装Djang ...
- 报错:java.sql.SQLException: The server
报错:java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized 在IDEA运行是报出例如相识的错误时: ...
- Python自学day-14
一.默认创建的HTML5文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- spring 5.x 系列第7篇 —— 整合Redis客户端 Jedis和Redisson (xml配置方式)
文章目录 一.说明 1.1 Redis 客户端说明 1.2 Redis可视化软件 1.3 项目结构说明 1.3 依赖说明 二.spring 整合 jedis 2.1 新建基本配置文件 2.2 单机配置 ...
- 本地线程-ThreadLocal
线程本地存储是一个自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储.简单来说,就是对于某个变量,针对不同的线程存储不同的值. 实例: import java.util.Random; i ...