为数据库的其余部分存储对称密钥,同时在数据库本身中加密
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 中。
跟进我的问题
设置:
数据库中有一个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 中。