Hash
填充與散列加密密鑰
我正在製作一個不包含超級敏感資訊的個人使用程序。我正在使用它來探索密碼學。使用密碼為AES生成密鑰是否可以接受,或者我應該製作一個文件,將其儲存在程序之外的某個地方,然後呼叫它進行加密/解密。如果密碼太短而不能成為 AES 密鑰,我應該散列它還是填充它?
我剛剛意識到我可以連結到我的堆棧溢出帳戶!如果這個問題放錯了地方,我很抱歉。
您不能假設基於文本的輸入是加密算法中密鑰的可接受替代品。用於設計算法的預設假設是密鑰是隨機生成的;具體來說,生成的密鑰是不可預測的,並且來自所有可能的密鑰的均勻隨機分佈。
如果您使用文本而不是隨機位,則會出現很多問題:
- 您減少了需要測試的密鑰數量
- 您的輸入將具有可能使您的密鑰更可能屬於一類弱密鑰的模式。如果算法存在一組弱密鑰,使用其中一個密鑰將導致算法出現可能使其不安全的偏差。
- 人類選擇的密碼比一般人想像的更容易預測。如果您需要保護加密數據的安全,那麼您需要巧妙地使用您的密碼。
- 密碼可能比算法的正常密鑰大小更短或更長。(在這裡填充和截斷是個壞主意,尤其是當存在基於密碼的密鑰派生函式時。)
如何(正確)使用密碼加密文件:
- 生成不用於任何線上服務(或以其他方式與任何人共享)的新隨機密碼。你是怎樣做的?
- 不要使用您最喜歡的運動隊或出生日期等資訊。
- 從 /dev/urandom 之類的內容生成隨機字元串。一個字元串,如果長度是 $ n $ 並且這些字元來自一個大小的字母表 $ m $ , 最多 $ \log_2(m^n) = n \log_2(m) $ 熵位
- 生成一串 $ n $ 字典中的隨機詞 $ m $ 單詞,使用空格或句點或逗號作為單詞分隔符。這也有 $ n \log_2(m) $ 一點點的熵。
- 如果您想生成一個令人難忘的密碼,不需要電腦,並且您有一個公平的六面骰子,那麼請使用 Diceware。我推薦 EFF 列表之一,而不是原始單詞列表。
- 確保您的密碼具有足夠的熵以防止暴力猜測。您想要的最小值可能是 100 位。有些人可能會說 80 位或 128 位。(當您為網站生成密碼時,您可以降低很多,但那是因為它是一種不同的密碼應用程序。)
- 生成隨機數
- 使用密鑰派生函式。例如,scrypt if(您承諾使用大量 RAM)、bcrypt 或 Argon2d。我列出的函式接受密碼作為輸入並“拉伸”它們。它們使攻擊者和對文件具有合法訪問權限的人做額外的工作,從而使蠻力猜測變得更加困難。使用它來導出 256 位的對稱密鑰(如果它可用,即使熵不是 256 位並且您擔心量子計算),否則選擇具有至少 128 位安全級別的密鑰大小和算法。
- 創建一個輸出文件,以明文形式儲存隨機數,然後將加密輸入文件的密文和身份驗證標籤附加到輸出文件中。
- 從任何人可以訪問的任何儲存位置或記憶體中刪除原始純文字文件中的數據。
解密文件使用相同的密鑰派生函式,檢查身份驗證標籤是否正確,並使用隨機數和密鑰解密數據。
我忽略了一些細節和警告,因為它們已在此處、http ://security.stackexchange.com/和許多其他網站上的其他問題中得到解答。