文章目錄
- Pre
- 機密性
- 完整性
- 1. 哈希函數(Hash Function)
- 定義
- 特征
- 常見算法
- 應用
- 散列函數常用場景
- 散列函數無法解決的問題
- 2. 消息認證碼(MAC)
- 概述
- 定義
- 常見算法
- 工作原理
- 如何使用 MAC
- MAC 的問題
- 不可否認性
- 數字簽名(Digital Signature)
- 總結

Pre
加密與安全_常見的分組密碼 ECB、CBC、CFB、OFB模式介紹
加密與安全_ 解讀非對稱密鑰解決密鑰配送問題的四個方案
密鑰體系的三個主要目標
機密性:確保第三者無法通過密文猜測出明文。
完整性:確保第三者無法篡改原文內容。
不可否認性:確保第三者不能冒充其他人發送消息。
接下來我們將圍繞以下幾點展開:
- 重述密鑰體系的三個主要目標:機密性、完整性和不可否認性。
- 介紹確保機密性的對稱密碼和非對稱密碼的作用。
- 詳細講解如何通過技術手段確保消息的完整性。
- 介紹確保不可否認性的技術方法。
- 總結加密與消息完整性及不可否認性的方法及其應用場景。
機密性
對稱密碼:使用相同的密鑰進行加密和解密。主要的實現方式包括AES、DES等。
- 優點:加密速度快,適合大數據量的加密。
- 缺點:密鑰管理困難,需確保密鑰的安全傳遞。
非對稱密碼:使用一對密鑰進行加密和解密,公鑰加密,私鑰解密。主要的實現方式包括RSA、ECC等。
- 優點:無需安全通道傳遞公鑰,私鑰無需共享。
- 缺點:加密速度較慢,不適合大數據量的加密。
對稱密碼和非對稱密碼解決的是機密性,也就是確保 Eve 即便截獲到密文,也無法猜測出 Alice 和 Bob 傳遞的是啥內容。
完整性
有的時候,Eve 并非需要破解消息。 比如 Alice 辛辛苦苦寫了一個程序,Eve 晚上偷偷在程序后面追加了一些代碼。 第二天 Alice 將被替換的程序發給了 Bob。 雖然 Eve 沒有截獲任何密鑰,但事實上也破壞了 Alice 和 Bob 之間的信任關系。
所以密鑰體系仍然需要解決完整性,即第三者無法篡改原文內容.
為了確保消息的完整性,即防止消息在傳輸過程中被篡改,我們可以使用以下技術手段:
1. 哈希函數(Hash Function)
定義
哈希函數將任意長度的數據映射為固定長度的散列值(哈希值)。 散列函數是一個單向計算函數,只有一個輸入和對應的輸出。f(x)=y . 其中x稱為消息, 而y則稱為散列值。 f(x)=y可以跟進消息內容計算出對應的散列值,而我們就可以通過散列值來檢查信息的完整性
特征
一個合格工業級散列函數,必須具備以下特征:
-
固定長度的散列值
無論x是多長的消息,單向散列函數必須能夠生成固定長度的y(散列值)。比如SHA-256它所計算出來的散列值永遠是 256 比特
-
計算速度非常快
當然快是相對的,盡管隨著x的變大,計算時間勢必會加長。但如果不能在現實的時間內計算出來,那么就喪失實際應用的價值了
-
散列值的唯一性
散列值的唯一性稱之為抗碰撞性。也就是只要x不同那么計算出來的y一定不能相同。抗碰撞性分為兩類: 強抗碰撞性和弱抗碰撞性
弱抗碰撞性指的是x確定,那么y也就確定。 此時找到一個散列值等于y的x是非常困難的.
和弱抗碰撞性對應的是強抗碰撞性。強抗碰撞性指的是在茫茫數據集中,指定任意一個y,找到 x 和 x’ 是非常困難的
一個合格的散列函數,必須同時具備強抗碰撞性和弱抗碰撞性。 -
單向性: 根據x可以計算出y,但無法根據y反推出x。
哈希函數具有不可逆性和抗碰撞性,即難以通過哈希值反推出原始數據,也難以找到兩個不同的輸入具有相同的哈希值。
在一些場合中,單向散列函數也稱之為"消息摘要函數"、“哈希函數"和"雜湊函數”. 計算出的散列值也稱之為"消息摘要"或者"指紋"
常見算法
- MD4/5 : MD 是消息摘要(Message Digest)的縮寫。 常用的是 MD5,目前 MD5 已經被證實強抗碰撞性是不安全的,即根據 md5 的算法,現在已經可以產生具有相同y的兩個不同x了。所以在安全性高的場合中,不建議使用 md5
- SHA-1/256/384/512: 這是一個系列。后面的數字表示y的長度(SHA-1 除外)。 SHA-1 已經被證實強抗碰撞性是不安全的,而 SHA-256/384/512 仍未被攻破,所以后面這三個仍可以使用。后面這三類統稱SHA-2
- SHA-3: 算法和 SHA-2 已經完全不一樣了。 SHA-3 使用的是Keccak算法。Keccak算法理論上可以生成任意長度的散列值,目前在 SHA-3 規范中規定了SHA3-224\256\384\512這四種版本。Keccak使用的是一種稱之為海綿結構的分組算法,大意是將x進行分組,然后每個分組計算生成y’,再將y’作為輸入和下一個明文分組一起計算
- RIPEMD-160: 這個算法系列有兩個版本: RIPEMD 和 RIPEMD-160。 其中 RIPEMD 已經被證實強抗碰撞性是不安全的。但 RIPEMD-160 仍然是安全的
應用
- Alice發送消息前,計算消息的哈希值,并將消息和哈希值一起發送給Bob。
- Bob收到消息后,計算消息的哈希值,并與Alice發送的哈希值比較,確保消息未被篡改。
散列函數常用場景
- 口令加密
- 消息認證碼
- 數字簽名
- 偽隨機數生成器
- 一次性口令
散列函數無法解決的問題
散列函數只能確保信息內容不被篡改,而無法保證消息一定是從合法渠道發來的。 例如 Eve 可以偽裝成 Alice 向 Bob 發送消息和對應的散列值。 Bob 接受到消息和散列值后,如果校驗一致,那么也只能證明消息沒有經過篡改,而無法證明消息是 Alice 發來的。
而為了解決這個問題,就需要同時使用散列值和數字簽名了
2. 消息認證碼(MAC)
概述
散列函數中,我們提到過通過散列函數我們確保消息原文并沒有被篡改過。但無法保證消息是雙方真實意思的表現。
比如說 Bob 收到一條借款消息,上面寫著請 Bob 給 Alice 的銀行賬戶 xxxxx 轉 1000. Bob 通過計算消息內容的散列函數,證實消息沒有被篡改過。 那么此時此刻,Bob 應該給這個賬戶轉賬嗎?
不能!
因為 Bob 并不能證實這條消息是來自于 Alice 的。 有可能這條消息來自于 Eve。 所有僅通過散列函數只能解決是否篡改,而不能解決是否真實。
這是 Bob 以為的
而實際上卻是這樣的:
而消息認證碼則可以解決這個問題.
定義
消息認證碼是基于哈希函數或對稱加密算法生成的一段固定長度的代碼,用于驗證消息的完整性和真實性。消息認證碼是一種確認信息完整性并可以進行認證的技術,簡稱 MAC(Message Authentication Code)。 MAC 由兩部分組成: 消息 + 共享密鑰
和散列函數類似, MAC 可以將任意長度的消息計算出固定長度的輸出值。但和散列函數不同的是,如果沒有共享密鑰,則無法計算出最終的 MAC 值。 所以通過這一個性質來確保安全性.
MAC = 單向散列 + 共享密鑰
常見算法
HMAC (基于哈希函數的消息認證碼), CMAC (基于塊密碼的消息認證碼)等。
HMAC 的 H 指的是 Hash 的意思,是一種利用 Hash 來構造消息認證碼的算法。 我們說過MAC = 散列函數 + 共享密鑰 。 HMAC 使用的散列函數有:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 幾種函數。
因此相對應的 HMAC 也稱為:HMAC-SHA-1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512.
HMAC 用數學公式來表示是:
hash(opadKey || hash(ipadKey || message ))
其中:
ipadKey 是 key(密鑰) ⊕ ipad(內部 16 進制的 36 比特流) opadKey 是 key(密鑰) ⊕ opad(外部 16 進制的 5C 比特流)
所以 HMAC 是兩層 HASH 的結果值。
步驟分解:
密鑰填充:如果密鑰不足預設長度(散列函數的分組長度),則填充’0’。如果長呢?那就用散列函數計算固定長度的散列值作為密鑰值
- 將填充后的密鑰與 Ipad 進行異或操作,最后達到散列函數分組長度。此時將此值稱為IpadKey
- 將IpadKey附加在 message 開頭
- 將第三步的結果輸入 hash 函數,得出散列值
- 將填充后的密鑰與 Opad 進行異或操作,最后達到散列函數分組長度。此時將此值稱為OpadKey
- 將IpadKey附加在 message 末尾
- 將第六步的結果輸入 hash 函數,得出散列值
工作原理
- Alice和Bob共享一個對稱密鑰。
- Alice使用共享密鑰和哈希函數生成消息認證碼,并將消息和消息認證碼一起發送給Bob。
- Bob使用共享密鑰和哈希函數重新計算消息認證碼,并與Alice發送的消息認證碼比較,確保消息未被篡改。
如何使用 MAC
以 Bob 和 Alice 之間借錢的例子開始說。 假設這倆人之間通過 MAC 確保安全性,那么雙方處理流程應該大致是這個樣子
- Alice 將借錢消息發給 Bob。
- Bob 收到借錢消息后并不急于執行,而是等著 Alice 發來消息認證碼 Alice
- 通過共享密鑰和散列函數計算出 mac
- Alice 將消息認證碼發送給 Bob
- Bob 按照相同的規則計算一遍 Mac
- Bob將自己計算的 Mac 和 Alice 發來的 Mac 比對一遍。通過是否相同判斷請求是否合法
MAC 的問題
在 MAC 算法里面既然提到了共享密鑰,那么就無法逃離對稱密鑰體系的宿命:“密鑰配送問題”。 而解決這個問題,目前來說只能依靠公鑰密鑰、Diffie-Hellman 密鑰交換,密鑰中心等解決方案.
使用 HMAC 可以解決消息合法性和完整性的問題,但卻無法抵御重放攻擊。 比如 Eve 截獲到 Alice 和 Bob 之間的 Hmac 報文后,無限制的重復這段報文。 那么 Bob 就會無限制的進行轉賬。所以使用 HMAC 進行消息認證時,也會配合序號、時間戳等輔助信息,來判斷報文是否需要處理。
同時 HMAC 也無法解決否認的問題,比如 Alice 完全可以事后否認找 Bob 借過錢,因為 Bob 完全有能力偽造出這段報文。即便 Bob 拿出了 MAC 值,也無法證明是 Alice 生成的。
那又該如何證明錢是由 Alice 借的呢?
這就需要數字簽名技術了
不可否認性
不可否認性確保消息的發送者不能否認曾經發送過消息,這通常通過數字簽名實現。
數字簽名(Digital Signature)
定義:數字簽名是一種基于非對稱密碼技術的認證機制,用于驗證消息的發送者身份和消息的完整性。
工作原理:
- Alice使用自己的私鑰對消息的哈希值進行加密,生成數字簽名,并將消息和數字簽名一起發送給Bob。
- Bob使用Alice的公鑰對數字簽名進行解密,得到消息的哈希值,并計算接收到的消息的哈希值。
- Bob比較兩個哈希值,若相同,則確認消息完整且由Alice發送。
優點:
- 提供身份認證和完整性驗證。
- 防止發送者否認發送過消息。
應用場景:
- 安全電子郵件、數字合同、軟件分發等需要驗證身份和完整性的場景。
總結
確保信息的機密性、完整性和不可否認性是密鑰體系的重要目標。對稱密碼和非對稱密碼主要解決機密性問題。哈希函數、消息認證碼(MAC)和數字簽名是實現消息完整性和不可否認性的主要技術手段。
應用建議:
- 對于大數據量的加密,使用對稱密碼如AES。
- 對于身份驗證和不可否認性,結合使用非對稱密碼和數字簽名。
- 對于消息完整性,使用哈希函數和消息認證碼。