如何格式化 DKIM Header 和 body?

How to format DKIM Header and body?

我以前做过这方面的题,但是还是不懂怎么办。

我需要为电子邮件制作规范化 header 和 body。我已经多次阅读这篇文档。有人可以举个例子吗,因为我无法解决这个问题:

3.4.1。 "simple" Header 规范化算法

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

3.4.2。 "relaxed" Header 规范化算法

"relaxed" 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>

好的,让我们尝试将这些示例翻译成 C 字符串:

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>

翻译:

char *message = "A: X\r\nB : Y\t\r\n\tZ  \r\n\r\n C \r\nD \t E\r\n\r\n\r\n";

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

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

翻译:

char *headers = "a:X\r\nb:Y Z\r\n";

和 body 读数:

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

翻译:

char *body = " C\r\nD E\r\n";

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

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

翻译:

char *headers = "A: X\r\nB : Y\t\r\n\tZ  \r\n";

和 body 读数:

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

翻译:

char *body = " C \r\nD \t E\r\n";

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

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

翻译:

char *headers = "a:X\r\nb:Y Z\r\n";

和 body 读数:

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

翻译:

char *body = " C \r\nD \t E\r\n";