【密碼學簡介】
不少人都誤用了密碼學
通常可歸爲三類:
1. 愚蠢
好比Google Keyczar(計時旁路 timing side channel),SSL(對話重建 session renegotiation)
2. 工具使用方法錯誤
亞馬遜AWS signature method 1(non-collision-free signing),Flickr API signatures(hash length-extension)
3. 不尋常的環境
Intel超線程(架構性旁路 architectural side channel),WEP, WPA, GSM(各類錯誤…)
傳統智慧:不要本身寫加密代碼!
· 傳輸的時候用SSL
· 保護數據用GPG
· 「若是你在代碼裏寫了A-E-S幾個字母,那麼你錯了。」 ---Thomas Ptacek
事實:無論我怎麼說,你確定會本身寫加密代碼的,你最好明白本身在作什麼。
事實:大部分應用只須要一小部分好的標準加密方法,很容易作對。
在接下來的55分鐘以後你應該能:
· 99%的狀況裏你都知道該作什麼
· 知道最多見的錯誤是哪些
· 若是你須要作一些非標準的事情,你真的最好諮詢一下密碼學專家
密碼學能夠抵禦一些攻擊,但不是所有。
· 三個"B":Bribery(賄賂),Burglary(盜竊),Blackmail(敲詐)
· 第四個"B": (Guantanamo) Bay (關塔那摩)
攻擊人老是比攻擊數據更昂貴。
攻擊人老是比攻擊數據更冒風險。
· 數據不會召開新聞發佈會控訴它們遭受的虐待。
密碼學的意義就在於它迫使美國政府來拷打你。
· 但願他們認爲你的數據沒有那麼重要。
密碼學有三個目的:加密(Encryption),認證(Authentication),身份識別(Identification)。
· 加密能阻止壞人讀取你的數據
· 認證(也叫簽名Signing)阻止壞人偷偷修改你的數據
· 身份識別阻止壞人假裝成你
有時候認證和身份識別在一個步驟裏完成:「這段信息在我寫完以後沒有被修改過」,以及「我是Colin」,被一句話代替「這段信息在Colin寫完以後沒有被修改過」。
大部分時候你會想把2個或者更多加密組件組合在一塊兒。
【密碼學語言】
明文是咱們在意的數據。
密文是壞人看到的數據。
密鑰用來對上述兩種狀態進行轉換,有時咱們須要多個密鑰。
對稱加密是指從明文轉爲密文、從密文轉爲明文時,使用同一個密鑰。
非對稱加密是指兩個方向的轉換不使用同一個密鑰。
理想的加密組件是不存在的,但若是一個加密組件不是很理想,那它通常被視爲不能使用。
【哈希】
一個理想的哈希函數H(x)能夠將任意長度的輸入映射到n比特的輸出,並且是:
· 防衝突
· 不可逆的
防衝突是指須要花費大約2^(n/2)的時間來找到兩個有相同哈希值的輸入。
不可逆是指給定一個哈希值,須要約2^n的時間來找到一個產生此值的輸入。
別的方面就沒法保證什麼了。
· 若是知道了H(x),攻擊者可能能夠算出一些輸入的哈希值
應作:使用SHA-256
應作:在接下來5-10年,考慮切換到SHA-3
應作:若是你能夠安全的分發一個哈希函數H(x),並且但願驗證你經過不安全渠道獲得的x'實際上與x相等,用哈希函數來作。
不要作:使用MD2, MD4, MD5, SHA-1, RIPEMD
不要作:把FreeBSD-8.0-RELEASE-amd64-disc1.iso和CHECKSUM.SHA256放在同一個FTP服務器上,還以爲本身作了一件有用的事情
不要作:拿一個哈希函數做對稱式簽名
【對稱認證】
對稱認證經過提供一個信息證明代碼(message authenticatio code, MAC)來實現。
理想的信息證明代碼fk(x)(k爲下標)使用一個密鑰將任意長度的輸入映射到n比特輸出,這使得攻擊者即便得到了(x, fk(x)),也須要2^n的時間來生成(y, fk(y))
· 有時被稱爲「隨機函數」
與哈希函數不一樣,即便你知道了fk(x),對於其餘的y也沒法算出fk(y)
· Flickr API就使用了哈希來校驗API請求,實際上他們應該用MAC的
應作:使用HMAC-SHA256
應作:確保HMAC-SHA256的輸入不包含生成相同數據的不一樣消息
· 亞馬遜和Flickr都作錯了
避免:CBC-MAC
· 理論上安全,可是會把加密塊暴露給攻擊者
避免:Ploy1305
· 若是你名叫Daniel Bernstein,那你能夠繼續用。不然你永遠沒法作出安全並且正確的實現。
不要作:當你驗證一個簽名時,經過計時旁路(timing side channels)泄露信息
【旁路攻擊】
所謂旁路就是除了密文之外,攻擊者可以獲取的其餘信息
· 加密系統是經過數學設計來定義的,而旁路是隨着加密系統的具體實現而天然產生的
最多見的旁路就是計時旁路:加密、解密、簽名、驗證各步驟都花了多長時間。
其餘旁路包括電磁泄露,電力消耗,微觀架構特性(好比有超線程功能的Intel CPU的L1數據緩存逐出(eviction))
應作:當你打算把加密實體(好比智能卡)的訪問權賦予壞人時,記得先諮詢密碼學專家
應作:當你打算容許壞人在你用來加密的機器(好比虛擬系統)上運行代碼時,先諮詢密碼學專家
應作:當你打算髮布一款會用各類又新穎又激動人心的方式泄露信息的CPU時,記得先諮詢密碼學專家
· Intel可能就作錯了
不要作:寫一段會經過它的運行時間來泄露信息的代碼
【計時攻擊】
避免:對錶格進行依賴密鑰或依賴明文的查詢
不要作:依賴於密鑰或銘文的程序分支(if, for, while, foo ? bar : baz)
想都不要想:寫下這樣的代碼
for (i = 0; i < MACLEN; i++)
if (MAC computed[i] != MAC received[i])
return (MAC IS BAD);
return (MAC IS GOOD);
應作:寫這樣的代碼緩存
for (x = i = 0; i < MACLEN; i++)
x |= MAC computed[i] − MAC received[i];
return (x ? MAC IS BAD : MAC IS GOOD);
· Goolge Keyczar在這裏犯了錯
【分組加密(blcok cipher)】
對稱加密一般是用分組加密實現的。
理想的分組加密用一個密鑰將n比特輸入一一映射到n比特輸出,記爲Ek(x)(k爲下標),從而使得對於任意的(x', k')≠(x, k),知道數對(x, Ek(x))後猜出(x', Ek'(x'))的概率不超過2^-n。
· 有時被稱爲隨機置換(random permutation)
咱們通常關注的是對於x'≠x,Ek(x)不會泄露關於Ek(x')的信息
· 若是一個攻擊者能夠經過觀察分組加密處理不一樣的密鑰的方式來獲得有用的信息,那麼這個分組加密就是容易遭到相關密鑰攻擊(related-key attack)的。
應作:使用AES-256
· AES容易遭到相關密鑰攻擊,但只要你把其餘方面處理好,這可有可無。
· 理論上說AES-128已經足夠強了,可是分組加密很容易產生旁路,更長的密鑰有助於加強加密,即使部分密鑰暴露。
不要作:使用blowfish
想都不要想:使用DES
避免:Triple-DES
不要作:單獨使用分組加密;應該將其放在一系列操做模式裏面
【分組加密操做模式】
一個分組加密操做模式告訴你怎樣使用分組加密來保護數據流。
不少狀況下,明文須要被填充,分紅多個單位長度的塊;分組加密操做模式會告訴你怎樣作。
這些模式的名字都很古怪:ECB, CBC,CFB, OFB, CTR, IAPM, CCM, EAX, GCM...
· 別問我它們全稱都是啥
大部分模式都只提供加密;有一些還提供認證
應作:使用CTR模式
不要作:使用既提供加密又提供認證的模式
想都不要想:使用ECB模式
應作:使用一個MAC(好比HMAC-SHA256)來驗證你的加密數據
· 若是你以爲不須要這麼作,諮詢一下密碼學專家。他會說「你錯了」。
應作:在解密數據前對密文進行驗證
【非對稱認證】(Asymmetric authentication)
非對稱認證使用一個簽名密鑰(signing key)將明文轉換爲密文,使用一個驗證密鑰(verification key)將密文轉換爲明文或「無效簽名」(invalid signature)
· 使用驗證密鑰沒法計算出簽名密鑰,但驗證密鑰一般能夠經過簽名密鑰算出
· 密文一般由明文加簽名組成
若是取得驗證密鑰的攻擊者能夠建立出任何合法的密文,或者可以欺騙你給任何明文簽名,這種非對稱加密方式將被視爲被破解的。
應作:使用RSASSA-PSS(RSA signing with Probabilistic
Signature Scheme padding)安全
應作:使用2048位的RSA密鑰,公共指數爲65537,以及SHA256
不要作:使用 PKCS v1.5 填充
想都不要想:使用RSA不帶填充(padding)
或許應當避免:DSA
或許應當避免:橢圓曲線簽名方案
想都不要想:認證和加密使用同一個RSA密鑰
【非對稱加密】
與非對稱簽名同樣,非對稱加密是指使用公鑰將明文轉換爲密文,使用私鑰將密文轉換爲明文。
若是攻擊者能夠將給定的密文進行解密,即便他能夠哄騙你解密任意其餘密文,這種非對稱加密方案將被視爲已破解的。
大部分非對稱加密方案對可加密的消息長度有較強限制。
應作:使用RSAES-OAEP (RSA encryption with Optimal
Asymmetric Encryption Padding)服務器
應作:使用2048位的RSA密鑰,公共指數爲65537,SHA256和MGF1-SHA256
不要作:使用PKCS v1.5 padding
不要作:使用RSA不加填充
應作:生成一個隨機密鑰,而後對消息進行對稱式加密,而後對對稱式加密密鑰進行非對稱式加密。
應作:對RSAES-OAEP應很是當心,避免時間旁路攻擊
【密碼】(passwords/passphrases)
密碼常常被直接用來驗證身份,但也能夠用來加密或認證。
應作:任何狀況下都應避免使用密碼
應作:儘快使用密鑰生成函數將密碼轉換爲密鑰
· 若是你想和業界潮流接軌,使用PBKDF2
· 若是你想有2^8那麼多倍的安全性,使用scrypt
想都不要想:在服務器上存儲用戶的密碼
· 不要存,哪怕密碼加了密
SSL是一個糟糕的系統
· SSL過於複雜,以致於無法安全的實現
· SSL能夠攻擊的地方太多,攻擊者有充裕的選擇
· SSL須要你決定相信哪一家證書籤發機構
· 你想選擇相信中國政府嗎?
不幸的是,SSL每每是惟一的選擇
應作:對於C-S架構的軟件,將非對稱簽名驗證密鑰發佈到客戶端,而後以此爲基礎創建密碼系統
應作:使用SSL來加強網站、email以及其餘公共標準網絡服務的安全性
應作:審慎選擇證書籤發機構
【奇怪的東西】
應作:向密碼學專家進行諮詢,若是:
· 若是攻擊者可以物理接觸到你的硬件(好比智能卡)
· 你須要儘可能節約能源(好比智能手機)
· 你須要處理儘量大的數據流(好比10 Gbps IPSec 隧道)
· 你須要傳輸儘可能少的比特位數(好比與核潛艇進行通信)
· 你想忽略我在此次演講裏提出的任何一條建議