加密的 pastebin 非网络应用程序的想法

信息安全 加密 哈希
2021-08-25 23:58:20

我有一个可能有用的应用程序的想法(尽管如果不是,我仍然在这个过程中学到了,这很重要)。

有一堆加密的 pastebin Web 应用程序(例如 defuse.ca/pastebin.htm)使用 JavaScript 在客户端上执行加密/解密。这样就实现了端到端加密,除非有人入侵服务器并修改 JavaScript,以便未来连接的用户获得修改后的 JavaScript 代码,从而将未加密的密码泄露给黑客。

我的想法是用户应该与独立的客户端应用程序而不是浏览器应用程序进行交互,以消除 JavaScript 漏洞。

  1. 用户下载客户端独立应用程序。在下载/安装期间提供了一些安全性,因为:客户端应用程序经过数字签名 b. 下载发生在 https 服务器 c. SHA 哈希可用于下载的文件 d。客户端应用程序的源代码可用
  2. 用户启动应用程序并选择“新粘贴”。他看到一个大文本框。
  3. 用户键入/粘贴文本并单击“提交”。提示用户输入密码并输入。
  4. 客户端应用 CSPRNG 生成 128 位 salt S。
  5. 慢推导函数以密码和S为参数,推导256位密钥K和128位初始化向量IV。
  6. 使用明文、K 和 IV 执行 Aes 加密(128 位块大小、256 位密钥、CBC 模式、PKCS7 填充)以生成密文 C。
  7. 客户端应用程序调用服务器(对 https uri 的其余调用),将其传递给 S 和 C。
  8. 服务器将 S 和 C 存储在数据库行中(S 是主键)。
  9. 服务器告诉客户端数据已存储。客户端告诉用户“数据已保存”并将 S 作为唯一的粘贴标识符呈现给用户。
  10. 用户记下 S(他的计算机上的文本文件、给自己的电子邮件等……不必保密)。密码必须保密。
  11. 稍后,用户再次启动客户端应用程序。
  12. 他选择“打开现有粘贴”。他输入 S 并选择查找。
  13. 客户端应用程序要求服务器查找匹配 S 的粘贴(对 https uri 的其余调用)。如果是,则返回加密文本。
  14. 如果找到粘贴,客户端应用程序会提示用户输入解密密码。他输入。
  15. 慢推导函数以密码和S为参数,推导256位密钥K和128位初始化向量IV。
  16. 使用明文、K 和 IV 执行 Aes 解密(128 位块大小、256 位密钥、CBC 模式、PKCS7 填充)以生成明文。
  17. 客户端应用程序将纯文本放入框中。用户可以更改它并重新加密或关闭它并重新粘贴(返回步骤 2)。

笔记:

  1. 在以下情况下,多个用户可能会查看相同的粘贴:他们事先就密码达成一致,或者在用户 1 粘贴后将密码从用户 1 传递给用户 2,并且 b。进行粘贴的用户与其他用户共享 S(这可能不安全地共享)。

问题:

  1. 此设置有哪些安全漏洞,如何改进?
  2. 就用户体验而言,我是否遗漏了任何重要的东西?
  3. 回复:第 17 步。我读到你不应该两次使用相同的盐。每次修改/重新加密都会更改粘贴 (S) 的标识符会很烦人(如果多个用户正在访问同一个粘贴,他们需要在每次更新/重新加密时重新传达新的 S),但它是如果我不想牺牲安全性,这是不可避免的吗?

提前致谢!

2个回答

我是反乌托邦警察国家的思想警察的一员,我可以窃听所有互联网流量。

  • 通过我的侦探工作,我发现鲍勃是一个思想罪犯。但鲍勃不在我的掌握之中。
  • 我注意到 Bob 使用您的程序将几个带有盐 S1、S2 和 S3 的密文上传到您的服务器。
  • 我还注意到 Alice、Charlie 和 Dora 从您的服务器请求了带有盐 S1、S2 和 S3 的密文。

我知道这些消息的内容是什么吗?还没有,不过等我把这三个人都扣下来审问一会儿,肯定有一个会破的。我什至在乎吗?事实上,我没有。与鲍勃交往足以让他们以叛国罪定罪。

你怎么能让我的工作更难?

使用具有前向保密性的 TLS进行服务器和客户端之间的通信。这样,我只知道谁使用您的服务以及何时使用,但不知道他们上传/下载的确切消息。当非叛国文件的数量远远大于叛国文件的数量时,逮捕所有用户以防万一是不可行的(我们只有这么多的审讯室,我们的经济负担不起锁定太多我们的工作无人机一次)。警告:当我设法占领您的服务器时,我可以再次窃听您的用户。

您还可以让您的客户请求大量用户未请求且甚至没有密码的随机(但有效)文件。这样一来,您就可以混淆用户的通信网络,并迫使我浪费时间拘留许多一无所知的随机人。

但是,如果您真的想让我头疼,请摆脱您的中央服务器并切换到像Freenet这样的分布式架构,其中所有数据都分布在客户端网络上,没有人知道哪个客户端拥有哪些文档(甚至不知道客户端本身) . 但是如此剧烈的架构变化会让你回到绘图板上从头开始重新设计你的协议。

似乎最薄弱的环节是密码,因为这是解密文本所需的唯一内容,因此用户必须创建好的密码。我无法谈论您选择的大多数安全决策,但我对 UI 有一些看法:

  • 有可能发生碰撞S为什么不让客户端应用程序在S步骤 2 中查询服务器,然后服务器返回一个唯一 ID。其中一些(许多)ID 可能永远不会被使用(如果第 7 步没有完成,则发送C回服务器),但这没关系。

  • 您可以在加密之前包含一个魔术字符串(例如,您的应用程序的名称)作为明文的前缀。用户不会看到它,但是当解密发生时,您的应用程序可以检查魔术字符串是否存在,如果不存在,则向用户报告警告。这比显示解密失败的垃圾字符更加用户友好。

  • 多次重复使用盐是可以的,您只是希望它通常有所不同,以防止攻击者使用彩虹表来“反转”哈希。唯一可以重复使用盐的情况是,如果用户不断更改有限的密码(例如,4 位数字 PIN)并且攻击者有机会建立彩虹表,或者如果攻击者已经有一个用那个盐创建的彩虹表(所以使用像 UUID 这样长的东西(用户可能正在通过电子邮件发送链接,所以S如果它很长并不重要;如果它需要很短,你也可以添加一个 URL仅指向S)) 的缩短功能