- 為了確保資料完整性,請使用 SHA-256、SHA-512 或 SHA-3;避免使用 MD5 和 SHA-1。
- 加密方面:GCM/XTS 上的 AES-256;Serpent、Twofish 和 Camellia 都是不錯的選擇。
- 密碼:Argon2id(≥19 MiB,2 次迭代)或參數良好的 scrypt/bcrypt。
- 3DES、RIPEMD-160 和 SHA-1 已棄用:請遷移到 AES 和 SHA-2/3。
談到資料保護,並非所有事情都一樣: 碼 y 製作哈希 它們用途不同,目標也不同。在本指南中,我將清晰簡潔地向您介紹它們分別是什麼。 更安全的加密和哈希演算法如何根據使用場景選擇它們,以及如今應該避免哪些選項。
除了涵蓋經典曲目外,例如 AES、SHA-2 和 SHA-3你會明白為什麼的。 MD5、SHA-1 或 3DES 它們已經不再是好主意了,你有什麼建議? OWASP 如何保存密碼以及如何檢查密碼 廉正 正確處理文件。既然你問了,我也會解釋一下「如果速度不重要」應該使用哪種方法,包括像 這樣的加密演算法。 山茶花、雙魚、蛇或庫茲涅奇克以及類似這樣的哈希值 SHA-256、SHA-512、Whirlpool 或 Streebog.
什麼是哈希函數?是什麼讓它安全?
哈希函數將任意大小的輸入轉換為 固定長度摘要對於加密應用程式而言,一個好的雜湊值應該是 確定性的抵抗 原像 第二原像 或 碰撞除了展出著名的 雪崩效應輸入參數的微小變化就會產生完全不同的結果。
理想情況下,摘要會以某種形式分發。 均勻且不可預測 在整個輸出空間中,使得兩個相似的輸入產生看似不相關的雜湊值。雖然理想情況並不存在,但對於諸如這樣的輸出大小… 256位元 可能的空間非常巨大,這導致了隨機碰撞。 計算上不可行 在目前的做法中。
重要提示:哈希值是 單向它無法被“解密”。理論上唯一能恢復該條目的方法是透過攻擊。 蠻力 或者透過字典,這就是為什麼密碼必須使用特定的函數和參數來處理的原因。 慢的 為攻擊者進行計算。
哈希與加密:它們並不相同。
加密方式是 雙向的它將明文轉換為密文,並使用正確的密鑰反向執行此過程。哈希值是 不可逆轉 並且始終返回以下輸出: 固定長度加密保護 保密哈希值貢獻 廉正 並作為數據“足跡”。
典型應用場景:用於傳輸敏感資料。 加密方式 (例如,HTTPS);要檢查文件是否已被修改, 哈希儲存密碼時,既不使用加密,也不使用 SHA-256:而是採用其他方法。 密碼 KDF 例如帶有成本參數的 Argon2id、scrypt 或 bcrypt。
最常用哈希函數的狀態
- MD5 它產生 128 位元數據,現在已無法用於加密用途:實際應用中會發生碰撞。目前,它只能用於非關鍵應用,例如: 偵測意外損壞然而,建議遷移到現代替代方案,因為它們的弱點容易受到攻擊。 故意碰撞.
- SHA-1 它產生 160 位元數據,也已被攻破。研究已將碰撞成本降低至約 263 運行情況,並在2017年進行了實際碰撞測試。 破碎不建議在簽名、憑證和任何實際安全場景中使用它。
- SHA-2 這是美國國家標準與技術研究院 (NIST) 推薦用於一般用途的系列: SHA-256, SHA-512除了截短變體之外,例如 SHA-224, SHA-384, SHA-512/224 o SHA-512/256它們保持了很高的抗碰撞性,並受益於以下優化: 硬件雖然 SHA-256 通常會高出20%至30%。 慢 比 MD5 或 SHA-1 更優。
- SHA-3 (以前稱為 Keccak)並非「改進的 SHA-2」;它使用了一種 海綿結構 且本質上具有抵抗力 長度擴展攻擊它提供 SHA3-224/256/384/512 變體和 SHAKE128/256 可變輸出擴展。儘管 SHA-2 由於其性能和支援優勢仍然佔據主導地位,但它的採用率正在不斷提高。
- 其他哈希值: RIPEMD-160 它提供的防碰撞安全性低於現代的SHA-2標準,並被認為 過時的 用於新設計; 渦流 y 斯特里博格 (GOST R 34.11-2012)存在,但在特定環境之外,它們的生態系統和加速是 有限 與 SHA-2/3 相比。
檢查文件完整性(實際範例)
發布和驗證雜湊值可以實現檢測 變更 或下載檔案損壞,以及 創建直接下載鏈接 此外,建議發布官方的 SHA-256 值。雖然您會看到使用 MD5 的範例,但目前建議的做法是使用官方的 SHA-256 值。 SHA-256 或更高。在諸如這樣的系統中 Unix的 你可以這樣做: sha256sum archivo.iso 並與官方數值進行比較。
如果您需要自動化某個流程,可以將多個元件串連起來。 命令例如,一行程式碼即可產生軟體包及其雜湊值: tar cf - carpeta | tee paquete.tar | sha256sum -接收方將進行核實 sha256sum -c 使用已公佈的值。
En Windows, PowerShell的 簡化計算: Get-FileHash .\fichero.zip -Algorithm SHA256還有一些命令 在 Windows 中檢查檔案屬性和加密。避免使用 MD5 或 SHA-1 在安全環境中,它被視為“完整性的保證”,因為攻擊者可以強制發生碰撞並欺騙該過程。
何時使用哈希,何時使用加密
使用 哈希 當您需要確保檔案完整性、進行重複資料刪除或快速索引時:檔案驗證, 數字簽名 (訊息哈希值是被簽署的內容)、資料結構中的哈希表或唯一識別碼的產生。它們也用於 黑名單 以及簽名 惡意軟件.
使用 加密方式 為了保密性:傳輸中的資料(HTTPS, VPN),靜態資料(磁碟, 數據庫),備份和 移動加密技術可防止第三方未經授權讀取內容。 解密金鑰.
密碼儲存:KDF 和 OWASP 建議
對於密碼,永遠不要使用 快速哈希 通用型(MD5、SHA-1、SHA-256“原始”)。它使用密碼金鑰衍生函數 (KDF)。 可配置成本 y 薩爾 隨機的: 氬氣2id, 加密 o 加密它的目標是提高暴力破解和 GPU/ASIC 攻擊的成本。
OWASP優先考慮 氬氣2id 至少, 19 MiB 內存, 2 次迭代 y 平行關係 1如果沒有,請建議 加密 其中 N = 217,r = 8 yp = 1作為第三種選擇, 加密 成本因素約為 10-12 (或在你的硬體上能達到約 0,5 秒的那個)。
PBKDF2 它仍然符合合規性要求:如果迭代次數足夠高(數百萬次),它仍然有效,但由於其自身特性,在現代 GPU/ASIC 上,它的性能不如 scrypt 或 Argon2id。 低記憶體成本.
哈希演算法性能
通用哈希旨在 急流 而且效率很高,非常適合協議和驗證,但這與我們想要的恰恰相反。 密碼實際速度取決於輸入、演算法等因素。 說明 處理器和並行性。
在高吞吐量或即時場景下,速度過慢的雜湊演算法可能會變得非常糟糕。 瓶頸這就是為什麼我們要區分快速函數(SHA-256/512)和慢速金鑰衍生函數(Argon2id、scrypt、bcrypt),後者會引入額外的開銷。 CPU 和記憶體 商榷。
優質哈希的基本特性
除了決定論和雪崩效應之外,哈希還必須能夠抵抗 原像 第二原像 或 碰撞最小尺寸 256位元 能夠承受當前的強大衝擊和未來的發展空間。
雖然有時會用「兩個不同的輸入不可能有相同的雜湊值」來簡化這個問題,但實際上,對於有限的輸出,衝突是不可避免的。 有重要的是,它們很難被找到。這就是為什麼 MD5 和 SHA-1 被認為是可靠的。 破碎的 SHA-2/3 仍然是穩健的選擇。
對稱加密及其模式:當今該如何選擇
在對稱加密中,引文是 AES 帶有鑰匙 128/192/256 關鍵不僅在於演算法,還在於… 莫多 操作方式:避免使用歐洲央行 (ECB) 模式,使用經過認證的模式,例如 氣相色譜儀 或者,在 存儲, XTS (例如,對於磁碟)。如果您在 Windows 環境下工作,也要檢查硬體支援情況。 BitLocker 加密安全.
其他密碼: 茶花 (符合ISO標準,性能優良) Twofish的 y 蛇 (AES決賽入圍者,實力依然強勁) ChaCha20-Poly1305 (速度極快且非常安全) 3DES y DES 已被淘汰:3DES 也受到多種標準的限制和不鼓勵。
非對稱加密、簽章和金鑰長度
為了建立金鑰和簽名,使用以下方法: RSA y ECC使用 RSA OAEP 用於加密和 PSS 簽名時,切勿「預訂」RSA。尺寸:至少 RSA 3072 位元或 ECC 256 約 128 位元對稱安全等級。
您還將看到 迪菲-赫爾曼 (包括其橢圓曲線變體)用於密鑰交換和 DSA/ECDSA 用於簽名。在現代協議中,組合 TLS 它採用非對稱交換和認證對稱加密來平衡安全性和 性能.
如果速度不是問題,該如何選擇?
如果你優先考慮 安全性/穩健性 就速度而言,明智的選擇是採用成熟且經過充分審核的演算法,避免不必要的「混合演算法」。在對稱加密中,選擇… AES-256 同 氣相色譜儀 (交通)或 XTS (磁碟). 山茶花-256, 蛇 y Twofish的 它們是可靠的替代方案。
該 瀑布 (例如 AES-Twofish、Serpent-Twofish-AES 等)很少能帶來真正的價值,反而會使審計和合規性更加複雜。如果你的威脅模型需要,最好加強金鑰、初始化向量 (IV) 管理和輪換,以及 認證方式 隨意串聯加密的資料。
關於 庫茲涅奇克 (GOST):技術上合理,但國際審查力道較小。可用於… 合規性 如果俄羅斯法規要求,則使用支援 AES/Camellia/Serpent 的加密狗。對於不支援 AES-NI 的加密串流, ChaCha20-Poly1305 它很棒,雖然速度在這裡並不是最重要的。
對於通用雜湊值(而非密碼):首選 SHA-512/256 o SHA-256 透過生態系統和支持; SHA3-256 如果你想要從設計就避免長度增加,那麼它非常理想。 渦流 y 斯特里博格 它們雖然有效,但普及和推廣速度較慢。
對於密碼: 氬氣2id 需要充足的記憶體(≥ 19 MiB)、2 次以上的迭代以及緊密的並行性。如果做不到這一點, 加密 參數化良好或 加密 但代價很高。這比將資料「上傳」到通用SHA演算法要有效得多。
CA5350 規則 (.NET):避免不安全的演算法
.NET 程式碼分析會在偵測到以下情況時發出警告 (CA5350) 3DES、SHA-1 或 RIPEMD-160因為與現代產品相比,它們的保固服務較差。快速更換: TripleDES → AES; SHA-1/RIPEMD-160 → SHA-256/384/512.
糾正的典型例子: var h = SHA1.Create(); a var h = SHA256.Create();; 從 RIPEMD160Managed.Create() a SHA256.Create(); 和 TripleDES.Create() a new AesManaged()它還會根據需要調整金鑰尺寸和安全模式(GCM/XTS)。
快速對比:加密與哈希
| 出現 | 加密 | 哈希 |
|---|---|---|
| 方向性 | 雙向(帶鑰匙可反轉) | 單向(不可逆) |
| 目標 | 保密 | 完整性/識別 |
| 出口 | 可變長度 | 固定長度 |
| 示例 | AES、ChaCha20、RSA、ECC | SHA-256、SHA-512、SHA-3 |
攻擊手段和需要注意的最佳實踐
即使採用強大的演算法, 實作 它們很重要。避開歐洲央行,驗證其有效性。 填充物 正確(CBC 對填充預言機敏感),使用 AEAD(GCM/ChaCha20-Poly1305),為每個訊息產生不可預測且不同的 IV/nonce,並且始終檢查 真實性 破譯之前。
對於數位簽名,不要對整個訊息進行簽名;只需對訊息的…進行簽名即可。 哈希使用 RSA OAEP 用於加密和 PSS 簽署;有了 ECDSA,它會悉心照料 隨機性 收集 nonce 值。並及時更新庫和配置,以應對新的漏洞。
更詳細地了解 SHA-2 和 SHA-3
SHA-256 它以 32 位元字、64 輪和 512 位元塊進行操作; SHA-512 它採用 64 位元字、80 輪和 1024 位元塊,因此有其截斷變體,例如: SHA-512/256 當輸出降低時,能更好地抵抗長度延伸。
SHA-3 它使用 1600 位元內部狀態和 24 輪置換;它透過異或運算吸收數據,並根據需要輸出任意數量的數據(SHAKE 運算)。它非常靈活,儘管在通用軟體中可能更複雜。 慢 SHA-2憑藉其獨特的設計,提供了加密多樣性。
關於生成隨機性的說明
對於密碼學,請使用以下字體: 安全隨機性 系統(例如,/dev/urandom、語言 CSPRNG)。避免使用類似這樣的生成器。 蘭特() 或使用 MT19937 進行金鑰、IV 或鹽值驗證:它們不具備抗預測性,可能會危及您的整個方案。
最後,讓我們把話題引向一個實際的想法: 選擇經審計的標準 (AES-GCM/XTS、SHA-2/3),避免使用具有衝突歷史或短金鑰的演算法(MD5、SHA-1、DES/3DES),並且對於密碼,應用現代金鑰衍生函數(KDF),例如: 氬氣2id o 加密 如果速度不是首要考慮因素,那麼在參數經過良好校準的情況下,可以毫不猶豫地增加成本和內存,因為這是抵禦離線攻擊的最佳屏障。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。
