1

在这里跟进我的问题,我现在需要安全地存储对称密钥。在查看选项后,听起来这可能是一个不错的选择:

设置:

数据库中有一个表有两个字段

php_key - stores a symmetrically encrypted symmetric key that is used for OTHER tables
php_key_hash - stores a hmac of the symmetric key

其他表格(如其他帖子中所述):

last_name - symmetrically encrypted value encrypted with key after being unencrypted from php_key
last_name_hash - hmac of last_name

登录/密钥的安全保护:

1)用户登录 - (不相关的)用户/通行证只是存储在数据库中(通行证是一个hmac)

2) 登录后,用户会看到一个屏幕,他们必须在其中输入另一个密码 - 该密码将与公司的所有员工共享(只有 5 名员工,所以很容易记住)。让我们称之为key1。

3) 该密码已执行 hmac,并与数据库中的 php_key_hash 进行比较。

如果它失败了,我可以在这里错误用户。

4)如果匹配,则下拉php_key,使用相同的密码解密,并将其存储在会话变量中。

此时密钥存储在服务器的内存中,并在用户注销时被销毁。让我们称之为key2。

在其他帖子中发生这种正常的字段解密之后

这对我来说似乎真的很安全,因为

1) key2 存储在与 Web 服务器不同的服务器上

2) key2 本身是加密的 - 它从不以纯文本形式存储

3) key1 不位于代码或文件系统或数据库中的任何位置 - 它只在员工的脑海中知道

4)您基本上必须登录该站点两次(一次使用您的登录名,再次使用key1)

5)使用session变量意味着key2只存在内存中,只存在于服务器上,在session结束后销毁

6) 如果我们需要更改密码,我可以随时重新输入 key1 - 例如,如果员工离开或我们认为它已被泄露

潜在问题又名我的问题(最后)

首先,我绝不是安全专家,因此为什么我只希望在安全方面比我更好的人的意见:)

1)我可能将加密的对称密钥(key2)存储在同一个数据库中,用于解密其他字段。我不认为这是一个问题,因为它本身是加密的?

2) 将对称密钥 (key2) 存储在会话变量中 - 人们浏览 RAM 的潜在问题?也许将 key1 存储在会话变量中会更好,然后每次都必须进行双重解密(但可能很慢)?我是不是过于谨慎了?

4

1 回答 1

0

好的,我想我现在明白你的意思了。我假设你的意思是:

key1 = PBKDF2(password, salt, many_iterations)
php_key_hash = HMAC(key1, salt)

当您说 HMAC 作为密码时,我假设您的意思是具有多次迭代(例如几秒钟)的 PBKDF2。无论如何,回答你的2个问题:

1)key2在加密的数据旁边保存加密key2是可以的。实际上AWS KMS是这样工作的,只是它们key2对每种加密都使用不同的加密。如果一个key2被泄露,只有其相应的数据会被泄露(而不是整个数据库)。它使密钥轮换更简单。

2)如果您保留key1在 RAM 中而不是key2,那将无济于事:如果有人设法key1从 RAM 中获取,您可能会假设他们也可以访问php_key数据库并且能够解密key2. 如果您想防止此问题并且不希望 RAM 中的密钥,您应该考虑使用 HSM(并且key2永远不会离开 HSM)。如果没有 HSM,key2则必须在某个时候在 RAM 中。

于 2018-09-13T21:51:33.070 回答