邮件安全之DKIM
0x1: DKIM是郵件發件人身份驗證技術實現方式之一,數字簽名在其中的應用同時保證了發件人身份可靠以及郵件內容的完整,用于防護發件人欺詐,是攔截垃圾郵件及釣魚郵件的有效手段。
我們先來看一個DKIM簽名,如下:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=<sender domain>;
?s=selector1;
?h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
?bh=0yxAGQYAXZRrgDxuKKJ/yZaxG5v3IDluFDDN4tzAZFM=;
?b=OYCVOTGgcZlZwAWYtmUsWIGev+zMqVCE0mVuqVQvhWfxwcG7W7tcdq5ObEPYvZTf2W8PK8U9bMI2QAnA9fB9lfqW/ndfy00k5lGJk6igZlyH2Hr3FC+A/8EcYBifWdqz2AbTVDo8uwHYVK5RZjgHPohzypyDsR+o4f1qXqLfjYc=
?
簽名中各標簽的含義,這里不作解釋。我們將在這篇文章里通過手動驗證這個數字簽名來了解DKIM簽名驗證過程。
0x2: 執行DKIM的手動驗證,關鍵點是對郵件正文及信頭的規范化(Canonicalization)。relaxed/relaxed是廣泛使用的處理方式,允許郵件服務器對郵件內容的少量變更,比如插入空行等。
The "simple" Header Canonicalization Algorithm
‘Simple’方式的郵件信頭的規范化處理不對信頭做任何修改,保留原始信頭原。但是需按照DKIM簽名里的h標簽值中信頭列表的順序排列信頭。
The "relaxed" Header Canonicalization Algorithm
‘Relaxed’方式的信頭規范化處理需要按下面列出的要求進行:
a.?? ?將所有header name轉換為小寫字母書寫。
b.?? ?分行(folding,參考RFC5322)處理的信頭需要刪除多余的CRLF,恢復為一行,保留行末尾的CRLF。
c.?? ?將連續的空白字符(包括空格、制表符TAB)轉換為單個空格字符。
d.?? ?刪除header value末尾的空白符。
e.?? ?Header name和value是由冒號分隔,需刪除冒號前后的空格
f.?? ?需按照DKIM簽名里的h標簽值中信頭列表的順序排列信頭。
The "simple" Body Canonicalization Algorithm
‘Simple’方式的郵件信體的規范化處理的要點為:
a.?? ?刪除空白行
b.?? ?刪除信體末尾多余的換行符CRLF,僅保留一個。
The "relaxed" Body Canonicalization Algorithm
‘Relaxed’方式的郵件信體的規范化處理的要點為:
a.?? ?刪除每行末尾的空白字符。需保留換行符。
b.?? ?每行中連續的空字符轉換為單個空格符。
c.?? ?刪除信體末尾的空白行,需保留一個CRLF.
首先驗證郵件正文的hash值是否匹配
將郵件正文按照DKIM簽名里指定的規范化處理方式處理后,按SHA256方式計算正文的hash值并將Hex格式的結果轉換為base64.
驗證正文hash值匹配后,執行簽名的驗證,分兩步進行:
Step 1:
從郵件DKIM簽名中提取b標簽的值,如下:
‘OYCVOTGgcZlZwAWYtmUsWIGev+zMqVCE0mVuqVQvhWfxwcG7W7tcdq5ObEPYvZTf2W8PK8U9bMI2QAnA9fB9lfqW/ndfy00k5lGJk6igZlyH2Hr3FC+A’
這是base64格式的數據,需轉換為原始數據,并保存到文件hash.dat.
通過DNS查詢,獲取該數字簽名對應的公鑰'Public Key',保存到文件domain.pem.
使用openssl工具來驗證數字簽名,
openssl rsautl -verify -inkey domain.pem -pubin -in hash.dat -asn1parse
驗證結果是SHA256的哈希值,如下:
哈希值為:'5ea108c3a6c1fd5283d7ebc9ec8625352b1ac58542745e0c45490fbb063c5449'
Step 2:
規范化處理郵件信頭,需將DKIM簽名信頭規范化處理后放置在指定信頭后面。
將處理后的信頭提交進行SHA256計算,得到哈希值:
'5ea108c3a6c1fd5283d7ebc9ec8625352b1ac58542745e0c45490fbb063c5449'
該哈希值和Step 1中驗證計算得到的哈希值相同,即通過DKIM驗證。
由于驗證需要使用指定域名的公鑰,從而可以驗證發件人身份可靠。郵件正文的哈希值加入了標簽b的驗證,可以保證數據的完整,沒有被篡改。
總結
- 上一篇: 答云淡风轻:汉化Rails报错信息,部署
- 下一篇: python数据分析——网络流量的一些特