2011-04-28 109 views
0

我有一个密码来解密使用我的rails应用程序中的公钥的数据。如何存储密码以解密安全数据?

当用户尝试去特定菜单(例如“发票”)以解密合理数据时,我向用户询问“密码”。

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

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

+0

你能解释一下你想存储多长时间吗?你是否需要跨越请求存储它,还是比这更长远?他们是否需要对所有数据进行解密,或者一次只进行一次? – 2011-04-28 15:58:20

+0

我需要存储我的密码。当用户会话过期时,用户需要再次输入正确的密码才能访问合理的数据。 – 2011-04-28 16:07:21

+0

如果这是一个Rails Web应用程序,用户是否通过不安全的http连接发送他的密码短语?如果是这样,攻击者可以捕获并冒充用户。为什么不能用https保护此通信? – 2011-04-28 17:39:30

回答

0

我认为最好的方法是使用加密的cookie存储。你可以找到这个文章有关的详细信息:

加密cookie存储herehere

Here,该项目的github上。

1

假设:

  • 你的要求是,用户可以输入一次密码短语,然后访问所有的数据对他们的会话的剩余部分。
  • 您有大量数据要加密每个帐户(即多个发票)。使用安全,随机密钥(数据键)和对称密码(例如AES)

    • 加密所有连接到用户的账户数据:

    我会做类似如下。

  • 为每个帐户分配一个公钥/私钥(帐户密钥),并带有用户选择的密码。
  • 使用公共账号密钥对数据密钥进行加密并存储。
  • 创建应用程序范围内的安全随机密钥(会话密钥)。
  • 当用户输入密码时,用它来解密他们的数据密钥,然后立即使用会话密钥对其进行重新加密,并将其存储在他们的会话或cookie中。在会话中分别存储时间戳,记录密钥的加密时间,并通过创建时间戳,加密数据密钥和会话密钥的散列来签名。

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

  • 拉动加密的数据密钥,时间戳和签名中的散列出来的会话。根据时间戳,加密数据密钥和会话密钥重新计算哈希,并检查它是否与会话中的哈希相匹配(即没有任何内容被篡改)。
  • 比较时间戳到'现在',并决定这是否是最近的,你会信任它(即它没有被中间人攻击的一个人偷走)。
  • 当且仅当没关系,使用会话密钥解密数据密钥。
  • 使用数据密钥解密数据。

如果你想额外的安全性,你可以定期轮流会话密钥,以确保即使攻击者设法得到别人的会话加密的数据类型的时候,就不得不在妥协应用程序本身同时为了获得相关的会话密钥。

这可能会过度复杂,以满足您的需求。如果不是的话,请记住我不是密码学家,所以使用这个需要您自担风险,并且如果您担心的话,找一个真正了解他们在干什么的人!

希望有所帮助。

相关问题