3个不稳定版本
0.2.1 | 2023年3月16日 |
---|---|
0.2.0 | 2020年8月27日 |
0.1.0 | 2020年7月19日 |
5 在 #snmp 中排名
每月下载量:334
用于 msnmp
52KB
785 行
实现SNMPv3的用户安全模型(USM)
SNMP USM根据RFC 3414和RFC 3826提供SNMP消息级安全。它实现了可以被安全子系统使用的原语。
USM实现的功能
- HMAC-MD5-96认证协议
- HMAC-SHA-96认证协议
- 时效性验证
- DES加密
- AES加密
许可
许可协议为以下之一
- Apache License,版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则根据Apache-2.0许可协议定义的,任何有意提交以包含在作品中的贡献,将根据上述协议双重许可,不附加任何额外条款或条件。
lib.rs
:
实现SNMPv3的用户安全模型(USM)
SNMP USM根据RFC 3414和RFC 3826提供SNMP消息级安全。它实现了可以被安全子系统使用的原语。
USM实现的功能
- HMAC-MD5-96认证协议
- HMAC-SHA-96认证协议
- 时效性验证
- DES加密
- AES加密
认证和时间同步
当使用认证与隐私时,隐私密钥必须使用与认证密钥相同的消息摘要算法。例如,如果使用MD5消息摘要算法的AuthKey构造,那么PrivKey必须使用具有MD5消息摘要算法的LocalizedKey构造。
认证和时间同步
如果需要认证通信,那么发现过程也应该与权威SNMP引擎建立时间同步。这可以通过发送一个具有msgAuthoritativeEngineID设置为之前学习的snmpEngineID,msgAuthoritativeEngineBoots和msgAuthoritativeEngineTime设置为零的认证请求消息来完成。
示例
使用一个虚构的消息处理子系统来澄清示例。
use snmp_usm::{
Aes128PrivKey, AuthKey, LocalizedMd5Key, PrivKey, SecurityParams, WithLocalizedKey
};
// The password and engine ID are supplied by the security subsystem.
let localized_key = LocalizedMd5Key::new(&passwd, &engine_id);
let priv_key = Aes128PrivKey::with_localized_key(localized_key.clone());
// The security parameters are constructed from the local authoritative engine data.
let (encrypted_scoped_pdu, salt) = priv_key.encrypt(scoped_pdu, &security_params, 0);
// The message processing service would set the encrypted scoped PDU for the outgoing message.
// out_msg.set_encrypted_scoped_pdu(encrypted_scoped_pdu);
security_params
.set_username(b"username")
.set_priv_params(&salt)
.set_auth_params_placeholder();
let encoded_security_params = security_params.encode();
// The message processing service would set the security parameters of the outgoing message and
// encode it.
// out_msg.set_security_params(&encoded_security_params);
// let out_msg = out_msg.encode();
let auth_key = AuthKey::new(localized_key);
// Authenticate the outgoing message.
auth_key.auth_out_msg(&mut out_msg)?;
// Authenticate an incoming message.
auth_key.auth_in_msg(&mut in_msg, local_engine_id, local_engine_boots, local_engine_time)?;
依赖
~1.5MB
~26K SLoC