两个加密聊天项目

Posted by Ivan on 2018-03-24

许多小伙伴看到我的GitHub最近动态关注了很多Golang的项目,不禁私信问我,是不是在学Go语言,没错,确实在学。本文探讨这两个项目是什么,并且解释一下如何使用golang.org/x/crypto/otr包。

为什么学Golang?

golang

因为Golang十分优秀呀,能够轻而易举的写很多服务端程序,并发能力十足且简单,不禁引起了我的注意。

作为初学者,撸了两个项目,作为学习经验,代码很渣,只为实现功能,做一个小demo。

第一周 UDP加密聊天室

chatroom - UDP加密聊天室

众所周知,做聊天室是作为学习服务端/客户端的最佳例子,但是单纯的撸一个聊天室未必太无聊了。

这个项目的特色在于:

  1. 能够自行生成配置文件,类似于某影的方式,客户端和服务端分别导入配置文件,就可以启动了。
  2. 服务端自动生成AES-256的key,客户端记住base64形式的KEY文件就可以进行加密通信。

强调安全性,是我一直的目的。

配置文件

1
2
3
4
5
{
"listen": ":52915",
"remote": "127.0.0.1",
"key": "AzonXhdbWCYoAA52GTE9FnldZEN4KhEsInFJe1oHYAgzQTRsCyEdUlBOPzd3HxgFbTAudDZobiU8TQYbURBFWVdvMisNSn5UIw8kei0gcjl1cGkeFTV9U0tEY2YaCkdPYl9nZRQSBGsMQgFzVlxhL0hGAlV/O0A+OGoJfBwpE0w="
}

第二周 OTR 端对端加密聊天

otrchat - OTR 端对端加密聊天

不要认为第一周和第二周的内容大同小异,其实区别大了。

聊天室和聊天的区别在于:

  1. 服务器要端对端的将消息传递给不同的客户端,不能单纯的广播给所有人
  2. 要有查询所有在线用户并且选择性聊天功能

此外,在这一周内还增加了:OTR协议

简单的说OTR协议有点类似于Telegram的“secret chat”功能,可以对聊天内容进行加密,任何第三方包括服务器都无法查看两者聊天的内容,在此前我也写过一篇文章专门用于解释该协议。

关于golang.org/x/crypto/otr包的使用经验,可以概括如下:

首先,发起聊天者A需要向被聊者发送数据包

1
c.sendMessages <- otr.QueryMessage

此后,golang.org/x/crypto/otr包会自动处理所有通信,包括互相发送公钥、签名、验证消息可靠性。

发送

1
2
3
4
5
msgToPeer, err := otrConv.Send([]byte(msg))
checkError(err,"otr conv sending")
for _, m := range msgToPeer {
c.sendMessages <- string(m)
}

接手及显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var err error
out, encrypted, _, msgToPeer, err := otrConv.Receive(bytes)
checkError(err,"new chat")
if len(out) > 0 {
if !encrypted {
color.Red("<OTR> Conversation not yet encrypted!")
color.Red("%s [%s] : %s", m.UserName, m.Time, string(out))
}else{
color.Blue("%s [%s] : %s", m.UserName, m.Time, string(out))
}
}
if len(msgToPeer) > 0 {
for _, msg := range msgToPeer {
c.sendMessages <-string(msg)
}
}

msgToPeer 表示OTR协议中需要完成额外的消息交换,所以需要单独的发送一遍。

由于otr包的相关帮助甚少,坑很多,不明白为什么这个世界不大力推广端对端加密聊天。

OTR协议下服务端所看到的通信内容如下:

1
2
3
4
5
6
7
From 1 To 2 Message: ?OTRv2?
From 2 To 1 Message: ?OTR:AAICAAAAxB+Iywuwg8aZG0gPZxY6anFes2KW4YT/rRrBZK50CC7kr+0p+jLXeU3VirUQMTW/eJkA8gKz9y2xYSxRRwLga0ATOx2AkOlENYT1MyXJFkAjgMD6SF6uPDy+apIIJkOiopW5T7vpON9Ogsh3XmV8i4T1yui9gs6mAuMT7PsLQ7b8rvd1WulRtquJtO9LKA1flDU7XsCAn4h4pobpCjOS7qQ6aZstlhFtNXD1ylLXrpJos3vBG7LZsH3zvouvG9FR94YlYuMAAAAg5t62vP0C+/LxRI7OJTWC5pMbv2yZqHE/yDQGclCsz0Q=.
From 1 To 2 Message: ?OTR:AAIKAAAAwDem/luw0prZM/Nv23/7Q+6/HrpQ199BVm+hcA2YMSHm85MJhS+ym24EAy4lg45O2e8LX5BylK1CM+w55VqUIJ7QOBwN3WazIWuiYKXXTuIdSBLi52P4dulhaGydKPfqFFqRM3hL2etO5p9xdJ8LbF/4+8PEK8//R56gIZLPLZNTPD8onxLKF5UnWJS3A8OfvJFykKQtXLc6573Y3BsGZ1ywfs0jyMukE/szOV5goTqLOaAhQfpw7gRuaMMqmHYXoA==.
From 2 To 1 Message: ?OTR:AAIRAAAAELaWJ2vpiHI8fmmdLgdFJ/0AAAHS43l5bWsQarN0F8UEWtJjgr/lxOT01s6PmNsY+WFAio3kzOBQnzleaqemtbmQMwfczDm9fLH2h1+qlf4q8b4SLco/MpLKjvNEjDNbrQ1d1hXRwiyTtcz7zGYxCcFc3xdHLuueL/zcTpcwcq8J1HSmLv+F2aoEzCywOW9sWtLzbikeUjA2mUSWr79krG9rkAHz2KVGL++rX1LWC/PQOVTzzmFKz1o4aK1qpna/9ef9ju6zxd9wvoOuXGJJi3NWGlkHUxXov8689j8HNJWkkl/YXxwit8Bk49WPvH/AKnhTwqBkfblguaEsHTPTli36yqNm3YKp+oP2IjrVzue9BWieT93c7BbpJUO8Fej1EBGGWxtPu+YE/ZlH+PwawUcjWCck16GbHr4fFPTYh4tVX3c2tJSEqVkpttRf7r70ucu1fqB+qrK95rcbkVIABRPg4xSuslRCQxhz/BwiN3ECmfRAI19jLBp/MO9FkqaqYc3Bws/50n13slet7mk7IVGt1xjZgdfuZEYGXDZzmUomraKp4Wnt6YsLI10zoEBUw4U0Vug4OJ+EY2gdpNTYYhJFLAUH6B+ktCO8c18pKglxtJJnSiBBNRpaAVwsldwWD77/vLekToFQRZeG6H7x0cuH23ZBqonHHHJX.
From 1 To 2 Message: ?OTR:AAISAAAB0qTCp5GMIr0w9szym5OPRrrk5/DSuaO1xuwnLp9ic+JUsO0//k9Ju7qVdpNFValQOvdePheZsp1fbaRoa8dCjJWeZDQF9Rik0tjz+5xgepzmaUXxDtKH2kiYWvBMp+AI0BosDGXRsupMZNGTon7G08wEaSbi8UYLouPrylrswC09PYwiN6+yTxwOE4dv/4vnIXo2k4868I4Ag9kRQ56grPlWpa3jG1Hrgwvm8510MtvBD+UwGTFHXFz8MieimBtIdI/Do/9svh9LhNrvAlQCqxaf5b6Eaoz0mRI0XU3PSPi6Qu8ivsti0LbIho75uvqZYk6xo/nX0UQrs48vsAVmZzXyRYMZ4M9JC+VumnEtxl92oQ4SQzetfEusQ76capBH9YJVfjej6xvC8n4k0I4rGKi9WSWgd4pYi6JOfRI2Nl9xh22PO+g5PdxKyGMzjpqkj9jm4yyc5l6ukfA/FpPSdNJjd6AbAu8HI3Zmw6fHhx+t+znAvnaMbw2gQG9gxe0WlmhM4ySOOvAGTG7wf1Md7AcRfxxNWeyInHmf+JJ1T3O74cPh1a6H0QQxh2UkXjS03adQMwGXng4pejRZhcSAEIY/cMfdAFYohfsdlDhOiv9E3NdbDU1sBIMPMKkDfi5vPUJEoecarQ==.
From 1 To 2 Message: ?OTR:AAIDAAAAAAEAAAABAAAAwO0jWIHSjaPxrZ7MtjgPYEbl9DGrA9idRzJA4vmdS6Lcc+JZbEdBqRH036j4Ie85mXLCWvqlPjYwKZNlQFbX5Rg+MMbqGl1Qcdk+Hfmd93pZf6Feg/yjlyBJOaCBWpTTpWzDyh+E2XZ3lZvlJxw1ogwatQn1VhicUXZzfDBSg1Dhw/jcAcXTn2wI+mmZ98rR9taBwgv41FN4mO7HhTkzUMQnJKPL9/zqtV6kWfwVYzXhaPoTnnbKa8L9hbYEMzy/OQAAAAAAAAABAAABADfvoGL7+tXt8VKqBj4JMwOsfhuH6PMlq47YQGf7l/5Dmszn2yVv+lemLj+YrcVxLOYO5WU0CGBjmr+52g+x/w3Dj0b+ak25y6H8bX3sPmcX/ZSgqTi+zt+IHqn207autlQVzvpt37g1grzWZvbn68a0obQqQp32jIXfOlYUFUv6cJDOvHk+3+1lRJdFFLjeP40OehnZ3AeOvT2wo6gNdEMFM4zgPtiskQtRxTFtFqs+KW/rkzefThdYhWpbMY/Nvpcf1S0Sy6HKLIqGwa7bkMa1coDfNma5fQzw856VWDFhQSq/PXT5aV4dDmXtYuBUs3YJoyWFGft03GDtZfdMQiqMDkTIJC2mB3O16CoDJBgXeM/0AQAAAAA=.
From 2 To 1 Message: ?OTR:AAIDAAAAAAEAAAACAAAAwMpbV5DJJNyJODVA4cZmMXf76Ra+UJ0RtBqzbIbaWFfVoMWQwFypi+qktOnwFmYhuQr4O30Yy76xReJi1DRP72uWUudiyrFSJzSHPGLUqZ2RqVB+ovSifkuW8nQnq6UAbxQuWtYuKLOiaoK7EZ9+2RMcXOLx+h57Sd1x4IL2aZ+1y+X+vco1fcHTW79qcz1TCT0qfn7+cI9O1HaKt/O15C51Btemu0rthK5W+mId5ueTIKcove1Ao6BRxy0GvMewMwAAAAAAAAABAAABAH78/obuj6XrBlIb55u2fDpmu93ILP8pI9f2ozxwKpfi20f6sLif3cKPVN4of7i0iivtGcXBKf4g4Bo4hLx3nD33E9/aAeuxpy9Dr+uuHak9mUQA7HC07Yg2PrVUiNhV4QVj/XPg6A0xE040NRvNs5Ww9cZjHSOMg998zsGjaz528HkNQw9n06tF8uCRLh+XXkQnuV9Ln/JLd1wbWybJGMlQh82SYhgW+B/GONUG2nBo0ClBRU8aAWEGEsYVa6K6PQJzWBUjDInLdiYYauP7uo0nmkYxsTJNPbhA00RXER4LXpJq87lN4gihq+7cxr77plQEPi3Z/HwIWKmzgLlfi3W85bNg8E4gH8w1DEBMjZIgzADE/AAAAAA=.

安全的无可匹敌!