跳到主要内容

7. HMAC-SHA-96 Authentication Protocol (HMAC-SHA-96 认证协议)

7. HMAC-SHA-96 Authentication Protocol (HMAC-SHA-96 认证协议)

本节描述 HMAC-SHA-96 认证协议。此协议使用 SHA-NIST 中描述的 SHA 哈希函数, 以 RFC 2104 中描述的 HMAC 模式运行, 将输出截断为 96 位。

此协议由 usmHMACSHAAuthProtocol 标识。

随着时间的推移, 可能会定义其他认证协议, 作为此协议的替代或补充。

7.1. Mechanisms (机制)

HMAC-SHA-96 认证协议提供以下机制:

Data Integrity Support (数据完整性支持)

为了支持数据完整性, 需要消息摘要算法。在 SNMP 消息的适当部分上计算摘要, 并将其作为发送给接收者的消息的一部分包含进去。

Data Origin Authentication (数据源认证)

为了支持数据源认证和数据完整性, 在计算摘要之前将秘密值前置到 SNMP 消息; 然后在传输之前将计算的摘要部分插入到消息中。不传输前置的秘密。秘密值由所有被授权代表相应用户发起消息的 SNMP 引擎共享。

7.1.1. Digest Authentication Mechanism (摘要认证机制)

本备忘录中定义的摘要认证机制提供:

Integrity Verification (完整性验证)

验证接收消息的完整性, 即接收的消息就是发送的消息。

通过在消息的适当部分上计算摘要来保护消息的完整性。摘要由消息的发起者计算, 与消息一起传输, 并由消息的接收者验证。

User Verification (用户验证)

验证代表其生成消息的用户。

只有被授权代表用户生成消息的 SNMP 引擎知道的秘密值以 HMAC 模式使用 (参见 RFC 2104)。它还建议将用作消息认证码的哈希函数输出截断。

7.1.2. Algorithm Details (算法详细信息)

此机制使用 SHA (SHA-NIST) 消息摘要算法:

  • 以特殊 (HMAC) 方式在 SNMP 消息的指定部分上计算 160 位 SHA 摘要
  • 此摘要的前 96 位作为发送给接收者的消息的一部分包含进去
  • 消息中携带的摘要大小为 12 字节
  • 私有认证密钥 (秘密) 的大小为 20 字节

详细信息请参见第 7.3 节。

7.2. Elements of the HMAC-SHA-96 Authentication Protocol (HMAC-SHA-96 认证协议的要素)

本节包含实现本备忘录此节中定义的认证模块所需的定义。

7.2.1. Users (用户)

使用此认证协议的认证利用一组已定义的 userName。对于在特定 SNMP 引擎上代表其进行消息认证的任何用户, 该 SNMP 引擎必须了解该用户。希望与另一个 SNMP 引擎通信的 SNMP 引擎还必须了解该引擎已知的用户, 包括了解该用户的适用属性。

用户及其属性定义如下:

<userName> (用户名)

表示用户名称的字符串。

<authKey> (认证密钥)

计算摘要时要使用的用户秘密密钥。对于 SHA, 它必须为 20 字节长

7.2.2. msgAuthoritativeEngineID (权威引擎 ID)

已认证消息中包含的 msgAuthoritativeEngineID 值指定该特定消息的权威 SNMP 引擎 (请参阅 SNMP 架构文档 RFC 3411 中 SnmpEngineID 的定义)。

用户的 (私有) 认证密钥在每个权威 SNMP 引擎上通常是不同的, 因此 snmpEngineID 用于为认证过程选择正确的密钥。

7.2.3. SNMP Messages Using this Authentication Protocol (使用此认证协议的 SNMP 消息)

使用此认证协议的消息携带 msgAuthenticationParameters 字段作为 msgSecurityParameters 的一部分。

对于此协议, msgAuthenticationParameters 字段是表示在 wholeMsg 上完成的 HMAC-SHA-96 输出的前 12 字节的序列化 OCTET STRING。

摘要是在 wholeMsg 上计算的, 因此如果消息经过认证, 这也意味着消息中的所有字段都是完整的并且没有被篡改。

7.2.4. Services Provided by the HMAC-SHA-96 Authentication Module (HMAC-SHA-96 认证模块提供的服务)

本节描述当基于用户的安全模块调用 HMAC-SHA-96 认证模块请求服务时, HMAC-SHA-96 认证模块期望的输入和产生的输出。

7.2.4.1. Services for Generating an Outgoing SNMP Message (生成出站 SNMP 消息的服务)

HMAC-SHA-96 认证协议假定 authKey 的选择由调用者完成, 并且调用者传递要使用的秘密密钥。

完成后, 认证模块返回 statusInformation, 如果消息摘要计算正确, 则返回在适当位置插入摘要的 wholeMsg。

抽象服务原语为:

statusInformation =              -- 成功或失败
authenticateOutgoingMsg(
IN authKey -- 用于认证的秘密密钥
IN wholeMsg -- 未认证的完整消息
OUT authenticatedWholeMsg -- 完整的已认证消息
)

参数 (Parameters):

  • statusInformation: 指示认证过程是否成功。如果不成功, 则指示问题所在。

  • authKey: 认证算法要使用的秘密密钥。此密钥的长度必须为 20 字节。

  • wholeMsg: 要认证的消息。

  • authenticatedWholeMsg: 输出的已认证消息。

7.2.4.2. Services for Processing an Incoming SNMP Message (处理传入 SNMP 消息的服务)

HMAC-SHA-96 认证协议假定 authKey 的选择由调用者完成, 并且调用者传递要使用的秘密密钥。

完成后, 认证模块返回 statusInformation 以指示消息是否真实。

抽象服务原语为:

statusInformation =              -- 成功或失败
authenticateIncomingMsg(
IN authKey -- 用于认证的秘密密钥
IN authParameters -- 从网络接收的
IN wholeMsg -- 从网络接收的
OUT authenticatedWholeMsg -- 已检查认证
)

参数 (Parameters):

  • statusInformation: 指示认证过程是否成功。如果不成功, 则指示问题所在。

  • authKey: 认证算法要使用的秘密密钥。此密钥的长度必须为 20 字节。

  • authParameters: 来自传入消息的 msgAuthenticationParameters。

  • wholeMsg: 要认证的消息。

  • authenticatedWholeMsg: 输出的已认证消息。

7.3. Elements of Procedure (过程要素)

本节描述 HMAC-SHA-96 认证协议的过程。

7.3.1. Processing an Outgoing Message (处理出站消息)

本节描述 SNMP 引擎在代表具有指定使用认证的 securityLevel 的用户生成包含管理信息的消息时所遵循的过程。

步骤 1: 设置 msgAuthenticationParameters

msgAuthenticationParameters 字段设置为根据 RFC 3417 中的规则序列化的包含 12 个零字节的 OCTET STRING。

步骤 2: 计算 MAC

使用用户的秘密 authKey 和 msgAuthenticationParameters 设置为 12 个零字节的消息, 根据 HMAC-SHA 算法计算 MAC (消息认证码):

MAC = HMAC-SHA(authKey, wholeMsg)

其中:

  • authKey 是 20 字节秘密密钥
  • wholeMsg 是 msgAuthenticationParameters 设置为 12 个零字节的整个消息

步骤 3: 截断并插入 MAC

取 20 字节 MAC 值的前 12 个字节并将它们放入 msgAuthenticationParameters 字段。

步骤 4: 返回结果

将 authenticatedWholeMsg 返回给调用模块。

7.3.2. Processing an Incoming Message (处理传入消息)

本节描述 SNMP 引擎在处理具有指定已使用认证的 securityLevel 的包含管理信息的消息时所遵循的过程。

步骤 1: 提取参数

从传入消息中提取 msgAuthenticationParameters 并保存它。

步骤 2: 将 msgAuthenticationParameters 设置为零

用 12 个零字节的 OCTET STRING 替换消息中的 msgAuthenticationParameters 字段。

步骤 3: 计算预期 MAC

使用用户的秘密 authKey 和 msgAuthenticationParameters 设置为 12 个零字节的消息, 计算预期 MAC:

expectedMAC = HMAC-SHA(authKey, wholeMsg)

步骤 4: 截断预期 MAC

取 20 字节 expectedMAC 值的前 12 个字节。

步骤 5: 比较 MAC

将提取的 msgAuthenticationParameters (来自步骤 1) 与计算的 12 字节 MAC (来自步骤 4) 进行比较。

如果它们相等, 则消息已认证。如果它们不相等, 则消息不真实, 应该丢弃。

步骤 6: 返回结果

返回指示成功或失败的 statusInformation。

Implementation Notes (实现注意事项)

  1. 密钥长度 (Key Length): authKey 对于 HMAC-SHA-96 必须正好为 20 字节

  2. MAC 截断 (MAC Truncation): 仅使用 160 位 SHA 输出的前 96 位 (12 字节)

  3. 恒定时间比较 (Constant-Time Comparison): 比较 MAC 时, 实现应使用恒定时间比较以避免时序攻击

  4. HMAC 模式 (HMAC Mode): 协议使用 RFC 2104 中指定的 HMAC 模式, 而不是普通 SHA

Security Considerations (安全考虑)

  • SHA 强度 (SHA Strength): SHA-1 提供比 MD5 更强的加密安全性。建议使用 HMAC-SHA-96 而不是 HMAC-MD5-96 以获得更好的安全性

  • 密钥管理 (Key Management): 20 字节 authKey 必须保密并妥善管理

  • 截断 (Truncation): 将 MAC 从 160 位截断为 96 位会略微降低安全性, 但对于 SNMP 应用被认为是可以接受的

  • 算法选择 (Algorithm Selection): 对于新部署, 如果可用, 请考虑使用基于 SHA-2 或 SHA-3 的 HMAC 变体