Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
密碼學漏洞與他們的產地
Search
Chen John L
October 14, 2017
Programming
3
270
密碼學漏洞與他們的產地
整理常見的密碼學漏洞與問題以及一些使用密碼學時的建議。主要內容分成非對稱式加密,對稱式加密,Hash以及其他雜項,個別討論這些問題怎麼樣會出現,以及怎麼樣解決。
於TDoHConf 2017演講
Chen John L
October 14, 2017
Tweet
Share
More Decks by Chen John L
See All by Chen John L
現代檔案系統 ZFS 的簡介與應用
john0312
0
130
簡介 Linux 的 Network Namespace 功能
john0312
0
270
從技術面簡介線上遊戲外掛
john0312
0
440
Other Decks in Programming
See All in Programming
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
140
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
8
2.4k
Honoとフロントエンドの 型安全性について
yodaka
7
1.4k
ソフトウェアエンジニアの成長
masuda220
PRO
12
2.1k
Go 1.24でジェネリックになった型エイリアスの紹介
syumai
2
280
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
1k
仕様変更に耐えるための"今の"DRY原則を考える
mkmk884
9
3.1k
DRFを少しずつ オニオンアーキテクチャに寄せていく DjangoCongress JP 2025
nealle
2
260
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
5
1.1k
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
860
sappoRo.R #12 初心者セッション
kosugitti
0
270
負債になりにくいCSSをデザイナとつくるには?
fsubal
10
2.6k
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
Docker and Python
trallard
44
3.3k
Scaling GitHub
holman
459
140k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
We Have a Design System, Now What?
morganepeng
51
7.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
10
510
Statistics for Hackers
jakevdp
797
220k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Transcript
密碼學漏洞與他們的產地
[email protected]
Who am I - Zuan - chroot讀書會成員 - 什麼都略懂一點,但什麼都不精通 -
愛玩資訊跟電子領域的各種事務 - 興趣是騎腳踏車跟買學生證
Content - 非對稱式演算法 - 對稱式演算法 - 雜湊 - 其他
這邊有人沒有聽過RSA的嗎? 請舉個手
c ≡ ne (mod (N)) n ≡ cd (mod (N))
ed ≡ 1 (mod φ(N))
c -> 密文 n -> 明文 (e,N) -> 公鑰 (d,N)
-> 私鑰
一般為了加速計算,e會取很小 (e=65537 or e=17 or e=3)
如果ne < N且e = 3
那不是開方根就能解密了?
...
OK,那如果效能不是問題,我e選大一點 總可以吧?
如果要加密0或1
0^e = 0 1^e = 1
...
Encrypt(‘A’) = YCD6WGtUMNDedQ2HjC5KzSVT Encrypt(‘B’) = REfHH3SCzed6jkRhP6JZwytH Encrypt(‘C’) = aSWP4Z6cX2VYWMxwA9bGMKRA Encrypt(‘D’)
= sRuHR8t8Vmy3th8Gf2RAVfkz Encrypt(‘E’) = F4ahebRHXUyzzeNgcBzN4r26 Encrypt(t) = aSWP4Z6cX2VYWMxwA9bGMKRA t = ?
就說該都猜C
一個加密演算法不該有那麼多毛
以上這些弱點都可以透過Padding來解決
加解密:PKCS #1 v1.5, OAEP 簽章:PKCS #1 v1.5, PSS
Plaintext n Padded Plaintext n Ciphertext n OAEP RSA
如果自己實作Signature Padding 應依照標準驗證簽章
Python RSA出過類似包 CVE-2016-1494
[問掛] 有沒有RSA很慢的八卦?
None
2048 bit/op * 768.3 op/s ≈ 200 kB/s 2048 bit/op
* 26270.6 op/s ≈ 6.7 MB/s
撥接喔?!╯-____-)╯~═╩════╩═
None
None
加解密(AES): 75~90 MB/s 簽章(SHA2): 30~300 MB/s
RSA iPad AES/SHA!
RSA Weak Key
RSA的Key不是找兩個大質數就夠了
CVE-2008-0166
亂數產生器不夠亂,某些質數出現機率高
=> 直接猜那些質數可破密
=> 拿一堆N來GCD也可以破一發 (shared factor)
N1 = p1*q1 N2 = p2*q2 若p1 = p2, p1
= GCD(N1,N2)
Weiner’s Attack
不常見,記得d > ⅓ N¼就好
Pollard p-1 Factorization
也不常見,建議(p-1)/2也要是質數
TL;DR懶人包: 生Key? OpenSSL
[問掛] 有沒有RSA很慢的八卦?
...
你有聽過橢圓曲線嗎?
對稱 RSA ECC 80 1024 160 112 2048 224 128
3072 256 192 7680 384
None
總時間上,橢圓曲線遠比同級的RSA快
ECDSA 256 bit Public Key: AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyN TYAAABBBCv5hlgEJBGfQfF/4RdBDMv0hiaeNbwqwkyW4n tYsUUroqqFQMROgYSdHr2bqmX0BCX87l95Hynh2nUPxbO vWtg=
RSA 2048 bit Public Key: AAAAB3NzaC1yc2EAAAADAQABAAABAQD4XK2ooKXQZFIrz Tlu6sIVOTdnLDcKc1Qn/WvrGCBFRx5jTfKlJflCVb0Bdh PayaYwibMzu87rn6IzfKdc3yEivcRIKJ0Vv/z86jjbK1V 7zlTXyhvp0I2IUgL46HTFQVykn88dcj0CX0vuuITfr+sH jSLG8icBrZHOoiAXYI8xdbZFZ5BZFp5IbeD5QZ2BNotK1
SkMAt1ls2AZD48toBoX0lMiWf7pufdviQw8GIkQo7Jm52 QDFPj2QPUocVLeqCvzreWgu0SSfaIEDUMScM9alS/OBaj rorQI9/eT85H57sv3che8ascbwN48EpQngBwwzylUl0Wm sjYneybGW8xT
Key小就是爽啦
下次也考慮下ECC系列吧
但如果Public端為嵌入式,則可考慮RSA
如果用ECDSA一定要記得
不要Sony
None
Sony進行PS3的ECDSA簽章時每次k都一樣
兩次k一樣的簽章 = 洩漏私鑰
RSA有Side Channel問題
想想Modular Exponentiation
def modexp( base, exp, mod ): out = base if
(exp[0] == 1) else 1 for i in range(1,len(exp)): out = (out * out) % mod; if exp[i] == 1: out = (out * base) % mod return out
def modexp( base, exp, mod ): out = base if
(exp[0] == 1) else 1 for i in range(1,len(exp)): out = (out * out) % mod; if exp[i] == 1: out = (out * base) % mod return out
量測CPU Cache Hit/執行時間/使用功率 可以看出這步有沒有執行
執行在同一顆CPU的其他程式或是對CPU 有實體權限的攻擊者有機會破密
RSA要避免類似Side channel較麻煩 ECC也有類似問題(Double or add)
進幾年HITCON有示範過
bit 0 1 2 3 4 ... 0 1 1
1 1 1 ... 1 M^1 M^2 M^4 M^8 M^16 ...
如果有這考量,可以用現成的Library, 或是用Ed25519
玩夠非對稱式的,來聊聊對稱式的吧
用過Stream Cipher吧?
RC4, OFB/CTR Mode的Block Cipher, Salsa20, ChaCha20
Stream Cipher的IV/Nounce每次加密一定 要不一樣,否則加密多少,就能解密多少
Win32/Dircrypt.A
如果有使用某些舊的Block Cipher, 需要注意Weak Key
尤其是Blowfish
AES沒這煩惱,把把都是好Key
Block Cipher跟RSA一樣不能單用
要搭配Cipher Mode of Operation
看維基百科秒懂
None
那不然要用什麼?
大多人會推薦CBC
Source: Wikipedia
但是CBC有Padding Oracle問題
解密時如果Padding不對,不能讓對方知道
if not VerifyPadding( … ): // ERROR return if not
VerifyHMAC( … ): // ERROR return
除了CBC以外,還有什麼可以用?
看看Google用什麼吧
None
None
[問掛] 有沒有GCM的八卦
GCM其實很好用
內帶驗證,且效能高
考慮拿GCM取代CBC+HMAC
Hash
還在用md5的舉手
md5跟sha1都已經過時 讓他們安息吧
大家密碼都怎麼存?
a) 明碼 b) md5 c) sha1 d) sha256/sha512 e) md5+salt
f) sha1+salt g) sha256/sha512+salt
salt可以避免Rainbow Table
不要再猜了,答案是以上階非
Source: https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073
hash的設計都是在安全的狀況下盡量快
所以要用另一類專門的函數 -- KDF
Key Derivation Function
設計就是要慢
Source: https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073
考慮使用PBKDF2, scrypt, bcrypt
內建Salt, 可調運算強度
純Hash不應該拿來做驗證
不少Hash有Length Extension的 bug feature
給H(A), 不知道A, 可以求H(A+B)
H(secret || msg) 不安全
如果有驗證需求,請用HMAC
HMAC = H( K1 || H(K2 || M) )
其他
亂數?
rand()
當然不是
如果需要少量的亂數(生Key) 就跟系統拿Entropy
*nix: /dev/random Win: RtlGenRandom()
/dev/random是稀有資源
urandom沒有快到哪裡去
需要大量亂數? 用entropy去seed PRNG
Hash_DBRG, CTR_DBRG
不要Dual_EC_DBRG
封包大小有Side Channel問題
透過ssh tunnel上網
Google 台科大官網
不難看出誰是誰
GFW就是這樣抓VPN的
若要避免,可以用obfs4/ScrambleSuit
語音也有一樣問題
None
HTTPS很好用
但是它其實會洩漏Server的Domain
None
最後,東西用完記得收
None
有些勒索軟體可以用刪除復原/硬碟救援 工具還原
因為他們檔案用完沒有Shred
*nix: shred win: sdelete
記憶體也可能殘留,用完記得複寫再釋放
結論
能用現成整套的,就用
HTTPS/TLS, SSH, GnuPG
如果需要單獨使用密碼學的元素 請用現成Library
Crypto++, CryptoJS, libsodium… etc
END 謝謝大家
小抄/懶人包 1. 非對稱加密相關問題與建議 1a. 非對稱式加密應該搭配對稱式加密使用。 1b. RSA不能直接用,需要搭配專門的 Padding Scheme。 1c.
RSA存在Weak Key。(Pollard p-1 Factorization, Shared Factor, Weiner)。 1d. 可以考慮ECC系列演算法,因為安全性下,需要較少運算。 1e. RSA跟ECC都存在Timing/Power Side Channel,如果要避免, 可以考慮Ed25519。 1f. ECDSA每次簽章的k必須隨機不重複。(PS3因此被破解) 1g. 簽章驗證應該依照標準檢測所有參數。 (ie. CVE-2016-1494) 2. 對稱演算法相關問題與建議 2a. Stream Cipher必須有Nounce,且必須每次不一樣。 2b. 部份Blocker Cipher有Weak Key。(例如Blowfish)。 2c. Block Cipher應注意Cipher Mode,不該單純用ECB。 2d. Block Cipher的Padding Oracle問題。 2e. Block Cipher Mode建議使用GCM模式,因為性能較優異且帶有驗證功能。 3. Hash相關問題與建議 3a. md5/sha1應淘汰。 3b. 密碼不應該用單純Hash存,應該使用PBKDF或scrypt。 3c. 注意Length Extension Attack,因此HMAC請照標準HMAC格式走。 4. 其他 4a. 亂數應該使用標準的亂數演算法 (NIST系列,DUAL_EC_DRBG除外)。 4b. 亂數應確保有足夠的Entropy。 4c. 封包的大小與Timing有Side Channel。 4d. 承4c,該漏洞可利用於破解通話加密,以及分析 TLS裡面瀏覽的網站內容。 4e. TLS有SNI會洩漏你瀏覽哪個網站。 4f. 除非必要,建議使用現成,常用的套件或協定 (ie. OpenSSL+TLS) 4g. 注意殘留,硬碟/記憶體需要Shred,如果使用現成套件,用完要釋放。