2011-11-09 80 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