GoCryptoTCP 是一个基于 Golang 的传输层加密解决方案。
做一些小项目时,有一些加密传输的场景,比如说需要传输账号密码等敏感信息,这就需要加密。HTTPS 协议需要有域名,还需要申请证书。也有一些服务商,提供短期的 IP 证书,其他限制也很多。
如果在不申请证书的情况下,可以考虑在 TCP 或者 HTTP 上,先交换密钥再传输信息。考虑到 TCP 更加灵活和底层,所以选择基于 TCP 进行加密。
所以,GoCryptoTCP 主要想解决的是在传输层上的加密传输。
在 TCP 的 3 次握手之后,GoCryptoTCP 会额外做 2 次握手,互相交换 RSA Public Key,商定 AES KEY 并用公钥加密后交换。后续的消息可以自由选用 RSA 或 AES加密。
GoCryptoTCP 向下封装 TCP的细节,向上提供发送数据流和报文的接口。支持类似websocket的长链接,两端都可以主动推送加密信息。
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 模拟简单的消息队列。
设计如图:
下载 Releases 中的 client.public.exe运行即可。
发送方法:
to [id] [msg]向系统 ID 1000 发送消息,可以得到回文。
如果公共服务器不在线,您可以下载 Releases 中的 client.exe 和 server.exe。先运行 server.exe,后运行 client.exe。
也可以自行在本地编译搭建:
在 clientEg 文件夹下执行:
go build -o client.exe && client.exe在 serverEg 文件夹下执行:
go build -o server.exe && server.exeServer 端额外有一些口令:
status - 查看链接数量
show-conn - 查看所有链接情况,包含id、地址
show-conn [id] - 查看某一id的链接情况
to [id] - 向某一链接发送系统消息- 加入验签
- 测试并发性能,并优化
GoCryptoTCP目前只是一个学生项目,并不能解决中间人攻击问题。- 360的云特征引擎可能误报病毒。项目保证无毒,您也可以自行查看源码,自行编译。
