我正在編寫一個Rails 3 Web應用程序,其中匿名用戶將能夠輸入有關事件的詳細信息,並將它們加密到我的數據庫中,只能由該用戶或具有用戶每次事件密碼創造它。我的加密密鑰加密方法是否安全?
我這樣做是爲了讓我的頭腦加密和哈希編程,所以它可能有點矯枉過正,但我希望有一個'最安全'的工作模式而不涉及隱藏在地殼下30公里的祕密保險庫中的任何網絡的計算機(其中我已經有兩臺)。
我正在存儲的當前數據和它的加密如下,我只是想了解我是否使用了任何不安全的方法或會削弱我的應用程序的任何反饋(特別是我的用戶數據)進行攻擊。
每一個事件都有使用透明數據加密存儲在Oracle數據庫中的以下字段:
- ID
- EVENT_DATA
- password_hash
- encrypted_iv
- encrypted_key
- admin_retrievable_event_data
- 廣告min_encrypted_iv
- admin_encrypted_key
的Web服務器是有限制的系統權限,完全補丁運行,並且Web服務器進程無法外面瀏覽該網站的目錄結構。 網絡服務器只運行HTTPS。
當用戶創建事件時,他們提供明文數據以進入event_data字段,並提供用於保護該數據的密碼。要檢索數據,他們只需輸入提交表單後提供給他們的身份證號碼以及他們選擇的密碼。在創建活動期間,用戶還可以選中一個框以允許生成管理員可檢索數據(如果他們選擇的話)。該選項默認設置爲false。
事件的明文仍然保留在內存中用於管理檢索,如後面所述。
事件數據使用AES256 CBC加密與安全生成的隨機IV和密鑰進行保護。然後使用存儲在服務器上的公鑰(RSA 2048位)對IV和密鑰進行加密。然後,IV和密鑰與用戶提供的密碼的SHA-256散列進行XOR,隨後將兩者存儲在數據庫中。
然後用SHA-256使用256位安全隨機生成的令牌作爲鹽對用戶密碼進行哈希處理,使用包含散列和鹽的冒號定界符創建字符串,然後使用公鑰對其進行加密(與以前相同)並存儲在數據庫password_hash字段中。
然後,明文事件數據通過一個新隨機生成的密鑰和IV進行管理檢索並存儲,密鑰和IV隨後使用不同的公鑰(僅用於管理檢索)加密,然後經過相同的過程,並存儲在數據庫中而不與任何事物進行異或。
要檢索數據,用戶輸入他們的事件ID和密碼。首先,使用私鑰(存儲在服務器上的非Web可訪問的目錄中)(該私鑰的密碼被硬編碼到應用程序中)對password_hash進行解密,然後使用用戶輸入的密碼salt從現在未加密的數據庫條目中取出,如果它與存儲的醃製密碼的哈希相匹配,則該過程繼續(否則,返回「未找到事件ID或密碼不正確」的錯誤)。
然後,加密的密鑰和IV與新生成的用戶密碼的無用哈希進行異或,並使用用於密碼哈希的相同私鑰/密碼進行解密。這些隨後用於解密event_data,並將數據返回給用戶。
如果管理員希望檢索數據,他們必須上傳私鑰並輸入私鑰的密碼,此時管理員IV和密鑰被解密,內存中的私鑰被銷燬,管理員可以檢索事件數據被解密。
所以,這就是我對這個東西的設計,目前唯一的弱點,我已經確定被存儲用於在服務器上的事件和用戶密碼加密私鑰,並具有私鑰密碼硬編碼進入應用程序。然而,我不能在硬件加密設備上投入大量資金。如果任何人都可以提出一種更好的架構方式來避免這個問題,並且不會給終端用戶帶來不便,因爲他們爲每個事件生成一個單獨的證書並給他們私鑰,隨後迫使他們每次想要解密事件時都要重新上傳它數據,我不止對它開放。
如果您發現除這些問題以外的其他問題,我也很想知道這些問題,並且很樂意提供資源來閱讀或解釋問題所在以及我可以如何解決問題。
請注意,我沒有大學水平的數學知識,儘管我很想了解加密技術,但我遠遠低於可以爲自己做任何形式的加密分析的水平。通過這個項目,我只是簡單地閱讀了我能理解的概述,並嘗試應用這些知識。