訊息鑑別碼(Message Authentication Code,MAC),能夠實現「身份鑑別」、「檢查訊息完整性」兩種功能的機制。即使是密文,也可能在傳輸時遭到竄改,解密成不同的內容產生誤會,訊息鑑別碼就是為了避免這種情況發生。
MAC可以想像成由金鑰和密文排列組合成字串「雜湊碼」。MAC的製作方式有好幾種,包括「HMAC」、「OMAC」、「CMAC」,現在多半使用「HMAC」。
MAC缺點是A和B都能對訊息加密,計算MAC,也就是說,無法證明製作原始訊息的是A還是B,因此若其中一方不懷好意,可以在傳出訊息後,主張是對方捏照的信息,由於製作者和驗證者都擁有MAC,因此無法判斷是誰做成MAC,這類詭計可以用「數位簽章」來防範。
由於MAC本身存在的安全隱患,HMAC將「key」和訊息再hash,避免反推的情況,會在hash時往裡面加salt,增加複雜度。前幾天提到的加密演算法,不論是哪種,都擺脫不了三種組合:key + message、message + key、key +message + key,因此我們需要更高強度的HMAC。
下列影片清楚講解HMAC架構:
HMAC的優點其中一個最重要的他可以被嵌入在不同的雜湊演算法中,也是因為安全性以及彈性高,HMAC目前廣泛地使用。
import hmac
from hashlib import sha1
message = b'Hello, world!'
key = b'secret'
h = hmac.new(key, message, sha1)
print(h.hexdigest())
數位簽章是在能夠實現「身份鑑別」和「檢查訊息完整性」兩種功能的訊息鑑別碼裡,加入也確保具有「不可抵賴性」(non-repudiation)的機制。訊息鑑別碼機制使用共同金鑰,造成擁有金鑰的收訊者也可能是訊息的傳送者;另一方面,數位簽章的機制是利用只有傳送者才能製作的稱為「數位簽章」的數據,所以可以確定訊息的製作者。
數位簽章的具體製作方式:參考公開金鑰密碼系統的步驟
數位簽章雖然具備「身份鑑別」、「檢查訊息完整性」、「不可抵賴性」的功能,但仍有一個問題:
公開金鑰密碼系統和數位簽章的機制,無法確保公開金鑰確實為通訊對象所擁有,因此,如果不懷好意的第三人調換公開金鑰,收訊者無法察覺,需要利用「數位憑證」解決此問題。
步驟:
憑證機構可以由任何人或任何公司發行,B取得的公開金鑰Pc,真的是憑證機構製作的嗎?
事實上憑證機構的公開金鑰Pc,也會議數位憑證的方式提供,因此,這個憑證機構的憑證發行者,就是更上層的憑證機構,上層憑證機構製作下層憑證機構的憑證。
位在最上層的憑證機構稱為「根憑證機構」(root CA),自己的真實性由自己來證明,而root CA用來證明自己的憑證,稱為「根憑證」(root certifficate)。根憑證機構的組織本身若不值得信來,就不會有人使用,所以大多為大企業或政府機關等已經獲得社會信賴的組織。
「伺服器憑證」(server certificate):同樣是由憑證機構發行,個人的憑證與電子郵件地址綁在一起,伺服器憑證則是與網域連在一起。換言之,透過憑證可以確認管理這個網站網域的組織,以及管理存放網站內容的伺服器組織,兩者是同一個。