Mayx的博客

Logo

Mayx's Home Page

View My GitHub Profile

About Me

2 July 2019 - 字数统计:1387 - 阅读大约需要4分钟 - Hits: Loading...

制作分布式加密邮件系统的计划

by mayx


一个计划还没开始,又开始另一个计划了……

计划原因

之前用了Telegram聊天,里面有一个私密通信的功能。听说这个功能可以让服务端没法知道使用者发送的信息。不过Telegram在国内使用限制比较多,所以我打算用HTML+Javascript+PHP+MySQL写一套自己的私密通信系统。
但是As We All Know,某些国家有网络审查,提供这种服务的肯定会被审查的。既然我们要做这个东西,就不能让它不稳定。所以我想把这个项目搞成分布式的那种,确保通信可以成功。(来自Mastodon的思路)

Q&A

  1. 为什么使用PHP?
    之所以用PHP作为后端语言的原因呢…… 当然因为PHP是世界上最好的语言!(被打死) 因为PHP的程序好搭建,而且很多虚拟主机商都用的是PHP,这样即使小白也能搭建,就能让分布式节点更多了。 (明明主要原因是我只会PHP 23333)
  2. 为什么我要做成邮件系统而不是聊天系统呢?
    因为聊天就要用Websocket或者是AJAX之类的,但是我不会……我只能把信息都存在服务器里,有人访问再显示出来……
  3. 已经有PGP了,为什么还要重复造轮子呢?
    因为PGP是软件,小白用起来不太方便,这个是网站,可能相对更简单一些。 (重复造轮子能有什么理由)

项目技术原理

  1. 所谓的私密通信主要用的就是非对称加密,比如说RSA什么的。所以这个项目同样如此,也使用RSA作为主要加密算法。
  2. RSA虽然很不错,但是似乎加密速度比较慢?(我看HTTPS上介绍的是这样)所以内容用AES加密,用随机数做密码,一方用公钥去加密这个密码,另一方用私钥解密获得密码,然后再利用这个密码进行对称加密传输(和HTTPS差不多)。
  3. 如果上述操作都是服务端进行,那这些就都没什么意义了,所以我们要在客户端进行。像Javascript进行加密完全没有问题,所以除了传输,其他加密都是在浏览器上进行。

项目细节

为了方便通信,公钥是要留在服务器上的,所以要搞一个用户系统,存储用户的公钥。在注册的过程中公私钥生成都是在客户端进行,确保服务端得不到用户的私钥,注册的过程中要将用户名和公钥上传至服务器保存。这就是为什么要用到MySQL。
登录时,先输入用户名,服务器使用用户名查找到对应的公钥,然后生成一个随机数,用公钥加密,发送给客户端,客户端用私钥解密,获得随机数,返回给服务器进行登录。
私钥登录后要持续保存,这时肯定不能用Cookie,我们可以用localStorage,然后客户端一定要做好防XSS,不然一切都没有了。
在发送的时候,我们可以搞一个类似Mastodon的用户名,两个@实在是太蠢了,就和E-mail一样,就搞成user@example.com的形式吧
在发送时客户端先检查对方服务器能否连接,如不能则测试通过服务器连接,如果服务器连接失败再使用其他节点连接(服务器内置),如果还是不行,用户可以自行输入节点,还是不行,投递失败。
连接成功后对方服务器查询对应用户的公钥,返回给客户端,客户端用这个公钥加密AES密码,用AES密码加密内容,然后再传给对方服务器保存。
查看邮件就用私钥解密AES密码,然后解密内容。

问题

如果对方服务器被攻陷,公钥被改成攻击者的,那不就没用了吗?虽然可以用指纹解决,但是这对小白来说似乎有些困难……HTTPS用的是第三方权威解决这个问题,我们就没办法了……
最大的问题是,什么时候开始动工?(笑)

tags: 分布式 - 加密 - 邮件 - 计划
召唤伊斯特瓦尔