跳到主要内容

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 变体