为数据库的其余部分存储对称密钥,同时在数据库本身中加密

Storing symmetric key for rest of the database while encrpted in the database itself

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

设置:

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

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

other tables(如other post所述):

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

Login/Safe 守护密钥:

1)用户登录-(无关)user/pass只是存储在DB中(pass是一个hmac)

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

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

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

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

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

在这个正常的字段解密之后发生在另一个 post

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

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

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

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

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

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

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

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

首先,我绝不是安全专家,因此我只想听听安全方面比我好的人的意见 :)

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

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

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

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

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

1) 将 key2 加密保存在 key2 加密的数据旁边即可。事实上 AWS KMS 就是这样工作的,除了他们对每个加密使用不同的 key2。如果一个 key2 遭到破坏,则只会破坏其相应的数据(而不是整个数据库)。它使密钥轮换更简单。

2) 如果你在 RAM 中保留 key1 而不是 key2,那将无济于事:如果有人设法从 RAM 中获取 key1,你可以假设他们有访问权限php_key 从数据库也可以解密 key2。如果你想防止这个问题并且不希望 RAM 中的密钥,你应该考虑一个 HSM(并且 key2 简单地说永远不会离开 HSM)。如果没有 HSM,key2 有时必须在 RAM 中。