代码之家  ›  专栏  ›  技术社区  ›  Element Zero

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

  •  1
  • Element Zero  · 技术社区  · 7 年前

    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
    

    登录/密钥安全保护:

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

    3) 该密码已执行hmac,并与数据库中的php\u key\u散列进行比较。

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

    4) 如果匹配,则下拉php\u密钥,使用相同的密码解密,并将其存储在session变量中。

    我觉得这很安全因为

    4) 你必须登录网站基本上两次(一次与你的登录,再次与键1)

    5) 使用会话变量意味着key2只存储在内存中,并且只存储在服务器上,并且在会话结束后被销毁

    6) 如果我们需要更改密码短语,我可以随时重新输入key1,例如,如果员工离开或者我们认为它被泄露了

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

    首先,我决不是一个安全专家,因此我只想得到比我更擅长安全的人的意见:)

    2) 将对称密钥(key2)存储在会话变量中-人们在RAM上冲浪时可能出现问题?也许将key1存储在会话变量中,然后每次都要经历双重解密(但可能很慢)会更好?我是不是太谨慎了?

    1 回复  |  直到 7 年前
        1
  •  0
  •   nicolas    7 年前

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

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

    当你说HMAC作为password时,我假设你指的是经过多次迭代(例如几秒钟)的PBKDF2。总之,回答你的两个问题:

    key2 就在加密的数据旁边 可以。事实上 AWS KMS 这样工作,除了他们使用不同的 键2 只有其相应的数据会被破坏(而不是整个数据库)。它使关键点旋转更简单。

    2) 如果你继续 key1 在RAM中而不是 键2 从RAM,你可以假设他们可以访问 php_key 键2 键2 键2 总有一天会在RAM里。