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
430
Other Decks in Programming
See All in Programming
cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話
phigasui
3
2.3k
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
23k
VR HMDとしてのVision Pro+ゲーム開発について
yasei_no_otoko
0
100
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
3
400
僕がつくった48個のWebサービス達
yusukebe
18
17k
Hotwire or React? ~Reactの録画機能をHotwireに置き換えて得られた知見~ / hotwire_or_react
harunatsujita
9
4.1k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
0
160
色々なIaCツールを実際に触って比較してみる
iriikeita
0
270
macOS でできる リアルタイム動画像処理
biacco42
7
2k
OpenTelemetryでRailsのパフォーマンス分析を始めてみよう(KoR2024)
ymtdzzz
4
1.6k
レガシーな Android アプリのリアーキテクチャ戦略
oidy
1
170
Piniaの現状と今後
waka292
5
1.5k
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
32
1.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Learning to Love Humans: Emotional Interface Design
aarron
272
40k
Practical Orchestrator
shlominoach
186
10k
Designing on Purpose - Digital PM Summit 2013
jponch
115
6.9k
A Modern Web Designer's Workflow
chriscoyier
692
190k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
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,如果使用現成套件,用完要釋放。