我加密加密密钥的方法是否安全?

时间:2012-09-11 08:21:42

标签: ruby-on-rails encryption hash security

我正在编写一个Rails 3 Web应用程序,其中匿名用户可以输入有关事件的详细信息并在我的数据库中加密,只能由该用户或任何具有每事件密码的用户检索决定何时创建它。

我这样做是为了让我全神贯注于加密和散列编程,所以它可能有点矫枉过正,但我​​想要有一个工作模型的&#39 ;最安全的'做事的方式,没有进入双因素身份验证或计算机没有连接到隐藏在地壳下30公里的秘密金库中的任何网络(我已经有两个)。

我存储的当前数据及其加密全部如下,我只是想一些关于我是否使用任何不安全方法或任何会削弱我的应用程序的反馈(特别是我的用户的数据)要攻击。

每个事件都使用透明数据加密将以下字段存储在Oracle数据库中:

  • ID
  • EVENT_DATA
  • password_hash
  • encrypted_iv
  • encrypted_key
  • admin_retrievable_event_data
  • admin_encrypted_iv
  • admin_encrypted_key

网络服务器运行时具有受限制的系统权限,已完全修补,并且网络服务器进程无法在网站的目录结构之外浏览。 网络服务器只运行HTTPS。

当用户创建事件时,他们提供明文数据以进入event_data字段,并提供密码以保护该数据。要检索数据,他们只需要在提交表单后输入提供给他们的ID号,以及他们选择的密码。在事件创建期间,用户还可以选中一个框以允许生成管理员可检索数据(如果他们选择)。默认情况下,此选项设置为false。

此事件的明文仍保留在内存中,以便进行管理检索,如后所述。

使用AES256 CBC加密以及安全生成的随机IV和密钥来保护事件数据。然后使用存储在服务器上的公钥(RSA 2048位)对IV和密钥进行加密。然后,IV和密钥都与用户提供的密码的SHA-256哈希进行异或,然后都存储在数据库中。

然后使用256位安全随机生成的令牌作为salt,使用SHA-256对用户密码进行哈希处理,使用包含哈希和salt的冒号分隔符创建字符串,然后使用公钥加密(相同)一个如前所述)并存储在数据库password_hash字段中。

然后,明文事件数据通过相同的过程与新随机生成的密钥和IV进行管理检索并存储,密钥和IV然后使用不同的公钥加密(仅用于管理检索),以及存储在数据库中而不是对任何东西进行异或。

要检索数据,用户输入其事件ID和密码。首先,使用私钥(存储在非Web可访问目录中的服务器上)将password_hash解密(该私钥的密码被硬编码到应用程序中),然后使用以下方式重新进行用户输入的密码。来自现在未加密的数据库条目的salt,如果它与存储的salted密码的哈希相匹配,则该过程继续(否则,返回错误"找不到事件ID或密码不正确")。

然后将加密的密钥和IV与用户密码的新生成的未加盐的哈希进行异或,并使用用于密码哈希的相同私钥/密码进行解密。这些随后用于解密event_data,并将数据返回给用户。

如果管理员希望检索数据,他们必须上传私钥并输入私钥的密码,此时管理员IV和密钥被解密,内存中的私钥被销毁,并且管理员可检索的事件数据被解密。


所以,这就是我对这件事的设计,我唯一确定的当前弱点是在服务器上存储用于事件和用户密码加密的私钥,并将该私钥密码硬编码到应用程序。然而,我无法在基于硬件的加密设备上花费大量资金。如果任何人都可以通过为每个事件生成一个单独的证书并为其提供私钥来建议更好的方法来构建这个以避免该问题并且不会给最终用户带来不便,随后强制他们每次想要解密事件时重新上载它数据,我不仅仅是对它开放。

如果您发现除此之外的任何问题,我也非常好奇地听到它,并且很乐意获得资源阅读或解释问题是什么以及我可以做些什么来纠正它

请注意,我不具备大学水平的数学知识,尽管我非常想要了解加密技术,但我远远低于可以为自己进行任何加密分析的水平。通过这个项目,我只是简单地完成了对我所能理解的概述的阅读,并尝试应用这些知识。

1 个答案:

答案 0 :(得分:1)

这个计划看起来非常复杂,而且魔鬼总是处于细节之中。如果您的应用程序能够在未经用户许可的情况下检索数据,那么您添加的所有加密糖可能都不值得,因为攻击很可能来自应用程序层。

看看(好)全盘加密软件的工作原理。如果没有太多具体细节,请考虑只是获取用户的密码,对其进行哈希处理(使用您喜欢的任何哈希函数),并在加密数据时将其用作对称密钥。如果用户忘记了密码,那么数据就没用了。

你可以在那里添加一些盐来防止字典攻击,但是你需要在某处存储盐...

对于管理员访问权限,生成随机密码,通过电子邮件发送给管理员,然后对其进行哈希处理,使用它加密数据,并将其单独存储在数据库中。

看看http://blog.cryptographyengineering.com/2011/11/how-not-to-use-symmetric-encryption.html,它深入探讨了如何最好地处理IV和加密模式。