使用纯文本短语作为公共/私人对?

信息安全 加密 密钥生成 密钥交换
2021-08-18 02:40:27

我正在开发一个将由相对不精通技术的用户使用的应用程序,虽然机器可以访问互联网,但该应用程序不能有任何类型的托管中介。

该应用程序允许人们获取文件,将其压缩并将其编码为图像,以便在 GitHub 等网站上共享,以帮助共享测试文件等内容。

该应用程序的第一个版本运行良好,但有时需要共享敏感数据并且需要某种程度的加密。

理想情况下,我想沿着公钥/私钥对路线走,但从用户的角度来看,共享这些是麻烦和复杂的。

我希望能够(以某种方式):

  1. 获取用户的电子邮件地址并将其用作公钥
  2. 从用户那里获取密码并使用它来派生私钥
  3. 以某种方式将它们纠缠在一起,以便它们可以以这种方式使用。

电子邮件地址是否最终解析为其他然后使用的东西并不重要,但一般流程需要是这样的:

  1. 爱丽丝想要加密图像以供特定用户使用
  2. Alice 输入该用户的电子邮件地址(或目标的其他字符串 - 例如组)
  3. Bob 将图像下载到应用程序中并输入他的私人密码以解压缩它。

该应用程序还可以使用私钥对数据进行签名,以便在另一端进行验证。

我知道我可以使用密码派生的公钥/私钥,但这意味着可以使用单个密码来派生这两个部分,并且最终会使其无用。

2个回答

您不能使用任意字符串作为私钥/公钥对。这些需要根据您使用的 PKI 算法(例如 RSA)的数学细节生成。

但是,您可以创建一个使用与您描述的相同工作流但使用 PKI 进行加密的应用程序,只要您准备好做出一些权衡。

首先,它从典型的非对称加密开始(请使用标准库:不要尝试自己编写代码):您的应用程序使用发送者的私钥对数据进行签名,并使用接收者的公钥对其进行加密。问题是,通常情况下,您无法访问经过验证的接收方公钥。

为了解决这个问题,您让所有用户生成他们自己的密钥对(或对)并在公共平台(密钥服务器)上注册公钥。这应该包括某种形式的用户验证,以确保密钥确实属于与他们相关联的安全原则,否则您将面临有人使用不属于他们的标识符注册密钥的风险。

因此,当用户需要某人的公钥时,它可以根据需要从密钥服务器(通过经过身份验证的加密通道)请求它。

当然,魔鬼在细节中:构建这样一个系统非常困难:您需要一个有效且实用的密钥验证系统。此外,您需要考虑到用户经常会丢失自己的密钥、忘记密码、更改电子邮件等这一事实。密钥服务器还需要非常安全,同时以透明的方式运行因为任何控制他们的人也控制着每个人的通信(他们可以或多或少透明地用自己的公钥替换任何公钥)。

所有这些“小”细节都非常难以解决(而且成本高昂),因此除非你有大量可用资源,否则坚持简单的对称加密可能会更好。

看看我的 Brainkeys 实验。https://github.com/jwilkins/brainkeys

它需要一个短语并将其转换为 SSH 公钥/私钥对。基于brainwallet 概念和代码。