命名数据网络 | 签名(Signature)
命名数据网络 | 签名(Signature)
- 命名数据网络 | 签名(Signature)
- 数据包中的签名
- 兴趣包中的签名(InterestSignature)
- 签名中的元素
- SignatureType
- KeyLocator
- SignatureNonce
- SignatureTime
- SignatureSeqNum
- 不同类型的签名
- DigestSha256
- SignatureSha256WithRsa
- SignatureSha256WithEcdsa
- SignatureHmacWithSha256
- SignatureEd25519
命名数据网络 | 签名(Signature)
数据包中的签名
NDN 数据包签名(即数据包最后的 DataSignature 元素)定义为两个连续的 TLV 元素:SignatureInfo 和 SignatureValue。
DataSignature = SignatureInfo SignatureValueSignatureInfo = SIGNATURE-INFO-TYPE TLV-LENGTHSignatureType[KeyLocator]SignatureValue = SIGNATURE-VALUE-TYPE TLV-LENGTH *OCTET
SignatureInfo 元素完整地描述了所使用的数字签名算法以及用于定位其父证书(如 KeyLocator)的任何其他相关信息。
SignatureValue 元素保存签名的实际位。该元素的 TLV-VALUE 的确切编码取决于具体的签名类型。具体请参见 不同类型的签名。
SignatureValue 中包含的加密签名涵盖了数据包中的所有 TLV 元素,从 Name 开始,直到 SignatureValue,但不包括 SignatureValue。这些 TLV 元素在此被称为数据包的“签名部分”。
兴趣包中的签名(InterestSignature)
NDN 兴趣报文签名定义为两个连续的 TLV 元素:InterestSignatureInfo 和 InterestSignatureValue。
InterestSignature = InterestSignatureInfo InterestSignatureValueInterestSignatureInfo = INTEREST-SIGNATURE-INFO-TYPE TLV-LENGTHSignatureType[KeyLocator][SignatureNonce][SignatureTime][SignatureSeqNum]InterestSignatureValue = INTEREST-SIGNATURE-VALUE-TYPE TLV-LENGTH *OCTET
InterestSignatureInfo 元素完整地描述了所使用的数字签名算法以及用于定位其父证书(如 KeyLocator)的任何其他相关信息。为了确保带签名的 Interest 包的唯一性并减轻潜在的重放攻击(replay attack),InterestSignatureInfo 元素应该至少包括以下元素之一:SignatureNonce、SignatureTime、SignatureSeqNum。
InterestSignatureValue 元素保存签名的实际位。该元素的 TLV-VALUE 的确切编码取决于具体的签名类型。具体请参见 不同类型的签名。
包含在 InterestSignatureValue 中的加密签名涵盖了 Interest 包的 Name 元素中所有的 NameComponent 元素,但不包括 ParametersSha256DigestComponent,以及从 ApplicationParameters 开始的完整 TLV 元素,但不包括 InterestSignatureValue。这些 TLV 元素在此被称为 Interest 包的“签名部分”。
签名中的元素
SignatureType
SignatureType = SIGNATURE-TYPE-TYPE TLV-LENGTH NonNegativeInteger
NDN 规范定义了 SignatureType 的以下值:
Value | Reference | Description |
---|---|---|
0 | DigestSha256 | 使用 SHA-256 摘要的完整性保护 |
1 | SignatureSha256WithRsa | 在 SHA-256 摘要上使用 RSA 签名的完整性和来源保护 |
3 | SignatureSha256WithEcdsa | 在 SHA-256 摘要上使用 ECDSA 签名的完整性和来源保护 |
4 | SignatureHmacWithSha256 | 使用基于 SHA-256 哈希的消息身份验证代码的完整性和来源保护 |
5 | SignatureEd25519 | 使用 Ed25519 签名的完整性和来源保护 |
2、6-200 | 留作日后使用 | |
>200 | 未赋值的 |
KeyLocator
KeyLocator 指定指向包含证书或公钥的另一个数据包的 Name,或者指定标识特定信任模型中的公钥的 KeyDigest。
注意,虽然 KeyLocator 在 SignatureInfo 和 InterestSignatureInfo 中被定义为可选字段,但是特定的签名类型可能需要它的存在或不存在。
KeyLocator = KEY-LOCATOR-TYPE TLV-LENGTH (Name / KeyDigest)KeyDigest = KEY-DIGEST-TYPE TLV-LENGTH *OCTET
有关 Name 元素的定义,请参阅 Name。
在 KeyLocator 字段中正确使用 Name 和 KeyDigest 选项的具体定义不在本规范的范围之内。一般情况下,Name 为包含相应 证书 的数据包命名。但是,该名称是数据包的全称还是可以匹配多个数据包的前缀,由具体的信任模型来定义。例如,分层信任模型 使用后一种方法,要求客户端获取 KeyLocator 所指向的数据包的最新版本(公钥证书的最新版本),以确保公钥尚未被撤销。
SignatureNonce
SignatureNonce = SIGNATURE-NONCE-TYPE TLV-LENGTH 1*OCTET
SignatureNonce 元素增加了额外的保证,确保签名是唯一的。
SignatureNonce 元素的推荐最小长度为 8 个字节。
SignatureTime
SignatureTime = SIGNATURE-TIME-TYPE TLV-LENGTH NonNegativeInteger
SignatureTime 元素的值是签名的时间戳,表示自1970-01-01T00:00:00Z (Unix 时代)以来的毫秒数。此元素可用于指示在特定时间点对数据包进行了签名。
SignatureSeqNum
SignatureSeqNum = SIGNATURE-SEQ-NUM-TYPE TLV-LENGTH NonNegativeInteger
SignatureSeqNum 元素为签名的唯一性增加了额外的保证。
SignatureSeqNum 可以用来防止重放攻击(replay attack)。
不同类型的签名
每种签名类型对其 SignatureInfo 和 InterestSignatureInfo 元素的格式有不同的要求。在以下各节中,这些要求是在两个方面指定的:
- SignatureType 的 TLV-VALUE
- 是否需要/禁止 KeyLocator
DigestSha256
DigestSha256 不提供有关数据包来源的信息,也不保证数据包来自原始来源。此签名类型仅用于调试目的,并且仅在传输过程中需要防止意外修改的有限情况下使用。
DigestSha256 被定义为 Interest 包或数据包的“签名部分”的 SHA-256 哈希:
- SignatureType 的 TLV-VALUE 为 0。
- 禁止 KeyLocator。如果存在,则必须忽略它。
SignatureValue = SIGNATURE-VALUE-TYPETLV-LENGTH ; == 3232OCTET ; == SHA-256{Data signed portion}InterestSignatureValue = INTEREST-SIGNATURE-VALUE-TYPETLV-LENGTH ; == 3232OCTET ; == SHA-256{Interest signed portion}
SignatureSha256WithRsa
SignatureSha256WithRsa 定义了一个 RSA 公钥签名,该签名是根据 Interest 包或数据包的“签名部分”的 SHA-256 哈希计算的。它使用 RFC 8017, Section 8.2 定义的 RSASSA-PKCS1-v1_5 签名方案。
- SignatureType 的 TLV-VALUE 为 1。
- KeyLocator 是必需的。
SignatureValue = SIGNATURE-VALUE-TYPETLV-LENGTH1*OCTET ; == RSA over SHA-256{Data signed portion}InterestSignatureValue = INTEREST-SIGNATURE-VALUE-TYPETLV-LENGTH1*OCTET ; == RSA over SHA-256{Interest signed portion}
这些元素的 TLV-LENGTH 取决于用于签名的私钥的长度(例如,2048 位密钥为 256 字节)。
如果经过验证,这种类型的签名提供了非常强有力的保证,即数据包是由声称的生产者创建的(身份验证/来源),并且在传输过程中没有被篡改(完整性)。
KeyLocator 中的 KeyDigest 选项定义为 RFC 3279 定义的 RSA 密钥的 SubjectPublicKeyInfo 的 DER 编码上的 SHA-256 摘要。
应用程序有责任定义有关何时授权特定发行者(KeyLocator)签署特定数据包的规则(信任模型)。虽然信任模型不在本规范的范围之内,但通常情况下,信任模型需要在密钥名和数据包名之间指定授权规则,并明确定义信任锚。例如,应用程序可以选择使用 分层信任模型 来确保数据完整性和来源。
SignatureSha256WithEcdsa
SignatureSha256WithEcdsa 定义了一个 ECDSA 公钥签名,该签名是根据 Interest 包或数据包的“签名部分”的 SHA-256 哈希计算的。该签名算法在 RFC 5753, Section 2.1 中定义。所有 NDN 实现都必须支持该签名类型和 NIST P-256 曲线。
- SignatureType 的 TLV-VALUE 为 3。
- KeyLocator 是必需的。
SignatureValue = SIGNATURE-VALUE-TYPETLV-LENGTH1*OCTET ; == ECDSA over SHA-256{Data signed portion}InterestSignatureValue = INTEREST-SIGNATURE-VALUE-TYPETLV-LENGTH1*OCTET ; == ECDSA over SHA-256{Interest signed portion}
这些元素的 TLV-LENGTH 取决于用于签名的特定椭圆曲线(例如,NIST P-256 曲线最多为 72 字节)。
如果经过验证,这种类型的签名提供了非常强有力的保证,即数据包是由声称的生产者创建的(身份验证/来源),并且在传输过程中没有被篡改(完整性)。KeyLocator 中的 KeyDigest 选项被定义为 RFC 5480 定义的 EC 密钥的 SubjectPublicKeyInfo 的 DER 编码的 SHA-256 摘要。
SignatureSha256WithEcdsa 的 SignatureValue 值是一个 DER 编码的 Ecdsa-Sig-Value 结构,在 RFC 3279, Section 2.2.3 中定义。
SignatureHmacWithSha256
SignatureHmacWithSha256 定义了一个基于哈希的消息身份验证码(HMAC),使用 SHA-256 作为哈希函数,使用共享密钥进行加密,计算 Interest 包或数据包的“签名部分”。该签名算法在 RFC 2104, Section 2 中定义。
注意,正如 RFC 2104, Section 3 所述,强烈建议使用短于 SHA-256 输出长度(32 字节)的共享密钥。
- SignatureType 的 TLV-VALUE 为 4
- KeyLocator 是必需的
SignatureValue = SIGNATURE-VALUE-TYPETLV-LENGTH ; == 3232OCTET ; == HMAC-SHA-256{Data signed portion}InterestSignatureValue = INTEREST-SIGNATURE-VALUE-TYPETLV-LENGTH ; == 3232OCTET ; == HMAC-SHA-256{Interest signed portion}
如果签名经过验证,这种类型的签名可以确保数据包的真实性,即它是由拥有共享密钥的一方签名的,并且在传输过程中没有被更改(完整性)。用于生成 HMAC 签名的共享密钥可以通过 KeyLocator 元素来识别,例如,根据应用程序的命名约定使用 Name。将共享密钥与持有共享密钥的各方的身份相关联是应用程序的责任。
注意,共享密钥不包含在签名中,也不能包含在数据包中的任何地方,因为这会使 HMAC 的安全属性失效。
SignatureEd25519
SignatureEd25519 定义了一个 Ed25519 公钥签名,该签名在 Interest 包或数据包的“签名部分”上进行计算。该签名算法在 RFC 8032, Section 5.1 中定义。
- SignatureType 的 TLV-VALUE 为 5
- KeyLocator 是必需的
SignatureValue = SIGNATURE-VALUE-TYPETLV-LENGTH64OCTET ; == Ed25519{Data signed portion}InterestSignatureValue = INTEREST-SIGNATURE-VALUE-TYPETLV-LENGTH64OCTET ; == Ed25519{Interest signed portion}
如果经过验证,这种类型的签名提供了非常强有力的保证,即数据包是由声称的生产者创建的(身份验证/来源),并且在传输过程中没有被篡改(完整性)。KeyLocator 中的 KeyDigest 选项定义为 RFC 8410, Section 4 定义的 Ed25519 密钥的 SubjectPublicKeyInfo 的 DER 编码上的 SHA-256 摘要。