什麼是 DKIM及如何運作?
在之前的文章中有介紹過SPF,可以確保來源的信件是正確的,但要如何確保Email 的內容和標頭沒有被更改呢?
DKIM 利用密碼學中的非對稱式加密,首先網域擁有者會將公鑰儲存在公開可用的 DNS 記錄(DKIM 記錄)中,所有電子郵件都包含 DKIM 標頭,並包含使用私密金鑰簽署的資料(數位簽章)。
收件者的電子郵件伺服器當收到信件後,會從DNS中取得公鑰以及使用公鑰驗證數位簽章,來確保電子郵件在傳送的過程中沒有被變更過。
此技術加深了攻擊者偽造郵件的難度,來確保電子郵件的安全性。
DNS 上的 DKIM 記錄是甚麼?
DKIM 記錄會存放在DNS上已TXT的方式儲存,TXT中必需包含指定的參數v(版本)和p(公鑰)讓電子郵件主機可以驗證以私鑰簽署的內容。
以下是 DKIM 的 DNS TXT 記錄的範例:
主機名稱 | 類型 | 資料 |
---|---|---|
google._domainkey.cjkuo.com | TXT | v=DKIM1;t=s;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2IFyR/9dHLQo…(因版面省略) |
主機名稱
郵件主機可以根據系統設定而對應不同筆的 DKIM 金鑰,所以在DNS的設定中必須以特定格式設定,來達成在不同服務上使用不同的金鑰或是可以進行金鑰替換,格式如下方。
[selector]._domainkey.[domain]
此設定值有三個區塊組成 selector、 _domainkey、domain ,用條列式的方式來進行說明。
- selector : 通常是電子郵件服務商發布的指定值,也可以是客制的其他值只需在服務商上指定使用哪筆記錄即可,觀念上可認定為這筆金鑰記錄的名稱。
- _domainkey : 為 DKIM 記錄中必須包含的值,是統一設定的格式內容。
- domain : 您的網域名稱。
範例網域是 aaa.com 當使用 Google workspace 當成電子信箱服務商
設定 DKIM 預設字串是 google,因此在DNS上設定會是
google._domainkey.aaa.com
資料
v=DKIM1;t=s;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2IFyR/9dHLQo...(因版面省略)
必須參數
- v= : 值必須等於 DKim1 表示該 TXT 記錄應該被解釋為 DKIM。
- p= : 等號後的所有內容是公鑰。
可選參數
- n= : 可以在此新增供人閱讀的相關註解。
- t= : 值是y代表此值為測試憑證僅供參考,可以被忽略,值是s時代表此值為正式憑證。
- k= : 代表金鑰的類型,默認設定為 “rsa”
- h= : 設定可以接受的演算法,可設定為 “sha1 “或 “sha256”
如何將 DKIM 標頭附加在信件中?DKIM 簽章又是如何運作?
當啟用DKIM後郵件服務商會將寄出信件標頭附加上數位簽章在DKIM標頭中,在正常情形下服務商不會將資訊顯示在畫面中除非特別點選詳細資料,例如:在Gmail中可以再電子郵件的右上角內找到顯示原文,會有詳細的電子郵件標頭。
以下是 DKIM 標頭的範例:
v=1; a=rsa-sha256;
d=aaa.com;s=google;
h=from:to:subject;
bh=R4tasKYSFv7Xcd5iCfhKNU8fapUQIOLxm3kq+qEZFi2ORxpN+D(刪除部分);
b=R4tasKYSFv7Xcd5iCfhKNU8fapUQIOLxm3kq+qEZFi2ORxGt2a51XlL(刪除部分)
v=
顯示正在使用中的 DKIM 版本。d=
是寄件者的網域名稱。s=
是接收伺服器用來查詢 DNS 記錄的選取器,在此狀態底下會去DNS查詢公鑰的位置就會是”google._domainkey.aaa.com”。h=
列出用於建立數位簽章的標頭欄位,或b
。在本範例中,使用的是寄件者、收件者和主旨標頭。如果 Jason 使用 aaa.com 網域向 jack 傳送電子郵件,主旨行是「Say hello world 」,這裡使用的內容將是「jason@aaa.com」 +「jack@aaa.com」 +「Say hello world」。
(該內容也將規範化,即形成標準化的格式。)bh=
是電子郵件內文的雜湊。雜湊是稱為雜湊函數的專用數學函數的結果。包含該值是為了使接收電子郵件伺服器能夠在整個電子郵件內文載入之前計算簽章,因為電子郵件內文可能是任何長度,在某些情況下載入可能需要很長的時間。a=
是用於計算數位簽章 (b
) 以及產生電子郵件內文雜湊 (bh
) 的演算法。在這個範例中,使用的是 RSA-SHA-256(RSA 使用 SHA-256 作為數位簽章的雜湊,並使用 SHA-256 用於內文雜湊)。b=
是由h
和bh
產生的數位簽章,並以私鑰簽署。
數位簽章 (b=
) 允許接收伺服器:1. 驗證傳送伺服器;以及 2. 確保完整性,即確保電子郵件未遭篡改。
接收伺服器會取得 h=
及內文雜湊 (bh=
) 中所列的相同內容,並使用 DKIM 記錄中的公用金鑰來檢查數位簽章是否有效,從而實現上述目的。如果使用了正確的私密金鑰,而且內容(標題和內文)未遭更改,則電子郵件會通過 DKIM 檢查。