2011-04-28 100 views
0

我有一個密碼來解密使用我的rails應用程序中的公鑰的數據。如何存儲密碼以解密安全數據?

當用戶嘗試去特定菜單(例如「發票」)以解密合理數據時,我向用戶詢問「密碼」。

不建議將密碼直接存儲到用戶會話/ cookie(出於安全原因)。

那麼,沒有安全漏洞的情況下存儲此密碼短語的最佳方式是什麼?

+0

你能解釋一下你想存儲多長時間嗎?你是否需要跨越請求存儲它,還是比這更長遠?他們是否需要對所有數據進行解密,或者一次只進行一次? – 2011-04-28 15:58:20

+0

我需要存儲我的密碼。當用戶會話過期時,用戶需要再次輸入正確的密碼才能訪問合理的數據。 – 2011-04-28 16:07:21

+0

如果這是一個Rails Web應用程序,用戶是否通過不安全的http連接發送他的密碼短語?如果是這樣,攻擊者可以捕獲並冒充用戶。爲什麼不能用https保護此通信? – 2011-04-28 17:39:30

回答

0

我認爲最好的方法是使用加密的cookie存儲。你可以找到這個文章有關的詳細信息:

加密cookie存儲herehere

Here,該項目的github上。

1

假設:

  • 你的要求是,用戶可以輸入一次密碼短語,然後訪問所有的數據對他們的會話的剩餘部分。
  • 您有大量數據要加密每個帳戶(即多個發票)。使用安全,隨機密鑰(數據鍵)和對稱密碼(例如AES)

    • 加密所有連接到用戶的賬戶數據:

    我會做類似如下。

  • 爲每個帳戶分配一個公鑰/私鑰(帳戶密鑰),並帶有用戶選擇的密碼。
  • 使用公共賬號密鑰對數據密鑰進行加密並存儲。
  • 創建應用程序範圍內的安全隨機密鑰(會話密鑰)。
  • 當用戶輸入密碼時,用它來解密他們的數據密鑰,然後立即使用會話密鑰對其進行重新加密,並將其存儲在他們的會話或cookie中。在會話中分別存儲時間戳,記錄密鑰的加密時間,並通過創建時間戳,加密數據密鑰和會話密鑰的散列來簽名。

當他們想看看一些數據,那麼:

  • 拉動加密的數據密鑰,時間戳和簽名中的散列出來的會話。根據時間戳,加密數據密鑰和會話密鑰重新計算哈希,並檢查它是否與會話中的哈希相匹配(即沒有任何內容被篡改)。
  • 比較時間戳到'現在',並決定這是否是最近的,你會信任它(即它沒有被中間人攻擊的一個人偷走)。
  • 當且僅當沒關係,使用會話密鑰解密數據密鑰。
  • 使用數據密鑰解密數據。

如果你想額外的安全性,你可以定期輪流會話密鑰,以確保即使攻擊者設法得到別人的會話加密的數據類型的時候,就不得不在妥協應用程序本身同時爲了獲得相關的會話密鑰。

這可能會過度複雜,以滿足您的需求。如果不是的話,請記住我不是密碼學家,所以使用這個需要您自擔風險,並且如果您擔心的話,找一個真正瞭解他們在幹什麼的人!

希望有所幫助。