帶有密碼的“個人ID”的客戶端加密/散列?
我們正在尋找什麼
person ID
一種解決方案,使用只能在客戶端知道的(匿名形式)從伺服器儲存和檢索數據(! )。此外,客戶端應該能夠person ID
從數據記錄中計算出原始數據。在客戶端上儲存證書不是一種選擇,而是要求使用者輸入密碼。
我最初的想法
客戶端上的 PBKDF2 + AES (CCM)。但是,因為我們需要能夠稍後檢索記錄,所以我必須保持 IV(和鹽)不變。對於我所讀到的內容,這可能是一個問題(但我不確定,尤其是如果
person ID
總是小於鍵?)。我的替代想法
客戶端上的 PBKDF2 + AES (CCM),現在帶有隨機 IV。這現在只能用於
person ID
從數據記錄中計算。對於數據檢索,我們將添加一個單獨的列,其中包含客戶端計算的person ID
. 為了防止對所有有效person ID
的 ’s 進行散列並從那裡返回的攻擊,我正在考慮使用與我們用於加密的相同使用者提供的密碼進行加鹽(因為可以預期這永遠不會離開客戶端)。我真的可以對這個挑戰使用一些想法(以及上面描述的兩個想法)。
由於秘密可解密的要求,它必須被加密,而不是簡單地散列。由於要求可以通過秘密檢索記錄,因此應該對其進行確定性加密,以便可以複製。最後,客戶端不能儲存任何密鑰或鹽,這使事情變得複雜。
這表明客戶端應該使用不需要 IV的
person ID
例如AES-SIV來加密秘密。加密密鑰可以從密碼和常量鹽(每個客戶端,而不是每個記錄)派生,不需要是秘密的或隨機的(但可以用於針對伺服器的一些額外保護)。可能的密鑰派生函式包括例如 PBKDF2、bcrypt、scrypt 或 argon2。我更喜歡後面的那些,但如果密碼是好的,它們中的任何一個都是可以接受的。
(請注意,不使用隨機數的 AES SIV 與任何確定性加密一樣,會洩漏
person ID
s 的相等性(根據設計),因此它們都應該是唯一的,才能正常工作。)