密码学101:认证
2.1單向散列函數
通過單向散列函數計算信息的指紋,通過驗證指紋判斷信息是否被篡改,即完整性,或稱一致性。
什么是單向散列函數
單向散列函數(one-way hash function)有一個輸入和一個輸出,其中輸入稱為消息(message),輸出稱為散列值(hash value)。單向散列函數把輸入作為純粹的比特序列來處理。散列值的長度與消息的長度無關,單向散列函數總會計算出固定長度的散列值。
單向散列函數的性質
- 根據任意長度的消息計算出固定長度的散列值
- 能夠快速計算散列值
- 消息不同散列值也不同
- 難以發現碰撞的性質稱為抗碰撞性
- 弱抗碰撞性:確保要找到和該條消息具有相同散列值的另外一條消息是非常困難的
- 強抗碰撞性:確保要找到散列值相同的兩條不同的信息是非常困難的
- 密碼技術中使用的單向散列函數,這兩種性質都需要具備
- 具備單向性
幾個術語:
- 單向散列函數,又稱消息摘要函數、哈希函數或雜湊函數
- 輸入單向散列函數的消息也稱為原像
- 單向散列函數輸出的散列值也稱為消息摘要或指紋
- 完整性,也稱一致性
單向散列函數的應用
檢測完整性、基于口令的加密、消息認證碼、數字簽名、偽隨機數生成器、一次性口令?
幾種單向散列函數
- MD4/MD5
- SHA-1、SHA-2(SHA-256、SHA-384、SHA-512)
- SHA-1的強抗碰撞性已于2005年被攻破
- RIPEMD-160
- RIPEMD的強抗碰撞性已于2004年被攻破
- SHA-3
- 選拔,Keccak算法勝出
- Keccak算法 - 海綿結構 - 攻擊
對單向散列函數的攻擊
- 暴力破解
- 生日攻擊
單向散列函數用于確認消息的完整性。但是單向散列函數無法辨別出“偽裝”。為了解決這個問題,我們需要對消息進行認證。用于認證的技術包括消息驗證碼和數字簽名。消息認證碼能夠向通信對象保證消息沒有被篡改,而數字簽名不僅能夠像通信對象保證消息沒有被篡改,還能向第三方保證。
2.2 消息認證碼
消息認證碼(Message Authentication Code)是一種確認消息完整性并進行認證的技術,簡稱MAC。其輸入包括任意長度的信息和一個發送者與接受者間共享的密鑰,輸出固定長度的數據(MAC值)。消息認證碼正是通過密鑰來完成認證的。
消息認證碼共享密鑰也存在密鑰配送問題。與對稱密碼一樣,具體使用哪種方式配送,需要根據具體情況。
應用實例
- SWIFT
- IPsec
- SSL/TLS
實現方法
- 使用單向散列函數 HMAC
- 使用分組密碼
- 其他:流密碼和公鑰密碼
認證加密
認證加密(縮寫AE或AEAD)是一種將對成密碼與消息驗證碼相結合,同時滿足機密性、完整性和認證三大功能的機制。Encrypt-then-MAC(先對明文加密,計算密文MAC值)、Encrypt-and-MAC(先對明文加密,并對明文計算MAC值)、MAC-then-Encrypt(先計算明文的MAC值,然后將明文和MAC值同時加密)。
- GCM和GMAC
對消息認證碼的攻擊
- 重放攻擊
- 密鑰推測攻擊
消息認證碼雖然可以保證消息的完整性并對消息來源進行認證,但是仍然有無法解決的問題。比如“對第三方證明”和“防止否認”。
2.3 數字簽名
數字簽名不僅可以識別篡改和偽裝,還可以防止否認。數字簽名對簽名密鑰和驗證密鑰進行了區分,使用驗證密鑰是無法生成簽名的。簽名密鑰只能由簽名的人持有,而驗證密鑰是任何需要驗證簽名的人都可以持有。
- 用簽名密鑰進行簽名
- 用驗證密鑰進行解密
數字簽名的方法
- 直接對消息簽名的方法(基本不會用)
- 對消息的散列值簽名的方法
一些問題
- 數字簽名并非為了保證機密性,而是利用了“沒有私鑰的人事實上無法生成利用該私鑰生成的密文”這一性質。它僅代表一種只有持有該密鑰才能生成的信息(認證符號)。
- 為了保證機密性,數字簽名需要和密碼組合使用。
- 簽名可以被復制并不代表簽名沒有意義,重要的是特定的簽名者與特定的消息綁定在了一起這一事實。
- 數字簽名要實現的不是防止修改,而是識別修改。
- 同時修改消息和簽名使得驗證簽名成功,這個事實上是做不到的;且消息不同簽名也不同,不會存在重復簽名。
- 數字簽名真的可以代替簽名嗎?簽名軟件是否可信?美國于2000年頒布了E-SIGN法案,日本也于2001年頒布了電子簽名及其認證業務的相關法律。
數字簽名的應用
- 安全信息公告
- 軟件下載
- 公鑰證書(后續章節會詳細介紹)
- SSL/TLS(后續章節會詳細介紹)
通過RSA實現數字簽名
用RSA生成簽名:D和N就是簽名者的私鑰
?用RSA驗證簽名:E和N就是簽名者的公鑰
?其他數字簽名
- EIGamal方式
- DSA
- ECDSA
- Rabin方式
對數字簽名的攻擊
- 中間人攻擊
- 對單向散列函數的攻擊
- 利用數字簽名攻擊公鑰密碼
- 潛在偽造
- 其他:暴力破解、對RAS的N進行質因數分解
數字簽名既可以識別出篡改和偽裝,還可以防止否認。也就是說,我們同時實現了確認消息完整性、認證以及防止否認。然而要正確地使用簽名,一個大前提是用于驗證簽名的公鑰必須屬于真正的發送者。這個公鑰的驗證又必須經過證書——由可信的第三方對其簽名后所得到的公鑰。
問題是如何構筑一個可信的數字簽名鏈條呢?又由誰來頒發可信的證書呢?
我們需要讓公鑰和數字簽名技術成為一個社會性的基礎設施,即公鑰基礎設施(Public Key Infrastructure,PKI)。
2.4 證書——為公鑰加上數字簽名
總結
- 上一篇: 23岁的一无所有,其实是理所应当的
- 下一篇: 13. 用hexdump工具分析镜像的1