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