#安全 #snmp #snmpv3 #usm

snmp_usm

实现简单网络管理协议(SNMP)版本3的用户安全模型(USM)

3个不稳定版本

0.2.1 2023年3月16日
0.2.0 2020年8月27日
0.1.0 2020年7月19日

5#snmp 中排名

Download history 66/week @ 2024-03-24 130/week @ 2024-03-31 69/week @ 2024-04-07 53/week @ 2024-04-14 116/week @ 2024-04-21 346/week @ 2024-04-28 123/week @ 2024-05-05 111/week @ 2024-05-12 208/week @ 2024-05-19 61/week @ 2024-05-26 117/week @ 2024-06-02 61/week @ 2024-06-09 35/week @ 2024-06-16 101/week @ 2024-06-23 48/week @ 2024-06-30 141/week @ 2024-07-07

每月下载量:334
用于 msnmp

MIT/Apache

52KB
785

实现SNMPv3的用户安全模型(USM)

SNMP USM根据RFC 3414和RFC 3826提供SNMP消息级安全。它实现了可以被安全子系统使用的原语。

USM实现的功能

  • HMAC-MD5-96认证协议
  • HMAC-SHA-96认证协议
  • 时效性验证
  • DES加密
  • AES加密

许可

许可协议为以下之一

任选其一。

贡献

除非你明确声明,否则根据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