---
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用的是第三方权威解决这个问题，我们就没办法了……   
  最大的问题是，什么时候开始动工？（笑）
