消息認證包括兩個目標
1消息完整性認證: 確保張三發給我的消息是完整的,在傳輸過程中沒有被第三方篡改
2消息的來源認證: 確保這個數據是張三發給我的,而不是李四發給我的
第一個目標通常使用散列函數來達成
常見用例: 張三把要發送的數據通過散列函數比如md5提取數據的摘要,讓后將摘要和數據一起發送給我
我接收到數據后將數據部分進行同樣的md5散列方法,得到的摘要和收到的摘要做對比,如果
兩個摘要相同,那證明這個數據是沒有被篡改的
第二個目標通常使用密匙來達成
我們在回過頭看一下上面的那個例子,會發現一個大問題,那就是我們認定了收到摘要沒有問題,這個邏輯
才講得通,但實際中的黑客比你想象中更聰明,他不僅改了數據,連同摘要一起篡改了。
這個時候就需要密匙了
這個密匙只有我和張三知道,張三將密匙追加在數據后面進行摘要提取,然后將摘要和數據發送給我,
我方收到數據后,將我本地存儲的密匙追加在數據后面,進行摘要提取,對比收到的摘要,如果可以吻合,
那么數據就是未被篡改且一定是張三發給我的
再來回味一下這個過程,發現數據在傳輸過程中沒有暴漏出密匙,黑客拿不到密匙就無法偽造摘要,摘要無法偽造,
他篡改了數據就會被我方輕易識破
結論
在設計消息認證碼的時候,至少要實現這兩個目標才算安全合格,密匙要定期更換,降低密匙泄露造成的危害
擴展
上面的一通可以認為是消息認證碼的底層原理,實際中有很多已經設計好的方案可供使用,比如使用廣泛的 HMAC,
HMAC可以看成是一個消息認證碼接口,其中H代表Hash,意味着HMAC需要和一個hash函數搭配才能使用,
常見的hash函數: md5,sha1,sha256,sha512....
比如常見的 HS256 就是 HMAC + SHA256
大部分編程語言都提供相關函數,調用類似於這樣 hmac(數據,hash方法,密匙)