假设一个应用程序具有属于用户的特定数据,除了所有者之外,没有人应该看到它。我使用MySQL数据库和DataMapper ORM映射器。该应用程序是用Ruby on Sinatra编写的。
申请行为:
基本上,我正在寻找模型属性的自动加密。像这样:
class Transaction
include DataMapper::Resource
property :id, Serial
property :value, String, :length => 1024, :encrypted => true
... etc ...
belongs_to :user
end
我认为动态加密/解密会导致性能问题,但没关系。至少如果有效 - 我很好。
任何想法如何做到这一点?
答案 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。