【问题标题】:Rails: storing encrypted data in databaseRails:将加密数据存储在数据库中
【发布时间】:2026-01-26 16:30:01
【问题描述】:

我想加密数据库,因为正在存储机密数据。我将 mongodb 与 mongoid 一起使用。这种数据库可能吗?如果不是,您可以推荐哪些替代方案?

附:主要目的是:如果有人入侵服务器并窃取数据库,它将无法加密。

更新:感谢nickh,我找到了很多soultions for ActiveRecord,但对于 Mongoid 和其他 Mongo 客户却一无所获。很高兴能为 Mongo 和 Mongoid 找到一些灵魂!

【问题讨论】:

  • 除非您从服务器上取下私钥并将其存储在其他地方(即:您的应用程序不需要使用存储的数据),否则一旦您被黑客入侵,游戏就结束了。只是经验中的一点建议。
  • 我在一台服务器上部署数据库,在另一台服务器上部署 Rails 应用程序。因此,黑客入侵的可能性降低了两倍。那么可以动态加密数据库中的数据吗?

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


【解决方案1】:

我已经使用 Mongo 和 Mongoid 获得了 attr_encrypted。只需稍作调整。

确保所有由 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

【讨论】:

    【解决方案2】:

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

    无论您如何实现这一点,我都强烈建议您只加密某些字段。不要加密每个表中的每个字段。这样做会使使用关联、使用 LIKE 进行搜索等变得困难。

    【讨论】:

    【解决方案3】:

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

    只需定义您的字段,例如:

    field :ssn, type: Mongoid::EncryptedString
    

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

    【讨论】:

      【解决方案4】:

      http://ezcrypto.rubyforge.org/

      将 postgreSQL 与 ezcrypto gem atm 一起使用 - 尽管在使用具有加密字段的模型之间的关联方面存在限制,但效果相当好(这可能是由于我无法找到该项目的正确最新分支)。

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】: