Encryption
如何正確地 AES 加密字元串,從相同的字元串派生密鑰?
假設某人有一個名字列表,例如:
'Batman' 'Batman' 'Super Man'
我正在審核此列表,但我無權訪問所有名稱。所以它們必須被加密。
我應該能夠:
- 確定一個名稱在列表中出現兩次,並且一個名稱出現一次
- 獲取一個明文名稱(來自列表所有者)並將其用作解密其加密版本的密鑰
一種方法是列表所有者使用預先確定的 iv 和用於生成密鑰的預先確定的算法來加密名稱。只是為了說明,一個簡單的算法可以是附加 0,直到密鑰為 32 位:
batman_cipher = SymmetricEncryption::Cipher.new(key: 'Batman00000000000000000000000000', iv: '1234567890ABCDEF', cipher_name: 'aes-128-cbc') super_man_cipher = SymmetricEncryption::Cipher.new(key: 'Super Man00000000000000000000000', iv: '1234567890ABCDEF', cipher_name: 'aes-128-cbc') batman_cipher.encrypt('Batman') # => 'TYBaLlaS/8QogiyBt77LVQ==' super_man_cipher.encrypt('Super Man') # => 'aSrFGzbWjwXGpEf0VU8t4Q=='
加密列表將是:
'TYBaLlaS/8QogiyBt77LVQ==' 'TYBaLlaS/8QogiyBt77LVQ==' 'aSrFGzbWjwXGpEf0VU8t4Q=='
我獲得明文名稱的唯一方法是猜測或向列表所有者詢問其中一個名稱,以便我可以對其進行測試:
batman_cipher.decrypt('TYBaLlaS/8QogiyBt77LVQ==') # => 'Batman'
我的問題:除非有更好的方法,否則加強安全性的最佳策略是什麼,例如生成安全密鑰?
從要加密的字元串中派生密鑰似乎沒有特定的安全隱患。我在別處能找到的最佳策略是散列字元串並將其輸出截斷為 32 位
我的問題:除非有更好的方法,否則加強安全性的最佳策略是什麼,例如生成安全密鑰?
當您想為密碼派生密鑰時,請使用 KDF,密碼需要高熵密鑰,以避免潛在的弱點。此外,這樣可以避免字元串長度超過密鑰大小的任何問題。
但看起來你根本不需要加密。您可以獲取每個項目的雜湊值。然後您可以檢查重複列表,並請求原始文本,然後您可以驗證,因為您有雜湊。這與加密非常相似,除了理論上你可以得到衝突(但如果你在現代雜湊中發現衝突,那將是一件特別的事情 - 還沒有人管理它)。
我相信您想使用收斂加密方案。許多雲儲存提供商使用這些方案進行重複數據刪除(通常使用自定義分段過程,例如密鑰為 HKDF/SHA-256,加密為 AES-GCM)。