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.
mabbs/_posts/2019-07-02-encmail.md

38 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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