使用用户密码保持数据库数据加密的最佳方法是什么?

时间:2009-12-08 16:56:58

标签: ruby database encryption sinatra

假设一个应用程序具有属于用户的特定数据,除了所有者之外,没有人应该看到它。我使用MySQL数据库和DataMapper ORM映射器。该应用程序是用Ruby on Sinatra编写的。

申请行为:

  1. 用户注册一个帐户。创建用户名和密码。
  2. 登录他的仪表板。
  3. 必须保护特定表格中的某些字段。
  4. 基本上,我正在寻找模型属性的自动加密。像这样:

    class Transaction
      include DataMapper::Resource
    
      property :id, Serial
      property :value, String, :length => 1024, :encrypted => true
      ... etc ...
      belongs_to :user
    end
    

    我认为动态加密/解密会导致性能问题,但没关系。至少如果有效 - 我很好。

    任何想法如何做到这一点?

7 个答案:

答案 0 :(得分:3)

我不会存储依赖用户记住密码然后使用该密码解密数据的任何数据。当用户更改密码时您打算做什么?解密/加密一切?我对此表示怀疑。如果管理员重置密码怎么办?所有数据丢失了?我再次怀疑它。

请参阅有关存储机密的其他链接,但请不要使用用户的任何值作为加密的一部分。

答案 1 :(得分:2)

所以你想存储加密在数据库中的数据?首先,我会请你考虑为什么需要这样做?您应该能够编写应用程序,以便只有经过身份验证的用户才能访问自己的数据。

如果您确实需要存储加密数据,那么您还需要能够解密(而不是单向散列),那么ruby中有很多加密:http://www.example-code.com/ruby/encryption.asp

答案 2 :(得分:1)

你当然应该加密/解密用户端的数据 - 否则加密存储中没有任何意义,因为私有数据的踪迹仍然存在于某个地方 - 在网络缓存中,在不同类型的交换文件中等等。此外,数据可以被嗅探中间人攻击。

所以你可能想要的是基于javascript的客户端加密。主题在http://javascript.about.com/library/blencrypt.htm(Rijndael加密算法)中有很大的涵盖,http://www.movable-type.co.uk/scripts/aes.html上有很棒的AES实现库

您应该在提交表单之前加密数据(使用onClick回调“提交”按钮(例如),然后传递给服务器并照常处理。

缺点是你不能将任何Rails与这样的数据一起使用 - 只有客户端javascript。

答案 3 :(得分:1)

我必须这样做才能加密敏感数据。我包装了strongbox gem,它位于github上:http://github.com/bitzesty/safe

safe gem提供AR属性的公钥加密。

答案 4 :(得分:0)

您使用单向散列算法。散列密码并存储散列。然后,只要用户输入密码,您就会对输入的密码进行哈希处理,并将其与存储的哈希密码进行比较。如果它们是相同的,你就让它们通过。如果没有,他们就会被拒绝。

答案 5 :(得分:0)

将用户的密码存储为纯文本通常不是一个好主意。

通常将其存储为MD5或SHA1的盐渍哈希值。

所以,你有一个随机的盐,将它存储在用户的表中,然后你将它们的传递和盐哈希,如下所示:

$hash = md5(md5(salt) + pass)

我建议不要存储可以返回的传递,我建议你存储它的唯一方法是使用单向哈希。

也就是说,您可以使用一些加密方案,例如RSA加密。这样,您的应用程序将使用您的公钥加密从最终用户收到的用户密码,当您需要解密时,请使用您的私钥进行加密。用这种方式存储密钥的应用程序非常有限(例如自动登录到另一个站点)并且通常不赞成。

答案 6 :(得分:0)

attr_encrypted也可能是加密敏感数据的解决方案,适用于ruby类或ActiveRecord,DataMapper或Rails中的Sequel。

https://github.com/attr-encrypted/attr_encrypted