Aes
如何能夠更改密碼以訪問使用 AES-GCM 加密的數據,而無需重新加密?
假設您需要加密
plaintext
1 TB 的大小。你有一個密碼
pwd
。應用了這個非常經典的 AES-GCM 過程(虛擬碼):salt = 16 random bytes key = PBKDF2(pwd, salt, count=1000*1000) # key derivation function nonce = 16 random bytes ciphertext, tag = AES_GCM_cipher(key, nonce).encrypt(plaintext) # by blocks in reality save to disk: salt | nonce | ciphertext | tag
現在,如果我懷疑
pwd
受到威脅,並且想將其更改為pwd_new
,我必須重新啟動整個加密過程,這對於 1 TB 的數據來說可能很長。問題:我可以使用哪種簡單的加密方案,仍然對實際數據使用 AES-GCM,這樣我就可以更改密碼而無需重新加密/重寫所有數據?
(例如在 Microsoft BitLocker 磁碟加密等中有此實現)
這是軟體工程基本定理的情況,該定理指出:
“我們可以通過引入額外的間接級別來解決任何問題。”
在這種情況下,通常要做的是引入一個額外隨機抽取的中間密鑰(通常稱為“數據加密密鑰,DEK”)。
然後,您使用從您的密碼派生的密鑰(有時也稱為“密鑰加密密鑰,KEK”)加密 DEK,每當您想更改密碼時,您只需重新派生 KEK、解密 DEK 並在新密碼下派生 KEK用(也最好使用新鮮的鹽)加密 DEK。