Rails:将加密数据存储在数据库中

时间:2010-12-03 09:13:26

标签: ruby-on-rails mongodb encryption activerecord database

我想加密数据库,因为存储了机密数据。我用mongodb和mongoid。这种数据库有可能吗?如果不是,你可以提出哪些替代方案?

P.S。主要目的是:如果有人破解服务器并窃取数据库,那将是无法加密的。

更新:感谢nickh,我发现了很多soultions for ActiveRecord,但对于Mongoid和其他Mongo clinets却没有。为Mongo和Mongoid找到一些灵魂会很棒!

5 个答案:

答案 0 :(得分:11)

我已经使用attr_encrypted与Mongo和Mongoid合作了。它只需要一些调整。

确保在模型中显式创建由attr_encrypted自动创建的所有encrypted_字段。例如,如果你有:

    attr_encrypted :email, :key => 'blah blah blah', :encode => true

你需要:

    field :email, :type => String
    field :encrypted_email, :type => String

另请注意,您需要告诉它对加密字符串进行编码,否则Mongo会大声抱怨。

最后,如果您正在加密哈希,请执行以下操作:

    field :raw_auth_hash, :type => Hash
    field :encrypted_raw_auth_hash, :type => String

    attr_encrypted :raw_auth_hash, :key => 'blah', :marshal => true, :encode => true

答案 1 :(得分:8)

attr_encrypted gem我取得了很大的成功。但是,我只在ActiveRecord中使用它。我不知道它是否适用于MongoMapper或Mongoid。

无论您如何实现此功能,我强烈建议您只加密某些字段。不要加密每个表中的每个字段。这样做会很难使用关联,使用LIKE搜索等等。

答案 2 :(得分:7)

尝试mongoid-encrypted-fields gem - 它是无缝的,因为它使用mongoize / demongoize方法处理加密。

只需定义您的字段:

field :ssn, type: Mongoid::EncryptedString

然后您可以像平常一样访问它,但数据是加密存储的。

答案 3 :(得分:1)

http://ezcrypto.rubyforge.org/

将postgreSQL与ezcrypto gem atm一起使用 - 工作得相当好,尽管在使用加密字段的模型之间使用关联存在限制(这可能取决于我无法找到该项目的正确最新分支)。

加密字段作为BYTEA数据类型存储在postgreSQL数据库中,并且通常需要转义单引号(插件的另一个问题),

PostgreSQL也可以访问自己的加密/解密模式'pgcrypto',它也返回BYTEA数据类型。不知道这将如何与Rails activerecord和模型之间的关联集成(可能很糟糕:D)。

答案 4 :(得分:0)

我在带有Mongoid ruby​​适配器的应用程序中使用MongoDB。 Ryan Bates(Rails的半神人)最近在这个问题http://railscasts.com/episodes/250-authentication-from-scratch上做了出色的轨道广播。

我在MongoDB应用程序中使用它,它可以很好地加密数据。他的教程视频主要用于加密密码,但您可以将其调整为您想要的任何其他字段值。

我也使用了attr_encrypted并取得了很大成功,但我不确定它是否适用于MongoDB;仅与ActiveRecord一起使用。