在这里跟进我的问题,我现在需要安全地存储对称密钥。在查看选项后,听起来这可能是一个不错的选择:
设置:
数据库中有一个表有两个字段
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 存储在会话变量中会更好,然后每次都必须进行双重解密(但可能很慢)?我是不是过于谨慎了?