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

时间:2018-09-13 06:35:32

标签: security encryption login cryptography symmetric-key

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

设置:

数据库中有一个包含两个字段的表

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)使用会话变量意味着key2仅存储在内存中并且仅存储在服务器上,并且在会话结束后被破坏

6)如果需要更改密码,我可以随时重新输入key1的密码-例如,如果一名雇员离职或我们认为密码已被盗用

潜在问题又是我的问题

首先,我绝不是安全专家,所以为什么我只想在安全方面胜过我的人的意见:)

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

2)将对称密钥(key2)存储在会话变量中-人们在RAM上冲浪时可能遇到的问题?也许最好将key1存储在会话变量中,然后每次都要进行两次解密(但可能很慢)?我过分谨慎了吗?

1 个答案:

答案 0 :(得分: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,那将无济于事:如果某人设法从RAM中获取key1,则您可能会假设他们可以访问{ {1}}还可从数据库中解密php_key。如果要防止出现此问题并且不希望将密钥放入RAM,则应考虑使用HSM(普通的key2永远不会离开HSM)。如果没有HSM,则key2有时必须位于RAM中。