【问题标题】:How to store passwords in Database [duplicate]如何在数据库中存储密码[重复]
【发布时间】:2011-12-25 07:32:10
【问题描述】:

可能重复:
What is the best way to store password in database when API call requires sending of password in plain text?

我目前正在构建一个网站,该网站集成了 Web 上的许多服务,例如 Delicious、Zootool 等。其中一些服务让我使用 OAuth 安全地连接到它们。其他网站,例如 Delicious,强制我使用 HTTP Auth 与他们通信。

不幸的是,这意味着我必须以可以恢复为纯文本的方式存储密码。也许使用我网站上的用户密码(哈希)进行加密会起作用,但这意味着用户必须在密码更改后再次登录各种服务。

对于优雅的解决方案有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby security authentication passwords


    【解决方案1】:

    用户密码哈希在数据库中是明确的,所以同样的问题。一种解决方案可能是使用您的站点用户密码加密第三方密码。当用户更改密码时,询问他旧密码和新密码。然后用旧密码解密第三方密码并用新密码加密它们。

    只有当您在会话中将用户密码保存在任何其他变量上时,这才会起作用。

    这将避免你在数据库上保存明文密码,但你仍然在内存中有明文密码。

    【讨论】:

    • 但这意味着用户每次添加新服务时都必须输入网站密码。
    • 我的建议是将用户密码保存在 RAM 中(即保存在 ruby​​ 变量中)。请注意,如果您将用户的非加密密码存储在数据库中的任何位置,则几乎无法使用它来加密数据库中的其他密码。
    【解决方案2】:

    加密和解密数据。例如使用内置 mysql aes/des 方法。

    确保您没有将密钥也存储在数据库中。

    【讨论】:

      【解决方案3】:

      Ok 为 Mongoid 创建了以下类:

      class EncryptedString < String
        include Mongoid::Fields::Serializable
      
        def deserialize(value)
          Gibberish::AES.new(ENV['AES_KEY']).decrypt(value)
        end
      
        def serialize(value)
          Gibberish::AES.new(ENV['AES_KEY']).encrypt(value)
        end
      end
      

      我的模型代码如下所示:

      class User
        include Mongoid::Document
      
        field :password, type: EncryptedString
      end
      

      有什么问题吗?

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 2012-09-25
        • 2012-02-16
        • 1970-01-01
        • 2011-02-27
        • 2022-10-19
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        相关资源
        最近更新 更多