SNMPv3认证和加密过程
前面的一些文章详细讲解了SNMPv3的报文内容,下面主要的内容就是SNMPv3的加密和认证过程!
USM的定义为实现以下功能:
鉴别
数据加密
密钥管理
时钟同步化
避免延时和重播攻击
1、UsmSecurityParameters(安全参数)
安全参数存在于snmp消息中的msgSecurityParameters字段,以ASN.1语法定义如下:
UsmSecurityParameters ::=
SEQUENCE {
-- global User-based security parameters
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
-- authentication protocol specific parameters
msgAuthenticationParameters OCTET STRING,
-- privacy protocol specific parameters
msgPrivacyParameters OCTET STRING
}
msgAuthoritativeEngineID 权威引擎id。请求及inform消息中此值为接收方引擎id。Trap及应答消息中此值为发送方引擎id
msgAuthoritativeEngineBoots 权威引擎已重启次数
msgAuthoritativeEngineTime 权威引擎发送此消息时的时间
msgUserName 用户名
msgAuthenticationParameters 消息鉴别代码
msgPrivacyParameters 用于解密的salt值
2、鉴别和加密的实现
2.1 鉴别
使用MD5或SHA-1作为内嵌安全散列函数,通过HMAC进行鉴别。
从用户口令到鉴别密钥产生方法:
假设用户口令为password,不断重复串接password必要多的次数达到1048576字节长度。然后通过MD5或SHA-1散列函数得到一个16字节或20字节的密钥。
鉴别过程:
发送消息时用鉴别密钥产生一个消息鉴别代码,并将其填入msgAuthenticationParameters字段。收到一个消息时用发送此消息的用户对应的鉴别密钥对消息产生一个消息鉴别代码,与msgAuthenticationParameters字段中的值进行比较,若相等则认为通过鉴别。
2.2 加密解密
用和产生鉴别密钥相同的方法从用户口令生成加密密钥。
加密过程:
用16字节的加密密钥的最后8位用作预IV,该引擎的snmpEngineBoots 的当前值(4个字节)和由本地维护的一个4字节整数串连构成一个salt值。由本地维护的这个4字节整数在每次发送消息时应采用不同的值。Salt值和预IV按位异或生成IV,加密密钥和IV通过DES的CBC加密算法对ScopedPduData字段数据进行加密。并将salt值放入msgPrivacyParameters字段。
解密过程:
从收到的消息中取出msgPrivacyParameters字段内的salt值。用本地维护的16字节的密钥的最后8位用作预IV,将salt值与预IV按位异或生成IV用密钥和IV对已加密的数据进行解密。