如何格式化 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 规范化算法必须应用
按顺序执行以下步骤:
将所有 header 字段名称(不是 header 字段值)转换为
小写。例如,将 "SUBJect: AbC" 转换为 "subject: AbC".
展开所有 header 字段续行,如中所述
[RFC5322];特别是,带有嵌入终止符的行
继续 header 字段值(即 CRLF 序列后跟
WSP) 必须在没有 CRLF 的情况下进行解释。实施必须
不要删除 header 字段值末尾的 CRLF。
将一个或多个 WSP 字符的所有序列转换为单个 SP
特点。这里的 WSP 字符包括字符前后的字符
线折叠边界.
删除每个展开的header字段末尾的所有WSP字符
价值.
删除冒号前后剩余的任何 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):
减少白色space:
忽略行尾的全白space。实现
不得删除行尾的 CRLF。
将一行中的所有 WSP 序列减少为单个 SP
字符.
忽略消息末尾的所有空行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";
我以前做过这方面的题,但是还是不懂怎么办。
我需要为电子邮件制作规范化 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 字符包括字符前后的字符 线折叠边界.
删除每个展开的header字段末尾的所有WSP字符 价值.
删除冒号前后剩余的任何 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):
减少白色space:
忽略行尾的全白space。实现 不得删除行尾的 CRLF。
将一行中的所有 WSP 序列减少为单个 SP 字符.
忽略消息末尾的所有空行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";