使用 XOR 加密 32 位數字是否安全?
假設我有一個 32 位數字和一個主密鑰,並且想在不增加大小的情況下對其進行加密。
這就是我進行加密的方式,
- 我使用主鍵和目前日期作為數據創建一個 HMAC 散列
- 然後將輸入字節與雜湊字節異或幾次
for (let offset = 0; offset < hash.length - 4; offset++) { const key = hash.readUInt32BE(offset); input ^= key; }
安全嗎?如果不是,是否有任何安全的削片算法可以在不增加數據大小的情況下加密 32(或更少)位數據
我真的很感激你能提供的任何幫助。
原則上,您正在創建一個基於秘密密鑰和公開的、希望不重複的資訊的密鑰流:日期。這可能是安全的,畢竟流密碼就是這樣工作的。
然而,這就是理論,讓我們研究一下您的方案的實際問題:
- 你有辦法儲存或恢復目前日期嗎?如果您需要儲存它,那麼您已經增加了數據大小。
- 此處的日期充當隨機數,否則安全性與多次一密一樣低。
至於2:你怎麼確定你沒有重複日期?您能 100% 確定加密方法僅在一個特定日期被呼叫一次嗎?我假設您使用的是無法自行重複的日期格式,但時鐘差異等仍然是一個問題。
您可能正在尋找的密碼類型稱為FPS,Format Preserving Encryption。它與流密碼有一點不同的安全主張:它是安全的,除了它會為相同的輸入創建相同的密文。
但是,可以將密碼與所謂的“調整”結合起來,這可能是公開的:
除了模式提供機密性的格式化數據外,每種模式還需要一個稱為“調整”的額外輸入,這不一定是秘密的。tweak可以看作是密鑰的可變部分,因為它們共同決定了加密和解密的功能。不同的調整對於 FPE 模式的實現尤其重要,因為機密數據的可能值的數量通常相對較小,如附錄 A 和附錄 C 中所述。
你的“日期”可能是一個完美的調整,或者至少是調整的一部分,假設日期不需要額外的儲存(這當然會破壞 FPS 方案的目的)。原則上,每個明文通用的不斷變化的輸入(如目前日期)並不是調整的最佳輸入。對與明文相關的不變數據元素進行散列會更好,例如使用者 ID + 列名。
FPE 的一個實際缺點是主流加密庫中經常缺少它。它也有一些與之相關的密碼安全性中斷和接近中斷,特別是對於小域 - 所以請保持警惕,不要只使用任何 FPE 方案或實施。