紧跟我的问题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存储在会话变量中,然后每次都要进行两次解密(但可能很慢)?我过分谨慎了吗?
答案 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中。