命名数据网络 | 带签名的兴趣包(Signed Interest)
命名数据网络 | 带签名的兴趣包(Signed Interest)
参考文档:https://docs.named-data.net/NDN-packet-spec/current/signed-interest.html
Signed Interest 是一种发布经过身份验证的 Interest 包的机制。
带签名的兴趣包指的是一个 Interest 包:
- 名称以 ParametersSha256DigestComponent 结尾。
- 存在 InterestSignature。
有关兴趣签名元素格式的详细信息,请参见 Interest Signature。
Signed Interest 的构建
以下程序描述了 Interest 包的签署过程:
- 删除 Name 中存在的所有 ParametersSha256DigestComponent 组件,无论其位置如何。
- 如果 ApplicationParameters 元素不存在,则向 Interest 包中添加一个零长度的 ApplicationParameters 元素。
- 准备一个 InterestSignatureInfo 元素,并将其附加在 Interest 包的末尾。
- 根据 兴趣签名 一节计算加密签名。
- 将计算的签名作为 InterestSignatureValue 元素插入到 Interest 包的末尾。
- 根据 参数摘要组件 一节计算 ParametersSha256DigestComponent,并将其附加在 Name 的末尾。
Signed Interest 的处理
在收到 Interest 包后,根据 Interest 包的名称的前缀,生产者应该能够判断 Interest 包是否需要签名。如果需要对接收到的 Interest 包进行签名,应用程序协议或生产者也应该显式地定义是否必须在 InterestSignatureInfo 中存在 SignatureNonce、SignatureTime 和/或 SignatureSeqNum。如果缺少任何必需的元素,则将这个 Interest 包视为无效。
此外,如果以下任何情况属实,一个 Signed Interest 必须被视为无效:
- Name 组件不是 ParametersSha256DigestComponent,或者根据 参数摘要组件 一节,它的 TLV-VALUE 不正确。
- 缺少 InterestSignatureInfo 元素或者缺少 InterestSignatureInfo 元素的任何强制子元素。
- 缺少了 InterestSignatureValue 元素。
- 无法对签名进行加密验证。
- 用于创建签名的密钥不受信任,无法对 Interest 包进行签名。
- 如果在 InterestSignatureInfo 中存在 SignatureTime(t):
查找与同一密钥一起使用的最后记录的SignatureTime(t0)。如果没有先前的记录,则使用 CurrentTime - GracePeriod。建议宽限时间为 60 秒。如果 t0 >= t,则认为 Interest 包是无效的。如果 Signed Interest 已根据此规则和所有其他规则进行验证,则将 t0 设置为 t。
不建议共享私钥。如果私钥共享是不可避免的,那么密钥所有者有责任保持时钟同步。
- 如果 SignatureNonce 存在:
要执行此检查,收件人必须记住先前收到的 Signed Interest 中携带的 SignatureNonce 列表,该列表与特定签名密钥一起使用。检查当前 Signed Interest 中携带的 SignatureNonce 是否与使用相同密钥的已记录的 SignatureNonce 重复。如果是重复,则将该 Interest 包视为无效。如果已根据此规则和所有其他规则验证了 Signed Interest,则将新收到的 SignatureNonce 添加到 SignatureNonce 列表中。
SignatureNonce 列表的大小和接收方记住的每个 SignatureNonce 的生命周期取决于应用协议的需要。
- 如果 SignatureSeqNum(s) 存在:
查找与同一密钥一起使用的最后记录的 SignatureSeqNum(s0)。如果 s0 >= s,则认为该 Interest 包无效。如果没有先前的记录,请对照应用程序的策略进行检查。如果不符合应用程序的策略,则将 Signed Interest 视为无效。如果 Signed Interest 已根据此规则和所有其他规则进行验证,则将 s0 设置为 s。
接收到的第一个 SignatureSeqNum 只有在满足应用程序的策略时才被认为是有效的。例如,应用程序可以决定第一个 SeqNum 只能是像 0 或 1 这样的最小值,或者是发送方和接收方都同意的值。