4

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

应用行为:

  1. 用户注册一个帐户。创建用户名和密码。
  2. 登录到他的仪表板。
  3. 特定表中的某些字段必须受到保护。

基本上,我正在寻找模型属性的自动加密。像这样的东西:

class Transaction
  include DataMapper::Resource

  property :id, Serial
  property :value, String, :length => 1024, :encrypted => true
  ... etc ...
  belongs_to :user
end

我认为即时加密/解密会导致性能问题,但这没关系。至少如果可行的话——我很好。

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

4

7 回答 7

3

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

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

于 2009-12-08T17:13:41.667 回答
2

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

如果您确实需要存储加密数据,那么您还需要能够解密(而不是单向哈希),那么这里有很多关于 ruby​​ 加密的内容:http ://www.example-code.com /ruby/加密.asp

于 2009-12-08T17:06:30.680 回答
1

我必须这样做来加密敏感数据。我包装了保险箱 gem,它在 github 上:http: //github.com/bitzesty/safe

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

于 2009-12-10T04:11:58.017 回答
1

您当然应该在用户端加密/解密数据 - 否则加密存储没有意义,因为私人数据的轨道仍然存在于某处 - 在网络缓存中,在不同类型的交换文件中等。此外,可以使用 Man-In 嗅探数据-The-Middle 攻击。

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

您应该在提交表单之前加密数据(使用onClick“提交”按钮 fe 的回调),然后像往常一样传递到服务器并处理。

缺点是您不能使用任何带有此类数据的 Rails - 只能使用客户端 javascript。

于 2009-12-09T10:45:19.810 回答
0

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

于 2009-12-08T17:00:18.380 回答
0

存储可以转换为明文的用户密码通常不是一个好主意。

通常,它存储为 MD5 或 SHA1 的盐渍哈希。

所以,你有一个随机的盐,将它存储在用户的表中,然后你散列他们的通行证和盐,如下所示:

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

我建议不要存储可以返回的通行证,我建议您存储它的唯一方法是单向哈希。

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

于 2009-12-08T17:05:21.480 回答
0

attr_encrypted 也可能是加密敏感数据的解决方案,与 ruby​​ 类或 ActiveRecord、DataMapper 或 Rails 中的 Sequel 一起使用。

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

于 2014-09-11T19:04:55.617 回答