Skip to content

BacklitCat/GoCryptoTCP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GoCryptoTCP

一句话简介

GoCryptoTCP 是一个基于 Golang 的传输层加密解决方案。

提出动机

做一些小项目时,有一些加密传输的场景,比如说需要传输账号密码等敏感信息,这就需要加密。HTTPS 协议需要有域名,还需要申请证书。也有一些服务商,提供短期的 IP 证书,其他限制也很多。

如果在不申请证书的情况下,可以考虑在 TCP 或者 HTTP 上,先交换密钥再传输信息。考虑到 TCP 更加灵活和底层,所以选择基于 TCP 进行加密。

所以,GoCryptoTCP 主要想解决的是在传输层上的加密传输。

工作原理

TCP3 次握手之后,GoCryptoTCP 会额外做 2 次握手,互相交换 RSA Public Key,商定 AES KEY 并用公钥加密后交换。后续的消息可以自由选用 RSAAES加密。

GoCryptoTCP 向下封装 TCP的细节,向上提供发送数据流和报文的接口。支持类似websocket的长链接,两端都可以主动推送加密信息。

img

消息设计

var (
	ApplyCrypto  = 1
	AcceptCrypto = 2
	RejectCrypto = 3
	CryptoMsgRSA = 4
	CryptoMsgAES = 5
)

type Msg struct {
	MsgType   int    `json:"msgType"`
	From      int    `json:"from"`
	To        int    `json:"to"`
	Body      []byte `json:"body,omitempty"`
	RSAPubKey []byte `json:"RSAPubKey,omitempty"`
	AESKey    []byte `json:"AESKey,omitempty"`
	Sign      []byte `json:"sign,omitempty"`
}

避免沾包方式:发送数据后添加\n

项目演示

为了演示项目,采用 C/S 架构搭建了公共通讯服务器。 ID Pool 负责在加密建立时在o(1)内为 Client 分配临时的不重复 ID 。 为了加大并发吞吐量,用 Channel 模拟简单的消息队列。 设计如图:

img

下载 Releases 中的 client.public.exe运行即可。

img

发送方法:

to [id] [msg]

向系统 ID 1000 发送消息,可以得到回文。

如果公共服务器不在线,您可以下载 Releases 中的 client.exeserver.exe。先运行 server.exe,后运行 client.exe

也可以自行在本地编译搭建:

clientEg 文件夹下执行:

go build -o client.exe && client.exe

serverEg 文件夹下执行:

go build -o server.exe && server.exe

Server 端额外有一些口令:

status - 查看链接数量
show-conn - 查看所有链接情况,包含id、地址
show-conn [id] - 查看某一id的链接情况
to [id] - 向某一链接发送系统消息

未来计划

  1. 加入验签
  2. 测试并发性能,并优化

其他

  1. GoCryptoTCP 目前只是一个学生项目,并不能解决中间人攻击问题。
  2. 360的云特征引擎可能误报病毒。项目保证无毒,您也可以自行查看源码,自行编译。

About

Encrypt TCP by Golang. 对TCP进行加密。

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages