DKIM 是一種專用的 DNS TXT 記錄,儲存用於驗證電子郵件真實性的公開金鑰。
閱讀本文後,您將能夠:
相關內容
訂閱 TheNET,這是 Cloudflare 每月對網際網路上最流行見解的總結!
複製文章連結
網域金鑰識別郵件 (DKIM) 是一種電子郵件驗證方法,可協助防止垃圾郵件發信者和其他惡意方冒充合法網域。
所有電子郵件地址都有一個網域,也就是「@」符號後面的地址部分。垃圾郵件發信者和攻擊者可能會在傳送電子郵件時嘗試冒充網域以進行網路釣魚攻擊或其他詐騙。
假設 Chuck 想欺騙為 example.com 工作的 Alice,讓她給他傳送公司的機密資訊。他可以給她傳送一封看似來自「bob@example.com」的電子郵件,以騙取她的信任,讓她以為他也在為 example.com 工作。
DKIM 搭配寄件者原則架構 (SPF) 和基於網域的郵件驗證、報告和一致性 (DMARC),讓攻擊者更難以透過這種方式冒充網域。未通過 DKIM 和 SPF 的電子郵件被標記為「垃圾郵件」或不會被電子郵件伺服器傳送。如果 example.com 為其網域設定了 DKIM、SPF 和 DMARC,那麼 Alice 甚至可能永遠不會看到 Chuck 的惡意電子郵件,因為它會進入她的垃圾郵件資料夾,或者被電子郵件伺服器完全拒絕。
DKIM 主要有兩個層面:DKIM 記錄(儲存在網域的 Domain Name System (DNS) 記錄中)和 DKIM 標頭(附加至來自網域的所有電子郵件)。
DKIM 使用以公用金鑰加密法為基礎的數位簽章配置來驗證電子郵件的來源,確認其確實來自從該網域傳送電子郵件的伺服器。使用一組加密金鑰:用於寄件者簽署訊息的私密金鑰,以及用於驗證簽章的公用金鑰。接收者無法使用公用金鑰來簽署訊息,反之亦然。
電子郵件提供者產生公用金鑰和私密金鑰。它們會將公用金鑰提供給網域擁有者,網域擁有者會將公用金鑰儲存在公開可用的 DNS 記錄(DKIM 記錄)中。
從該網域傳送的所有電子郵件都包含 DKIM 標頭,其中包含使用私密金鑰簽署的資料區段:這稱為「數位簽章」。電子郵件伺服器可以檢查 DKIM DNS 記錄、取得公用金鑰,以及使用公用金鑰驗證數位簽章。
此程序也可確保電子郵件在傳輸過程中未變更。如果電子郵件標題或電子郵件內文已變更,數位簽章將無法驗證——就像藥罐上的防偽封條。
DKIM 記錄會儲存 DKIM 公用金鑰,這是一個隨機的字元字串,用來驗證任何使用私密金鑰簽署的內容。電子郵件伺服器會查詢網域的 DNS 記錄,以查看 DKIM 記錄並檢視公用金鑰。
DKIM 記錄實際上是 DNS TXT(「文字」)記錄。TXT 記錄可用來儲存網域管理員想要與其網域建立關聯的任何文字。DKIM 是此類 DNS 記錄的眾多用途之一。(在某些情況下,網域會將其 DKIM 記錄儲存為指向金鑰的 CNAME 記錄;不過,官方 RFC 要求這些記錄為 TXT。)
以下是 DKIM DNS TXT 記錄的範例:
姓名 | 類型 | 目錄 | TTL |
---|---|---|---|
big-email._domainkey.example.com |
TXT |
v=DKIM1; p=76E629F05F70 |
6000 |
與大多數 DNS TXT 記錄不同,DKIM 記錄會以專用名稱儲存,而不僅僅是網域名稱。DKIM 記錄名稱採用以下格式:
[selector]._domainkey.[domain]
selector
是由網域使用的電子郵件服務提供者發佈的專用值。它包含在 DKIM 標頭中,可讓電子郵件伺服器在 DNS 中執行所需的 DKIM 查詢。domain
是電子郵件網域名稱。._domainkey.
包含在所有 DKIM 記錄名稱中。
若要查詢 DKIM 記錄,電子郵件伺服器會使用電子郵件服務提供者提供的 DKIM 選取器,而不只是網域名稱。假設 example.com 使用 Big Email 作為他們的電子郵件服務提供者,並且假設 Big Email 使用 DKIM 選取器 big-email
。example.com 的大部分 DNS 記錄將被命名為 example.com
,但他們的 DKIM DNS 記錄名稱將為 big-email._domainkey.example.com
,這已在上面的範例中列出。
這是 DKIM DNS 記錄中列出公用金鑰的部分。在上面的範例中,v=DKim1
表示該 TXT 記錄應該被解釋為 DKIM,公用金鑰是 p=
之後的所有內容。
這些是 DNS 記錄中的標準欄位。TXT
表示這是一個 DNS TXT 記錄。「TTL」代表存留時間(以秒為單位),它表示該記錄在需要重新整理之前被視為有效的時長。DKIM 記錄的 TTL 一般為幾分鐘。
傳送電子郵件伺服器使用電子郵件標題、電子郵件內文(實際上是電子郵件內文的雜湊——請在下文中閱讀更多內容)和其私密金鑰建立其數位簽章。此數位簽章會附加至電子郵件,做為 DKIM 標頭的一部分。
DKIM 標頭是附加至電子郵件的眾多標頭之一。除非使用者選擇某些選項,否則大多數電子郵件應用程式在顯示電子郵件時都不會顯示標頭。例如,在 Gmail 中,使用者可以按一下電子郵件右上角的三個垂直點,然後按一下「顯示原文」,檢視電子郵件標頭。
以下是 DKIM 標頭的範例:
v=1; a=rsa-sha256; d=example.com;s=big-email; h=from:to:subject; bh=uMixy0BsCqhbru4fqPZQdeZY5Pq865sNAnOAxNgUS0s=; b=LiIvJeRyqMo0gngiCygwpiKphJjYezb5kXBKCNj8DqRVcCk7obK6OUg4o+EufEbB tRYQfQhgIkx5m70IqA6dP+DBZUcsJyS9C+vm2xRK7qyHi2hUFpYS5pkeiNVoQk/Wk4w ZG4tu/g+OA49mS7VX+64FXr79MPwOMRRmJ3lNwJU=
v=
顯示正在使用中的 DKIM 版本。d=
是寄件者的網域名稱。s=
是接收伺服器用來查詢 DNS 記錄的選取器。h=
列出用於建立數位簽章的標頭欄位,或 b
。在本範例中,使用的是寄件者、收件者和主旨標頭。如果 Bob 使用 example.com 網域向 Alice 傳送電子郵件,主旨行是「Recipe for cheesecake」,這裡使用的內容將是「bob@example.com」 +「alice@example.com」 +「Recipe for cheesecake」。(該內容也將規範化,即形成標準化的格式。)bh=
是電子郵件內文的雜湊。雜湊是稱為雜湊函數的專用數學函數的結果。包含該值是為了使接收電子郵件伺服器能夠在整個電子郵件內文載入之前計算簽章,因為電子郵件內文可能是任何長度,在某些情況下載入可能需要很長的時間。a=
是用於計算數位簽章 (b
) 以及產生電子郵件內文雜湊 (bh
) 的演算法。在這個範例中,使用的是 RSA-SHA-256(RSA 使用 SHA-256 作為數位簽章的雜湊,並使用 SHA-256 用於內文雜湊)。b=
是由 h
和 bh
產生的數位簽章,並以私密金鑰簽署。數位簽章 (b=
) 允許接收伺服器:1. 驗證傳送伺服器;以及 2. 確保完整性,即確保電子郵件未遭篡改。
接收伺服器會取得 h=
及內文雜湊 (bh=
) 中所列的相同內容,並使用 DKIM 記錄中的公用金鑰來檢查數位簽章是否有效,從而實現上述目的。如果使用了正確的私密金鑰,而且內容(標題和內文)未遭更改,則電子郵件會通過 DKIM 檢查。
DMARC 是一種建立在 DKIM 和 SPF 之上的電子郵件驗證方法。DMARC 說明如何處理未通過 SPF 和 DKIM 的電子郵件。SPF、DKIM 和 DMARC 共同協助防止垃圾郵件和電子郵件詐騙。與 DKIM 記錄一樣,DMARC 原則會儲存為 DNS TXT 記錄。
若要在 Cloudflare 中快速設定此記錄,請使用電子郵件安全性 DNS 精靈。
進一步瞭解電子郵件的 DNS 記錄:
要深入瞭解 DKIM,請參閱 RFC 6376。