數據損壞以保護加密?
在KeePass 幫助中心上,它指出:
…如果數據庫的標頭(前幾個字節)已損壞,那麼您也不走運:修復功能將無法恢復任何條目(因為標頭包含解密數據庫所需的資訊) .
我想知道標頭損壞(或其他類型的小損壞)是否會導致無法(即使您有密碼)從加密文件中解密任何數據,例如 KeePass 數據庫、7z 檔案、VeraCrypt 容器……?
除了 Bapcap 的回答之外,基於密碼的加密系統(KeePassXC、Veracrypt 等)與純基於密鑰的加密系統(密鑰模式中的年齡、帶有 TPM 的 BitLocker 等)的執行方式不同。
基於密碼的加密系統需要能夠允許使用者更改密碼,而無需重新加密所有加密數據。他們通過擁有兩個加密密鑰來做到這一點。
首先,使用“密碼散列函式”(例如 Argon2 或 bcrypt)從使用者的密碼、鹽和一些難度參數導出“密鑰加密密鑰”(KEK)。然後生成一個隨機的“數據加密密鑰”(DEK)。數據使用 DEK 加密,然後 DEK 使用 KEK 加密。加密的 DEK、salt 和難度參數儲存在加密文件數據文件的“標題”中。
為解密數據,讀取標頭,對使用者密碼進行雜湊處理(使用鹽和使用參數)以導出 KEK,然後解密 DEK。然後用 DEK 解密文件。
要更改使用者的密碼,就像解密文件時一樣導出 KEK,然後解密 DEK。然後使用新的鹽和參數創建一個新的 KEK,使用新的 KEK 對 DEK 進行加密,並將加密的 DEK、新的鹽和參數儲存在標頭中。
在大多數加密算法的標頭中,標頭不應該是密鑰本身,那將是愚蠢的不安全。Header 只是通知程序這是一個已用它加密的驅動器。通過擦除標頭,您消除了它感知它已加密的能力,因此無法判斷它是否只是垃圾數據或混淆數據。
例如,在 Veracrypt 上,標頭是 ASCII 字元串“VERA”。如果解密的前四個字節有這個字元串,則其餘字節和位的解密被認為是成功的並且對原始數據是真實的。擦掉它就無法分辨了。這個頭是加密的,所以它已經被混淆了。
如果解密數據的前 4 個字節包含 ASCII 字元串“VERA”,並且解密數據的最後 256 個字節(卷標頭)的 CRC-32 校驗和與位於第 8 個字節的值匹配,則認為解密成功解密的數據(這個值對於對手來說是未知的,因為它是加密的。Veracrypt 加密方案
擦除這將刪除任何程序判斷是否發生加密的能力。所以這個問題的答案是“有點”。理論上,所有需要做的只是在不使用標頭作為參考的情況下進行解密。對手不會知道算法(AES、Serpent、Twofish 等),因此需要暴力破解每個算法。他們不知道“解密”後數據是否損壞。
這讓對手的事情變得更加困難,但在理論上並非不可能。在實際的人類壽命上,是的。