我为什么要问?
我对密码学很陌生(所以请耐心等待...),我想避免犯不必要的错误。我做了很多研究,但是——除了大多数其他与编程相关的问题——我很难找到足够的信息来让我自信,我现在知道如何正确地做事了。
上下文是什么?
我正在使用 PHP (> 7.2) 和 MySQL 在网上商店工作。我需要存储一些个人信息。但是,这将不包含关键数据(如付款详细信息)——仅包含姓名、地址和联系信息。尽管如此,我还是想加密这些数据——尤其是为了获得一些经验。该数据将由 php 应用程序输入和读取,无需管理员输入。
我在奥地利提供商 World4You 上托管此站点。我不确定这个词是否合适(英语不是我的母语),但我想你会称之为共享主机。但是,我读过共享主机,其他用户可以访问我的文件——这里不是这种情况。
在您的回答中,请考虑这些情况是不变的。我很清楚,在托管方面存在相当大的安全相关改进空间。当然,我对与此相关的每一个建议都很高兴。但也请帮助我在这些情况下找到最佳解决方案。
为什么是密箱?
根据我的研究,secretbox 有更强大的加密替代方案。但是,这种增加的安全性很容易因实施不当而受到破坏——尤其是如果您是像我这样的业余爱好者。Secretbox 仍然非常安全,但更易于使用,因此是我的最佳选择。正确的?
此外,libsodium 现在作为 PHP 的一部分出现(在 7.2 及更高版本中)。
我的问题
感谢 libsodium 电子书,我现在知道如何生成密钥和随机数以及如何使用它们加密和解密数据。但是,我不确定如何存储密钥和随机数。
我在哪里存储密钥?
到目前为止,我发现的“最佳”解决方案(考虑到我的情况)是将密钥存储在位于文档根目录之外的 php 文件中。这是一种可以接受的做事方式吗?是否有更好的选择,不需要对我的设置进行重大更改?
我在哪里存储随机数?
在我看来,nonce 不必保密。那么,我在哪里保存我的随机数?
例如:如果我想加密表列“名称”、“地址”和“电子邮件”的字符串,我会使用 3 个随机数,对吗?那么,我是否将这 3 个随机数存储在同一张表的另外三个列中(这在某种程度上直观地“感觉”错了)?还是我会将它们存放在其他地方?
我应该使用什么列类型?
根据我收集到的信息,我应该将加密数据存储在某种二进制类型的列中。那么 BLOB 是正确的选择吗?
另外,我应该使用什么列类型来存储随机数(如果我确实将它们存储在表中)?
非常感谢!