Openssl

密碼和密鑰有區別嗎?

  • February 16, 2020

我用這個命令加密數據:

openssl aes-256-cbc -a -salt -in C:\Users\User\secrets.txt -out C:\Users\User\secrets.txt.encs

然後程序要求我…

enter aes-256-cbc encryption password:

加密密碼是否與密鑰相同?密碼或密鑰儲存在哪裡?

密碼或密碼片語基本上相當於電腦算法使用的密鑰。然而,正因為如此,密碼也帶來了很多負擔,使其不適合作為密鑰:

  1. 它們通常比對稱密鑰的隨機性要小得多,因為人類完全沒有能力作為隨機數生成器;
  2. 它們可能是動態大小的,這使得它們不適合許多加密算法;
  3. 他們經常使用自己的一組特定字元(字母表);
  4. 如果僅僅因為有很多字元編碼,它們可以通過多種方式轉換為字節;
  5. 重複使用的機會相當高,因此洩漏一個密碼可能會影響許多系統的安全性。

通常,密碼學家使用 PBKDF 或密碼散列從密碼創建靜態大小的隨機字節數組。然後,這個字節數組可以用作密鑰,或者它可以用於在例如 web 服務上對一個人進行身份驗證。

這些 PBKDF通過一定的工作因素來加強或**拉伸密碼的安全性。該工作因子通常由迭代計數或轉換為迭代計數的值表示(bcrypt 使用指數的工作因子)。

此外,它們需要鹽來避免相同的密碼會創建相同的雜湊,即使在多個系統上也是如此。因為這個彩虹表攻擊可以避免。

也可能存在其他配置參數,例如故意使用更多記憶體以避免專用硬體或基於 GPU 的系統的攻擊。參見例如 scrypt。另一個常見的配置參數是允許多個執行緒計算單個密碼;好像用的不多。

字元編碼是經常缺少的一個配置參數,因為它只是隱含的。將字元轉換為字節的初始操作通常是互操作性問題的原因。一些 PBKDF 也受限於輸入字節的數量(例如,一些 bcrypt 實現限制為 72 位,這可能是密碼片語的問題)。


OpenSSL 使用自己的 PBKDF,稱為EVP_BytesToKey. 它使用相當不安全的迭代計數 1,這意味著沒有執行真正的強化。此外,它還使用了一個鹽,它儲存在密文的 8..15 位置,前面是一個"Salted__"ASCII 的魔法值(看看你的密文的頭部!)。不過,您可能必須先對 base 64 進行解碼(或U2FsdGVkX1在開始時進行比較,大部分已Salted__編碼)。

salt 是在加密期間生成的,通過迭代計數,它能夠派生一個密鑰,用於加密您的明文。在解密過程中,鹽被讀取,因此它能夠派生出相同的密鑰——但前提是你當然要給它正確的密碼。一旦再次計算出密鑰,它就可以解密密文。

較新的版本可以選擇使用 PBKDF2。該算法不允許黑客使用專門的硬體,但它至少比EVP_BytesToKey迭代次數為 1 的原始算法更安全。

密碼或密鑰都沒有與密文一起儲存。密碼由使用者提供,密鑰來自該密碼和鹽。


請注意,密文允許攻擊者執行所謂的離線攻擊,其中所有計算資源都可以在密文上使用,以嘗試通過猜測來獲取密碼(使用字典攻擊等)。這與 Web 服務不同,Web 服務可以包括嘗試之間的超時或只允許一定數量的猜測 - 只要密碼雜湊是保密的。

加密文件的一種更安全的方法是使用接收者的可信公鑰。然後接收者可以使用他們的私鑰來解密密文。這通常用於使用非對稱密碼和對稱密碼的混合密碼系統。但是,它確實要求可以信任公鑰,因此您需要某種公鑰基礎設施來信任這些密鑰。這就是例如 PGP 用於文件加密的內容。

通常仍然可以使用密碼,但這只是為了解密私鑰,而私鑰通常保存在使用者的系統中,因此對手無法使用。

引用自:https://crypto.stackexchange.com/questions/77614