从零实现一个端到端加密的密钥同步工具

这个端到端加密的工具奶爸已经做出来好多个月了:cloudssh,因为最开始没有设计好 cmd 命令的模板导致现在奶爸没有优化下去的兴致了,总结一下端到端加密中的设计模式,有意思的细节,就打住了。

端到端加密详解

名词解释

  • MasterKey:明文密码以服务器返回的加密途径加密后的 key,此 key 用来加密个人账户下的所有数据使用
  • EncKey:MasterKey 的再 hash,hash 方法固定,循环次数较小,只是 hash 后提供给服务器当作密码鉴权使用
  • 对称密钥:公钥用来加密 Team 的私钥,私钥由 MasterKey 加密后储存在服务器中,需要时解密来用
  • Team 密钥:公钥储存在 Team 表,私钥储存在每个成员那里

用户注册

服务器客户端用户服务器客户端用户注册账户1询问加密masterKey的加密方式2返回masterKey加密方式3提供邮箱、明文密码4密码为依据明文密码生成 hash 后的 encKey 的 hash,生成对称加密密钥,将对称加密私钥由 encKey 加密后一起提交至后端5注册成功6

在注册流程中,明文密码不会离开你的电脑。服务器端保存的密码是用来加密数据的 encKey 的 hash 的 bcrypt hash 后的值,和 encKey 的 hash 方式。

用户登录

服务器客户端用户服务器客户端用户提供账户邮箱、密码登录1预询问该账户加密masterKey的加密方式2返回masterKey加密方式3按照加密方式将明文密码加密为 masterKey,然后按照固定模式生成 encKey 进行 hash 提交到服务器鉴权4登录成功5

个人数据

读取

服务器客户端用户服务器客户端用户读取 数据11请求 数据12返回 数据13使用 masterKey 解密然后展示给用户4

写入

服务器客户端用户服务器客户端用户写入 数据21将 数据2 中除ID外的字段由 masterKey 加密,然后上传至服务器2直接存入数据库3写入成功4

Team 数据

读取

服务器客户端用户服务器客户端用户读取 数据11请求 数据12返回 数据13使用 masterKey 解密 Team 的私钥,在用私钥解密数据,然后展示给用户4

写入

服务器客户端用户服务器客户端用户写入 数据21将 数据2 中除ID外的字段由 Team 公钥加密,然后上传至服务器2直接存入数据库3写入成功4

概览

Team 成员管理

单人
个人帐户
明文密码及ciperString
数据
多人
Team账户
对称加密密钥

因为 Team 账户为多人服务,既要保证每个人都能读取、修改 Team 中的数据,又能使个人的数据维持私密安全。同样在添加与删除成员时,只需要操作 添加/删除 的管理员修改 Team 的公钥与私钥,而后便利相关成员,使用成员的公钥将新的 Team 私钥保存在成员处,成员即可使用更新的私钥读取数据,而被提出剔出的成员也无法再解密 Team 数据。

目前的缺陷

客户端为方便用户明文储存了用户的明文密码在 ~/.cloudssh.json 中,这是极不安全的。请看这篇博文 「Stop saving credential tokens in text files」端到端加解密,包括处理多人加解密的流程比较复杂,奶爸的描述能力有限,欢迎与博主进行交流。

Comments

芭比 ·v1 Reply

从零实现得到个女朋友

奶爸 👲 ·v1 Reply

@芭比 瓜娃子,一下回复三次

芭比 ·v1 Reply

@奶爸 哈哈,麻烦删掉,因为我提交的时候卡住了,不知有没发出。

奶爸 👲 ·v1 Reply

@芭比 不用删了 这篇文章就是你的耻辱柱了

芭比 ·v1 Reply

从零实现得到个女朋友

芭比 ·v1 Reply

从零实现得到个女朋友