2011-11-09 203 views
1

可能重复:
What is the best way to store password in database when API call requires sending of password in plain text?如何密码储存在数据库

我目前正在建设一个网站,在网站上有很多服务集成,如美味,Zootool和等等。其中一些服务让我可以使用OAuth安全地连接到他们。其他网站,例如Delicious,迫使我使用HTTP Auth与他们沟通。

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

一个优雅的解决方案的任何想法?

回答

0

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

只有在会话中将用户密码保存在任何其他变量中时,此功能才有效。

这样可以避免您在数据库上保存清除密码,但您仍然在内存中拥有清晰的密码。

+0

但是这意味着用户每次添加新服务时都必须输入网站的密码。 –

+0

我的建议是将用户密码保存在RAM中(即在一个ruby变量中)。请注意,如果您存储在数据库中的任何位置,您的用户的非ecrypted密码几乎无用,可用于对数据库中的其他密码进行加密。 – Paolo

0

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

确保您不要将密钥存储在数据库中。

0

好创建以下类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 

任何顾虑吗?

+0

在mongoid 3.0中不起作用 – Orlando

相关问题