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

13

我希望对数据库进行加密,因为其中存储了机密数据。我使用mongoid的mongodb。这种类型的数据库是否支持加密?如果不支持,您能推荐什么替代品吗?

P.S. 主要目的是:如果任何人黑入服务器并窃取数据库,那么它将无法被解密。

更新:感谢 nickh,我发现了很多针对ActiveRecord的解决方案,但对于Mongoid和其他Mongo客户端却没有找到。如果能找到适用于Mongo和Mongoid的解决方案,那将非常棒!


除非您将私钥从服务器上取下并存储在其他地方(即:您的应用程序不需要使用存储的数据),否则一旦被黑客攻击,一切就结束了。这只是基于经验的一点建议。 - Stefan Mai
1
我将数据库部署在一台服务器上,Rails应用程序部署在另一台服务器上。因此,黑客攻击的概率降低了两倍。那么,在数据存储时进行加密处理是否可行? - petRUShka
5个回答

11

我已经成功地在Mongo和Mongoid中使用attr_encrypted。只需要进行一些微调。

确保模型中显式创建了由attr_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

8
我用attr_encrypted gem 取得了很大的成功,但我只在ActiveRecord中使用过它。我不知道它是否适用于MongoMapper或Mongoid。
无论如何实现, 我强烈推荐只加密某些字段。不要加密每个表中的每个字段。这样做会使关联、LIKE 搜索等变得困难。

谢谢,但您是否了解Mongoid或其他MongoDB客户端特别的内容? - petRUShka
从我的记忆中,我不知道。然而,如果你看一下attr_encrypted的编写方式,只需要编写一个Mongoid适配器即可: https://github.com/shuber/attr_encrypted/tree/master/lib/attr_encrypted/adapters - nickh

7
尝试使用mongoid-encrypted-fields gem - 它很方便,因为它使用mongoize/demongoize方法来处理加密。
只需像下面这样定义您的字段即可:
field :ssn, type: Mongoid::EncryptedString

那么您可以像平常一样访问它,但数据会被加密存储。


1

http://ezcrypto.rubyforge.org/

目前使用ezcrypto gem与postgreSQL - 相当好用,尽管在使用加密字段的模型之间的关联时存在一些限制(这可能是由于我无法找到此项目的正确最新分支)。

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

PostgreSQL还可以访问其自己的加密/解密模块'pgcrypto',它也返回BYTEA数据类型。不确定如何将其与Rails activerecord和模型之间的关联集成(可能效果不佳:D)。


0

我在一个应用程序中使用Mongoid Ruby适配器来使用MongoDB。Rails的半神Ryan Bates最近在这个问题上制作了一部非常出色的railscast http://railscasts.com/episodes/250-authentication-from-scratch

我在一个MongoDB应用程序中使用它,它可以完美地加密数据。他的教程视频主要是为了加密密码,但你可以将其适应于任何其他字段值。

我也已经成功地使用attr_encrypted,但我不确定它是否适用于MongoDB;只在ActiveRecord中使用过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接