使用 libsodium secretbox 时如何存储随机数和密钥?

信息安全 加密 php 密钥管理 mysql 随机数
2021-08-22 12:31:26

我为什么要问?

我对密码学很陌生(所以请耐心等待...),我想避免犯不必要的错误。我做了很多研究,但是——除了大多数其他与编程相关的问题——我很难找到足够的信息来让我自信,我现在知道如何正确地做事了。

上下文是什么?

我正在使用 PHP (> 7.2) 和 MySQL 在网上商店工作。我需要存储一些个人信息。但是,这将不包含关键数据(如付款详细信息)——仅包含姓名、地址和联系信息。尽管如此,我还是想加密这些数据——尤其是为了获得一些经验。该数据将由 php 应用程序输入和读取,无需管理员输入。

我在奥地利提供商 World4You 上托管此站点。我不确定这个词是否合适(英语不是我的母语),但我想你会称之为共享主机。但是,我读过共享主机,其他用户可以访问我的文件——这里不是这种情况。

在您的回答中,请考虑这些情况是不变的。我很清楚,在托管方面存在相当大的安全相关改进空间。当然,我对与此相关的每一个建议都很高兴。但也请帮助我在这些情况下找到最佳解决方案。

为什么是密箱?

根据我的研究,secretbox 有更强大的加密替代方案。但是,这种增加的安全性很容易因实施不当而受到破坏——尤其是如果您是像我这样的业余爱好者。Secretbox 仍然非常安全,但更易于使用,因此是我的最佳选择。正确的?

此外,libsodium 现在作为 PHP 的一部分出现(在 7.2 及更高版本中)。

我的问题

感谢 libsodium 电子书,我现在知道如何生成密钥和随机数以及如何使用它们加密和解密数据。但是,我不确定如何存储密钥和随机数。

我在哪里存储密钥?

到目前为止,我发现的“最佳”解决方案(考虑到我的情况)是将密钥存储在位于文档根目录之外的 php 文件中。这是一种可以接受的做事方式吗?是否有更好的选择,不需要对我的设置进行重大更改?

我在哪里存储随机数?

在我看来,nonce 不必保密。那么,我在哪里保存我的随机数?

例如:如果我想加密表列“名称”、“地址”和“电子邮件”的字符串,我会使用 3 个随机数,对吗?那么,我是否将这 3 个随机数存储在同一张表的另外三个列中(这在某种程度上直观地“感觉”错了)?还是我会将它们存放在其他地方?

我应该使用什么列类型?

根据我收集到的信息,我应该将加密数据存储在某种二进制类型的列中。那么 BLOB 是正确的选择吗?

另外,我应该使用什么列类型来存储随机数(如果我确实将它们存储在表中)?

非常感谢!

2个回答

我不是专家,我以前也没有做过任何关于加密的事情。我是个业余爱好者!!!不要将我要说的内容视为在这个主题上的任何知识或智慧。使用风险自负。

我其实也有同样的问题。许多文档和 FUD 让学习这些东西的人发呆。我很确定这是有意通过默默无闻和混乱来帮助提高安全性。

好吧,除了笑话,我确实想扩展您概述的一些概念,这些概念是我在自己的旅程中发现的。首先,加密的使用以及如何实现它直接取决于用例。例如,如果您希望处理静态数据,它将有一个非常不同的解决方案,然后通过网络交换秘密消息。它们都使用相同的算法和工具,但您的应用程序的实际实现会有所不同。

接下来,钥匙(在密箱中)是你的生命之血。它必须安全地保存并隐藏起来。在静态存储数据的情况下,它也是永久性的。在您的示例中,最好将其保存在文档根目录之外,或者可能保存在防火墙后面的数据库中。此外,许多实现还将使用密码短语加密密钥(这是 GPG/PGP 所做的)您可以在将其写入磁盘并将密码短语 ( randombytes_buf) 保存在环境变量中之前执行此操作。

随机数是唯一的每个加密...错误...每个创建的密文。因此,在您上面的情况下,我会将所有三个字段序列化为一个字符串并用一个随机数对其进行加密。现在要解密(读取),您需要知道随机数。这就是文档和博客文章变得有趣的地方。我只看到了一个示例(libsodium-wrappers),其中他们将 nonce 缓冲区与密文缓冲区连接起来,形成一个以 nonce 作为前缀的大缓冲区。

我假设另一种方法是以读者可解析的形式序列化两者。这是我对加密世界的问题。哪种运输方式更好?

一个字符串/二进制有效负载:

nonce
vvvvvv
bada55123456789abcdf
      ^^^^^^^^^^^^^^
      ciphertext

或者在序列化时将两者分开:

{
  "nonce": "bada55",
  "ciphertext": "123456789abcdef"
}

Paragon 创建了一个库,为非专家隐藏了 libsodium 的复杂性。

初学者应该从这个库开始:https ://github.com/paragonie/halite