先在客户端进行摘要,客户端把用户名作为盐。

然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储。或者和文件中的密文对比。

这样即使在网络上用户信息被截获,和存在服务端文件中的用户密码密文也不同。

如果只能摘要一次(加密一次),就在服务端进行摘要。在客户端摘要,和明文一样,别人都能知道你的盐是什么。

用到的知识点:网络编程,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 进行密文登录的更多相关文章

  1. 网络编程应用:基于TCP协议【实现一个聊天程序】

    要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...

  2. 应用代理 socket TCP协议 的资料

    http://blog.csdn.net/guowake/article/details/6615728 Linux下高并发socket最大连接数所受的各种限制 http://stackoverflo ...

  3. TCP协议学习总结(上)

    在计算机领域,数据的本质无非0和1,创造0和1的固然伟大,但真正百花齐放的还是基于0和1之上的各种层次之间的组合(数据结构)所带给我们人类各种各样的可能性.例如TCP协议,我们的生活无不无时无刻的站在 ...

  4. 浅析TCP协议---转载

    https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...

  5. TCP/IP五层模型-传输层-TCP协议

    ​1.定义:TCP是一种面向连接.可靠的.基于字节流的传输控制协议. 2.应用场景:TCP为可靠传输,适合对数据完整性要求高,对延时不敏感的场景,比如邮件. 3.TCP报文:①TCP报文格式: ②TC ...

  6. TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  7. 浅析C#基于TCP协议的SCOKET通信

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  8. TCP协议可靠性数据传输实现原理分析

    http://blog.csdn.net/chexlong/article/details/6123087 TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议.TCP 协议假定其所使 ...

  9. 【转载】TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

随机推荐

  1. 开源中国的 IT 公司开源软件整理计划介绍

    直击现场 <HTML开发MacOSApp教程>  http://pan.baidu.com/s/1jG1Q58M 开源中国的 IT 公司开源软件整理计划介绍 oschina 发布于: 20 ...

  2. Delphi 的RTTI机制浅探3(超长,很不错)

    转自:http://blog.sina.com.cn/s/blog_53d1e9210100uke4.html 目录========================================== ...

  3. 遗漏的SQL语句

    一.简单查询 1.限制返回行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之 ...

  4. .NET Core RC2在Linux下部署

    前言 目前ASP.NET Core RC2已经正式发布了,可以参考如下链接: https://blogs.msdn.microsoft.com/dotnet/2016/05/06/net-core-r ...

  5. 可以用变量指定大小的Bits对象实现

    c++的容器中有位对象bitset,但是个人认为最大的问题是定义是必须指定常数大小,比如 bitset<3> bit; 无法实现 int n = 3; bitset<n> bi ...

  6. pytorch实现yolov3(2) 配置文件解析及各layer生成

    配置文件 配置文件yolov3.cfg定义了网络的结构 .... [convolutional] batch_normalize=1 filters=64 size=3 stride=2 pad=1 ...

  7. java线程的简单实用

    1.start(): 先来看看Java API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法) ...

  8. ASP.NET Core MVC 之路由(Routing)

     ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序的URL命名形式,使得它 ...

  9. laravel配置不同环境的配置文件

    //在入口bootstrap/App.php中 $env = $app->detectEnvironment( function () use ($app) { $uname = php_una ...

  10. Django中CBV View的as_view()源码解析

    CBV与FBV路由区别 urlpatterns = [ url(r'^publish/$', views.Publishs.as_view()), # CBV写法 url(r'^publish/$', ...