You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
---
|
|
|
|
|
layout: post
|
|
|
|
|
title: 制作分布式加密邮件系统的计划
|
|
|
|
|
tags: [分布式, 加密, 邮件, 计划]
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
一个计划还没开始,又开始另一个计划了……<!--more-->
|
|
|
|
|
|
|
|
|
|
# 计划原因
|
|
|
|
|
之前用了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用的是第三方权威解决这个问题,我们就没办法了……
|
|
|
|
|
最大的问题是,什么时候开始动工?(笑)
|