首页 > 解决方案 > 如何构建 DKIM 标头

问题描述

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

我目前正在研究 DKIM 签名者,我知道该怎么做,但在散列之前找不到如何格式化标题和正文。

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

标签: emailsmtpdkim

解决方案


3.4.1。“简单”的标头规范化算法

“简单”标头规范化算法不会以任何方式更改标头字段。标头字段必须完全按照它们在被签名或验证的消息中的方式呈现给签名或验证算法。特别是,标题字段名称不得大小写折叠,空格不得更改。

3.4.2. “宽松”的标头规范化算法

“宽松”标头规范化算法必须按顺序应用以下步骤:

  • 将所有标题字段名称(不是标题字段值)转换为小写。例如,将“SUBJect: AbC”转换为“subject: AbC”。

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

  • 将一个或多个 WSP 字符的所有序列转换为单个 SP 字符。此处的 WSP 字符包括折线边界前后的字符。

  • 删除每个展开的标题字段值末尾的所有 WSP 字符。

  • 删除分隔标头字段名称和标头字段值的冒号前后剩余的任何 WSP 字符。必须保留冒号分隔符。

3.4.3. “简单”的身体规范化算法

“简单”正文规范化算法会忽略消息正文末尾的所有空行。空行是删除行终止符后长度为零的行。如果消息正文中没有正文或没有尾随 CRLF,则添加 CRLF。它不对消息正文进行任何其他更改。在更正式的术语中,“简单”正文规范化算法将正文末尾的“*CRLF”转换为单个“CRLF”。

请注意,完全空的或丢失的正文被规范化为单个“CRLF”;也就是说,规范化的长度将是 2 个八位字节。

空主体(规范化为“CRLF”)的 SHA-1 值(以 base64 为单位)为:

uoq1oCgLlTqpdDX/iUbLy7J1Wic=

SHA-256 值为:

frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=

3.4.4。“宽松”的身体规范化算法

“松弛”主体规范化算法必须按顺序应用以下步骤(1)和(2):

  1. 减少空格:

    • 忽略行尾的所有空格。实现不得删除行尾的 CRLF。

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

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

空主体(规范化为空输入)的 SHA-1 值(以 base64 为单位)为:

2jmj7l5rSw0yVb/vlWAYkK/YBwk=

SHA-256 值为:

47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

3.4.5。规范化示例(信息)

在以下示例中,实际空格仅用于清楚起见。实际的输入和输出文本使用括号描述符指定:"<SP>"空格字符、"<HTAB>"制表符和"<CRLF>"回车/换行序列。例如,"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>

当对标头和正文使用宽松的规范化进行规范化时,会导致标头读数:

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

和正文阅读:

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

示例 2:使用简单规范化对标头和正文进行规范化的同一消息导致标头读取:

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

和正文阅读:

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

示例 3:当使用宽松的标头规范化和简单的正文规范化进行处理时,规范化版本的标头为:

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

和正文阅读:

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

推荐阅读