【问题标题】:How to store a passphrase to decrypt a secure data?如何存储密码以解密安全数据?
【发布时间】:2011-08-14 20:08:27
【问题描述】:

我有一个密码,可以在我的 rails 应用程序中使用公钥解密数据。

当用户尝试进入特定菜单(例如“发票”)以解密敏感数据时,我会询问用户“密码”。

不建议将密码直接存储到用户会话/cookie 中(出于安全原因)。

那么,在没有安全漏洞的情况下存储此密码的最佳方法是什么?

【问题讨论】:

  • 你能解释一下你想保存多久吗?您是否需要跨请求存储它,或者比这更长?他们需要解密所有数据,还是一次只解密一位?
  • 我需要跨请求存储我的密码。当用户会话过期时,用户需要再次输入正确的密码到表单才能访问敏感数据。
  • 如果这是一个 Rails Web 应用程序,用户是否通过不安全的 http 连接发送他的密码?如果是这样,攻击者可以捕获它并冒充用户。为什么不能用 https 保护这种通信?
  • HTTPS 不能解决问题。我的密码在用户的 cookie 上没有任何安全性 => 这就是问题所在

标签: ruby-on-rails security cookies encryption


【解决方案1】:

假设:

  • 您的要求是用户可以输入一次密码,然后在剩余的会话期间访问他们的所有数据。
  • 每个帐户都有大量数据需要加密(即多张发票)。

我会做如下的事情:

  • 使用安全的随机密钥(数据密钥)和对称密码(例如 AES)加密附加到用户帐户的所有数据。
  • 为每个帐户提供一个公钥/私钥(帐户密钥),并带有用户选择的密码。
  • 使用公共帐户密钥加密数据密钥,并存储它。
  • 创建应用范围的安全随机密钥(会话密钥)。
  • 当用户在他们的密码中输入密码时,使用它来解密他们的数据密钥,然后立即用会话密钥重新加密,并将其存储在他们的会话或 cookie 中。在会话中单独存储一个时间戳,说明密钥何时被加密,并通过创建时间戳、加密数据密钥和会话密钥的哈希来对其进行签名。

当他们想查看一些数据时,那么:

  • 将加密的数据密钥、时间戳和签名散列从会话中拉出。根据时间戳、加密数据密钥和会话密钥重新计算哈希,并检查它是否与会话中的哈希匹配(即没有任何内容被篡改)。
  • 将时间戳与“现在”进行比较,并确定它是否足够近以至于您可以信任它(即它没有被中间攻击的人偷走)。
  • 当且仅当没问题时,使用会话密钥解密数据密钥。
  • 使用数据密钥解密数据。

如果您想要额外的安全性,您可以定期轮换会话密钥,以确保即使攻击者设法从某人的会话中获取加密数据类型,他们也必须破坏应用程序本身同时 以获取相关的会话密钥。

根据您的需求,这可能过于复杂。如果不是,那么请记住,我不是密码学家,所以使用这个需要您自担风险,如果您担心的话,请找一个真正知道他们在做什么的人!

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我认为最好的方法是使用加密 cookie 存储。您可以在这篇文章中找到更多相关信息:

    加密的 cookie 存储 herehere

    Here,项目的github。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2016-04-01
      • 1970-01-01
      相关资源
      最近更新 更多