如何构建 DKIM headers

How to structure DKIM headers

我正在开发一个从头开始发送电子邮件的系统。

我目前正在开发 DKIM 签名器,我知道该怎么做,但找不到如何在散列之前格式化 header 和 body。

有人知道吗?已经谢谢了。

3.4.1。 "simple" Header 规范化算法

"simple" header 规范化算法没有改变 header 以任何方式的领域。 Header 字段必须提交给签名或 验证算法与消息中的完全一样 签名或验证。特别是,header 字段名称不能是 外壳折叠且白色space 不得更改。

3.4.2。 "relaxed" Header 规范化算法

"relaxed" header 规范化算法必须应用 按顺序执行以下步骤:

  • 将所有 header 字段名称(不是 header 字段值)转换为 小写。例如,将 "SUBJect: AbC" 转换为 "subject: AbC".

  • 展开所有 header 字段续行,如中所述 [RFC5322];特别是,带有嵌入终止符的行 继续 header 字段值(即 CRLF 序列后跟 WSP) 必须在没有 CRLF 的情况下进行解释。实施必须 不要删除 header 字段值末尾的 CRLF。

  • 将一个或多个 WSP 字符的所有序列转换为单个 SP 特点。这里的 WSP 字符包括字符前后的字符 线折叠边界.

  • 删除每个展开的末尾的所有 WSP 字符 header 价值.

  • 删除冒号前后剩余的任何 WSP 字符 将 header 字段名称与 header 字段值分开。这 必须保留冒号分隔符。

3.4.3。 "simple" Body 规范化算法

"simple"body规范化算法忽略所有空行 在消息的末尾 body。空行是零行 删除行终止符后的长度。如果没有 body 或者 消息 body 上没有尾随 CRLF,添加了 CRLF。它使不 消息的其他更改 body。更正式地说, "simple" body 规范化算法最后转换为“*CRLF” body 到单个 "CRLF".

请注意,完全空的或缺失的 body 被规范化为 单身"CRLF";也就是说,规范化长度将为 2 个八位字节。

空 body 的 SHA-1 值(在 base64 中)(规范化为 "CRLF") 是:

uoq1oCgLlTqpdDX/iUbLy7J1Wic=

SHA-256 值为:

frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=

3.4.4。 "relaxed" Body 规范化算法

"relaxed" body 规范化算法必须应用 按顺序执行步骤 (1) 和 (2):

  1. 减少白色space:

    • 忽略行尾的全白space。实现 不得删除行尾的 CRLF。

    • 将一行中的所有 WSP 序列减少为单个 SP 字符.

  2. 忽略消息末尾的所有空行body。 “空的 line" 在第 3.4.3 节中定义。如果 body 是 non-empty 但 不以 CRLF 结尾,则添加 CRLF。 (对于电子邮件,这是 只有在使用 SMTP 扩展或 non-SMTP 传输时才有可能 机制。)

空 body 的 SHA-1 值(在 base64 中)(规范化为 空输入)是:

2jmj7l5rSw0yVb/vlWAYkK/YBwk=

SHA-256 值为:

47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

3.4.5。规范化示例(信息性)

在下面的例子中,实际的白色space仅用于 明晰。实际的输入和输出文本使用指定 括号内的描述符:"<SP>" 表示 space 字符,"<HTAB>" 表示 制表符,"<CRLF>" 用于 carriage-return/line-feed 序列。 比如"X <SP> Y""X<SP>Y"代表相同的三个 字符。

示例 1:消息阅读:

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>

当对 header 和 body 结果为 header 读数:

a:X <CRLF>
b:Y <SP> Z <CRLF>

和 body 读数:

<SP> C <CRLF>
D <SP> E <CRLF>

示例 2:使用 simple 对同一消息进行规范化 header 和 body 的规范化导致 header 阅读:

A: <SP> X <CRLF>
B <SP> : <SP> Y <HTAB><CRLF>
       <HTAB> Z <SP><SP><CRLF>

和 body 读数:

<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>

示例 3:使用宽松的 header 规范化和 简单 body 规范化,规范化版本有一个 header 的:

a:X <CRLF>
b:Y <SP> Z <CRLF>

和 body 读数:

<SP> C <SP><CRLF>
D <SP><HTAB><SP> E <CRLF>