上海騰曦網絡服務有限公司
騰訊企業郵箱上海經銷商
作者:騰訊郵箱 發布時間:2024-12-04 16:34:48 訪問量:706
導讀:郵件發送方發送郵件時,利用本域私鑰加密郵件生成DKIM簽名,將DKIM簽名及其相關信息插入郵件頭。郵件接收方接收郵件時,通過DNS查詢獲得公鑰,驗證郵件DKIM簽名的有效性。從而確認在郵件發送的過程中,防止郵件被惡意篡改,保證郵件內容的完整性。
DKIM指引
一、DKIM(DomainKeys Identified Mail)
DKIM是一種防范電子郵件欺詐的驗證技術,通過消息加密認證的方式對郵件發送域名進行驗證。
郵件發送方發送郵件時,利用本域私鑰加密郵件生成DKIM簽名,將DKIM簽名及其相關信息插入郵件頭。郵件接收方接收郵件時,通過DNS查詢獲得公鑰,驗證郵件DKIM簽名的有效性。從而確認在郵件發送的過程中,防止郵件被惡意篡改,保證郵件內容的完整性。
二、DKIM簽名頭字段參數
1、例子:
DKIM-Signature: v=1; a=rsa-sha256; d=example.net; s=brisbane;
c=simple; q=dns/txt; i=@eng.example.net;
t=1117574938; x=1118006938;
h=from:to:subject:date;
z=From:foo@eng.example.net|To:joe@example.com|Subject:demo=20run|Date:July=205.=202005=203:44:08=20PM=20-0700;
bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=;
b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZVoG4ZHRNiYzR
2、解析:
v= 版本號(純文本,必要的),值為1
格式:v=1*DIGIT
a= 生成簽名的算法(純文本,必要的),驗證者必須支持“rsa-sha1”和“rsa-sha256”兩種算法,簽名者使用“rsa-sha256”簽名。
格式:a=rsa-sha1或者a=rsa-sha256
b= 簽名數據(base64.必要的)
格式:b=base64string
bh= 消息的規范化主體的哈希值,受“l=”標簽限制(base64.必要的)。
格式:bh=base64string
c= 消息規范化算法(純文本,可選的,默認為“simple/simple”),”/“兩邊分別對應頭部和主體的規范化算法,當“c=simple”或者“c=relaxed”時,表示頭部規范化算法使用simple或者relaxed,而主體規范化算法默認為simple。
格式:c=sig-c-tag-alg[“/“sig-c-tag-alg]
sig-c-tag-alg=”simple”/“relaxed”
d= Signing Domain Identifier ,即SDID (純文本,必要的)
格式:d=domain-name
h= 簽名的頭字段(純文本,必要的),提交給簽名算法的頭字段名稱列表,用“:”分隔。
格式:h=hdr-name*(“:”hdr-name)
i= Agent or User Identifier ,即AUID,值為@domain
格式:i=[Local-part]”@”domain-name
Local-part為空,domain-name與“d=”的值一樣或者是其子域。
l= 主體長度數(純文本無符號十進制整型,可選的,默認為整個主體)
格式:l=1*76DIGIT
q= 一個查詢方式的列表,以冒號分隔,用于檢索公鑰(純文本,可選的,默認為“dns/txt”),每個查詢方式的形式為“type[/options]”。
格式:q=dns/txt
s= selector,(純文本,必要的)
格式:s=selector
t= 簽名時間戳(純文本無符號十進制整型;推薦的,默認為一個未知的創建時間)。
格式:t=1*12DIGIT
x= 簽名到期時間(純文本無符號十進制整型;推薦的,默認永不過期)
格式:x=1*12DIGIT
z= 復制的頭字段(dkim-quoted-printable,可選的,默認為null)
格式:z=sig-z-tag-copy*(”|”sig-z-tag-copy)
sig-z-tag-copy= hdr-name”:”qp-hdr-value
三、DKIM DNS TXT記錄
1、例子:
$ORIGIN _domainkey.example.org.
brisbane IN TXT (“v=DKIM1;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ”
“KBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYt”
“IxN2SnFCjxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v”
“/RtdC2UzJ1lWT947qR+Rcac2gbto/NMqJ0fzfVjH4OuKhi”
“tdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB”)
2、解析:
v= DKIM密鑰記錄的版本(純文本,推薦的,默認為“DKIM1”)
格式:v=DKIM1
p= 公鑰數據(base64.必要的)。值為空表示公鑰已被撤銷。
格式:p=base64string
h= 可接受的哈希算法(純文本,可選的,默認允許所有算法),以冒號分隔。
格式:h= key-h-tag-alg*(“:” key-h-tag-alg)
key-h-tag-alg= “sha1”/“sha256”
k= 密鑰類型(純文本,可選的,默認為“rsa”)
格式:k=rsa
n= 可能感興趣的人(qp-setion,可選的,默認為空)。
格式:n=qp-setion
s= 服務類型(純文本,可選的,默認為“”),用冒號分隔。目前定義的服務類型有兩種,一是“”,匹配所有服務類型;二是“email”,電子郵件,不限于SMTP。
格式:s=key-s-tag-type*(“:”key-s-tag-type)
key-s-tag-type=”email”/“*”
t= 標記,表示以冒號分隔的名稱列表(純文本,可選的,默認沒有標記)。定義的標記有兩種,一是“y”,表示該域正在測試DKIM;二是“s”,“i=”標簽的domain必須與“d=”標簽一致。
格式:t=key-t-tag-flag*(“:”key-t-tag-flag)
key-t-tag-flag=”y”/“s”
注意:所有DKIM密鑰存儲在一個子域,命名為“_domainkey”。給定DKIM簽名字段d=example.com,s=foo.bar,DNS查詢為:“foo.bar._domainkey.example.com”。
四、規范化算法
1、頭部規范化算法
(1)“simple”頭部規范化算法
不以任何方式改變頭字段。提交給簽名或驗證算法的頭字段必須和被簽名或驗證消息時一致。尤其是,頭字段名稱禁止大小寫轉換,空白不可改變。
(2)“relaxed” 頭部規范化算法
①所有頭字段名稱(不是頭字段的值)轉化為小寫。例如,將“SUBJect: AbC”轉化為“subject: AbC”。
②展開所有頭字段的續行,特別是,帶有嵌入在頭字段值的終止符(即在CRLF后接有WSP)的行需解釋為不帶CRLF。實現時需在頭字段值末尾去掉CRLF。
③將所有由一個或多個WSP字符組成的序列轉化為單個SP字符。這里WSP字符包括在一行的之前和之后那些字符。
④刪除所有在每一個展開的頭字段的值末尾處的WSP字符。
⑤刪除所有在用于分隔頭字段名稱和頭字段值的冒號之前和之后剩下的WSP字符。必須保留分號分隔符。
2、主體規范化算法
(1)“simple”主體規范化算法
忽略信息主體末尾處所有空白行;如果沒有主體或者在消息主體中沒有末尾CRLF,需添加一個CRLF;一個完全空的或者缺失的主體需標準化為一個“CRLF”,即標準化長度為2字節。
(2)“relaxed”主體規范算法
①減少空白:
a.略行末尾所有空白。實現時禁止刪除行末尾的CRLF;
b.行中WSP的所有序列轉化為單個SP字符;
②.忽略消息主體末尾處所有空白行。如果主體非空白且不以CRLF結尾,則需添加CRLF。
3、例子
A:< SP>X< CRLF>
B < SP> : < SP> Y < HTAB>< CRLF>
< HTAB> Z < SP>< SP>< CRLF>
< CRLF>
< SP> C < SP>< CRLF>
D < SP>< HTAB>< SP> E < CRLF>
< CRLF>
< CRLF>
(1)頭部
simple:
A: < SP> X < CRLF>
B < SP> : < SP> Y < HTAB>< CRLF>
< HTAB> Z < SP>< SP>< CRLF>
relaxed:
a:X < CRLF>
b:Y < SP> Z < CRLF>
(2)主體
simple:
< SP> C < SP>< CRLF>
D < SP>< HTAB>< SP> E < CRLF>
relaxed:
< SP> C < CRLF>
D < SP> E < CRLF>
五、簽名算法
1、簽名算法的偽代碼:
body-hash = hash-alg (canon-body, l-param)
data-hash = hash-alg (h-headers, D-SIG, body-hash)
signature = sig-alg (d-domain, selector, data-hash)
2、解析:
body-hash:是使用哈希算法哈希主體的輸出值
hash-alg:是“a”參數指定的哈希算法
canon-body:主體的規范化表示,按“c”參數指定的規范化算法生成的,排除DKIM簽名字段。
l-param:是“l”參數的值,主體的長度。
data-hash:使用hash-alg算法哈希頭部的輸出,包括DKIM簽名頭部和主體哈希值。
h-headers:“h”參數指定的被簽名的頭字段列表。
D-SIG:規范化的DKIM簽名字段,去除參數簽名值部分即為一個空的參數值。
signature:簽名算法生成的簽名值
sig-alg:“a”參數指定的簽名算法。
d-domain:“d”參數指定的域名
selector:“s”參數指定的selector值。
注意:許多數字簽名API提供RSA私鑰的哈希和應用,使用原始的“sign()”。當使用這樣的API時,算法的最后兩個步驟可能會合并成一個調用,執行“a-hash-alg”和“sig-alg”。
六、驗證結果
簽名驗證結果的三種狀態:
1、SUCCESS:返回一個成功驗證
2、PERMFAIL:返回一個永久的、不可恢復的錯誤,例如簽名驗證失敗
3、TEMPFAIL:返回一個暫時的、可恢復的錯誤,例如DNS查詢超時
七、簽名者操作
簽名者按下面步驟順序執行。
1、確定郵件是否要簽名,應由誰簽名。
簽名者可以簽名某域的郵件,該域需要滿足以下條件:有一個私鑰,相應公鑰的必要知識和selector信息。
2、選擇一個私鑰和相應的selector信息
3、規范化信息以防傳輸過程中被修改
4、確定要簽名的頭字段
建議的簽名內容,選擇構成消息內容的核心字段,如地址字段和與主體相關的文本內容字段:
o From (REQUIRED;)
o Reply-To
o Subject
o Date
o To, Cc
o Resent-Date, Resent-From, Resent-To, Resent-Cc
o In-Reply-To, References
o List-Id, List-Help, List-Unsubscribe, List-Subscribe, List-Post,List-Owner, List-Archive
不建議簽名的字段:
o Return-Path
o Received
o Comments, Keywords
o DKIM-Signature field
5、計算消息的哈希和簽名
6、插入DKIM簽名頭字段
點贊 0 來源:qq366.cn
相關推薦:
騰訊企業微信郵箱免費版限容該怎么辦?上一篇:如何解除域名和企業郵箱綁定
下一篇:關于郵件審核功能