Aes
SHA-256 和 AES-128
如果我使用 SHA256(x) 而不是 x 作為 AES-128 加密的密鑰,它會使加密字元串更安全嗎?我確實知道 SHA-256 會產生 64 個字元的散列字元串,無論輸入是什麼。
它是否仍會在 AES 中被接受為密鑰,還是會將其截斷為 32 個字元?每個字節是否也等於 8 位(例如,如果我輸入
xkcd
它將是 32 位)是真的嗎?
首先讓我們處理與編碼相關的問題:
你不能簡單地說一個字節等於一個字元。您需要一個編碼來在這些之間進行轉換,其中屬性取決於該編碼。
在普通文本和字節之間進行轉換時,UTF-8是一個不錯的選擇。這樣,一個字元將對應於可變數量的字節。您將使用它來將密碼轉換為字節。
xkcd
將導致 4 個字節,但非 ASCII 字元,例如ü
將導致每個字元超過一個字節。將任意二進制數據轉換為文本時,請使用專門的編碼。十六進制非常流行,將每個字節變成兩個字元。Base64將 6 位轉換為一個字元是一種常見的替代方法。
現在 SHA-256 返回 32 字節的二進制數據。如果你使用十六進制編碼,你會得到 64 個字元。
AES-128 採用 16 字節密鑰,對應於十六進制編碼的 32 個字元。
接下來我們解決您的密鑰派生問題:
密碼的問題在於,與隨機密鑰相比,它們往往很弱。因此,您需要通過key-derivation-function發送它們,這使得密碼猜測攻擊更加困難。
SHA-256 不是一個好的選擇,因為它很快。您應該使用故意緩慢的函式,例如PBKDF-2,以及隨機鹽。
使用 AES-128 時,將其輸出截斷為 128 位(或者如果您的 KDF 支持,則明確請求 128 位)。您的密碼甚至會比 128 位密鑰弱得多,因此使用 256 位密鑰並沒有太大的好處。