常見算法安全
概述
本文討論現下常見算法的安全問題
範圍
種類包括 對稱加密/非對稱加密/摘要/編碼
標準包括 國際標準和國家標準
算法種類
對稱算法(分組密碼算法):AES/DES/SM4
非對稱算法(公鑰密碼算法):RSA/SM2
摘要算法(雜湊算法):MD5/SHA-I/SM3
編碼 Base64
SMx爲國密算法
不安全算法/用法和建議
不安全用法/禁止:
數據庫存儲用戶密碼明文或不安全算法加密的密文
日誌文件中用戶密碼明文或不安全算法加密的密文
不安全算法
- 明文
- XOR 異或
- MD5
- SHA1
- Base64編碼
- DES/4DES
- 私有算法等
- AES 的非 HMAC 模式
- CBC
- OFB
- CTR
- ECB
建議
- 採用基於 摘要算法和加入鹽值(salt)方式安全存儲口令信息
- SHA2
- bcrypt
- JWT HS256/RS256
- AES:128位,GCM 模式,NoPaddding
Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
- RSA:2018位,OAEPWithMD5AndMGF1Padding
rsa = javax.crypto.Cipher.getInstance("RSA/ECB/OAEPWithMD5AndMGF1Padding");
- DSA:2048位
知名安全組織/工具不安全算法條目
mitre
CWE-327: Use of a Broken or Risky Cryptographic Algorithm http://cwe.mitre.org/data/definitions/327.html
包括:
- Reversible One-Way Hash 可逆單向散列,SHA1/MD5 -> SHA2 http://cwe.mitre.org/data/definitions/328.html
- Use of RSA Algorithm without OAEP 無需 OAEP 的 RSA 算法的使用 http://cwe.mitre.org/data/definitions/780.html Optimal Asymmetric Encryption Padding (OAEP) BAD: rsa = javax.crypto.Cipher.getInstance("RSA/NONE/NoPadding"); GOOD: rsa = javax.crypto.Cipher.getInstance("RSA/ECB/OAEPWithMD5AndMGF1Padding");
- Use of Password Hash With Insufficient Computational Effort 計算量不足的密碼散列的使用 http://cwe.mitre.org/data/definitions/916.html
- Use of a Risky Cryptographic Primitive 使用非標準加密算法 http://cwe.mitre.org/data/definitions/1240.html
- Missing Encryption of Sensitive Data 缺少敏感數據的加密 http://cwe.mitre.org/data/definitions/311.html
- Reflection Attack in an Authentication Protocol 認證協議反射攻擊 http://cwe.mitre.org/data/definitions/301.html
find-sec-bug安全算法相關
https://find-sec-bugs.github.io/bugs.htm#STATIC_IV
使用固定的IV,在對稱算法(AES)用使用固定的IV(初始化向量) 建議:每次加密都使用不同的IV
https://find-sec-bugs.github.io/bugs.htm#ECB_MODE
使用 AES/ECB 即電子密碼本模式, 建議使用 AES/GCM 伽羅華計數器模式 AES-GCM 加密簡介
https://find-sec-bugs.github.io/bugs.htm#PADDING_ORACLE
建議使用: NoPadding Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
https://find-sec-bugs.github.io/bugs.htm#CIPHER_INTEGRITY Cipher with no integrity 加密器沒有完整性檢查(簽名) 基於哈希的加密訊息鑑別碼(HMAC)以下AES模式都沒有
- CBC
- OFB
- CTR
- ECB
建議: GCM
https://find-sec-bugs.github.io/bugs.htm#ESAPI_ENCRYPTOR
使用 OWASP ESAPI 加密組件,<= 2.0.1 有漏洞,建議 2.1.0 以上 MAC bypass (CVE-2013-5679). 版本:ESAPI 版本<=2.0.1 有漏洞 一些配置也會影響其安全性
// BAD
Encryptor.CipherText.useMAC=false
Encryptor.EncryptionAlgorithm=AES
Encryptor.CipherTransformation=AES/CBC/PKCS5Padding
Encryptor.cipher_modes.additional_allowed=CBC
// GOOD
Encryptor.CipherText.useMAC=true
#Needed to have a solid auth. encryption
Encryptor.EncryptionAlgorithm=AES
Encryptor.CipherTransformation=AES/GCM/NoPadding
#CBC mode should be removed to avoid padding oracle
Encryptor.cipher_modes.additional_allowed=
SonarQube算法安全相關
https://rules.sonarsource.com/java/RSPEC-4432 AES encryption algorithm should be used with secured mode
https://rules.sonarsource.com/java/RSPEC-2278 Neither DES (Data Encryption Standard) nor DESede (3DES) should be used
https://rules.sonarsource.com/java/RSPEC-5542 Encryption algorithms should be used with secure mode and padding scheme
https://rules.sonarsource.com/java/RSPEC-4787 Encrypting data is security-sensitive
https://rules.sonarsource.com/java/RSPEC-2277 Cryptographic RSA algorithms should always incorporate OAEP (Optimal Asymmetric Encryption Padding)
算法詳解
ESAPI
owasp提供的一套API級別的web應用解決方案
SHA2
AES
AES: Advanced Encryption Standard DES 算法的替代者
- 電碼本模式(Electronic Codebook Book (ECB))
- 密碼分組鏈接模式(Cipher Block Chaining (CBC)) 這種模式是先將明文切分成若干小段,然後每一小段與初始塊或者上一段的密文段進行異或運算後,再與密鑰進行加密。
- 計算器模式(Counter (CTR))
- 密碼反饋模式(Cipher FeedBack (CFB))
- 輸出反饋模式(Output FeedBack (OFB))
攻擊方法:
- 針對 ECB 的密文替換
- 針對 CBC 的字節反轉
ECB每一個明文塊都會生成同樣的密文
CTR 計數器模式解決了ECB模式中,相同的明文會得到相同的密文的問題。
CBC,CFB,OFB模式都能解決這個問題,但CTR的另兩個優點是:
1)支持加解密並行計算,可事先進行加解密準備;
2)錯誤密文中的對應比特只會影響明文中的對應比特等優點。
缺點:
但CTR仍然不能提供密文消息完整性校驗的功能。
現在安全的是 AES-GCM模式
結論: AES128已經足夠用
爲什麼ECB不安全:
引自:https://a-little-cat.github.io/2017/12/14/SM4.html
RSA
國密算法
參考: 淺談國密算法
GmSSL是一個開源的密碼工具箱,支持SM2/SM3/SM4/SM9/ZUC等國密(國家商用密碼)算法
https://github.com/guanzhi/GmSSL
國密SM4/SMS4分組密碼 兩個結論:
JWT
jwt 中常用的簽名算法是
- HS256 對稱算法,密鑰雙方一樣
- RS256 非對稱算法,分公鑰和祕鑰
- None 注意有的組件會支持None,即不加密
注意 在 jwt 中,消息體是透明的,加密只是做爲簽名保證數據不被篡改,不要傳遞敏感數據
理解JWT的使用場景和優劣 http://blog.didispace.com/learn-how-to-use-jwt-xjf/
JSON Web Token - 在Web應用間安全地傳遞信息 http://blog.didispace.com/json-web-token-web-security/
八幅漫畫理解使用 JWT設計的單點登錄系統 http://blog.didispace.com/user-authentication-with-jwt/
JSON Web Token 入門教程 https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
只要一行代碼,實現五種 CSS 經典佈局 http://www.ruanyifeng.com/blog/2020/08/five-css-layouts-in-one-line.html
SSL/TLS
OAuth 2.0
理解OAuth 2.0 https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
異或運算
異或也叫半加運算, 其運算法則相當於不帶進位的二進制加法: 二進制下用1表示真,0表示假,則異或的運算法則爲:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同爲0,異爲1), 這些法則與加法是相同的,只是不帶進位,所以異或常被認作不進位加法。 程序中有三種演算子:XOR、xor、⊕。
異或算法有知其二必知其剩下一個數的特點,可以認爲是最簡單的加密算法
Galois Field
有限域(英語:finite field)或伽羅瓦域 Galois field 在數學中,有限域(英語:finite field)或伽羅瓦域(英語:Galois field,爲紀念埃瓦里斯特·伽羅瓦命名)是包含有限個元素的域。 與其他域一樣,有限域是進行加減乘除運算都有定義並且滿足特定規則的集合。 有限域最常見的例子是當p 爲素數時,整數對 p 取模。 有限域的元素個數稱爲它的階。