snmp v3 版本是一種安全的協議,支援認證和加密過程,前面實現了 v1、v2 版本獲取路由器 arp 表的過程,這裡繼續完善一下 v3 版本的支援。v3 版本的特點是,增加了帳號密碼認證和加密傳輸,所以需要安全方面的配置資訊,詳情如下。
根據 snmpwalk 命令的幫助文件可知,v3 版本的協議引數選項有:
a) –l level 指定安全級別:noauthnopriv|authnopriv|authpriv
b) –u user-name 安全名字
c) –a protocol 驗證協議:md5|sha。如果 -l 指定為 authnopriv 或 authpriv 時才需要。
d) –a passphrase 驗證字串。如果-l指定為 authnopriv 或 authpriv 時才需要。
e) –x protocol 加密協議:des|aes。如果 -l 指定為 authpriv 時才需要。
f) -x passphrase 加密字串:如果-l指定為 authpriv 時才需要。
第乙個選項,安全級別型別,其區別為:
noauthnopriv:不認證、不加密,等價於 v1、v2 版本;所以不建議開啟
authnopriv:認證不加密,只對帳號密碼進行校驗,資料傳輸不加密
authpriv:既認證又加密,校驗帳號密碼,同時加密傳輸
曾研究過瀏覽器實現 https 協議的過程,所以很容易理解 v3 版本中的安全配置選項。在需要管理的裝置上配置 snmp v3 服務時,需設定這些安全配置資訊,包括帳號、密碼、認證方式、加密演算法、加密金鑰,然後將這些資訊告知 snmp 服務角色,雙方基於此前提進行 snmp 通訊。
先看看 -a 選項,它是指驗證協議,演算法有 md5 和 sha 。
md5 是指 message digest ,sha 是 security hash ,它們都屬於摘要演算法,即:不限制輸入的明文長度,而生成固定長度的摘要,且不可逆。摘要演算法常用來做數字簽名的,在 v3 協議中,用來做密碼認證。
原理為,snmp 服務端和**端都知道乙個帳號和密碼,然後通訊時,服務端傳送 v3 請求並用 md5 或 sha 摘要演算法生成密碼摘要傳送,snmp **端用同樣的摘要演算法生成密碼的摘要資訊,與接收到的摘要比對,一致,則通過認證。
-x 選項,加密演算法有兩種,aes(advanced encrypt stnadard) 和 des ( data encryption standard ),它們都是對稱加密演算法,通訊雙方約定相同的金鑰後,就能進行加密和解密了。
snmp4j 工具包的官方文件中給出了snmp
類實現 v3 版本的示意**,與 v2 版本不同的是,它使用的atarget
的實現是usertarget
類,並設定安全等級。
第一步,先建立 target。
usertarget target = new usertarget();
target.setversion(snmpconstants.version3);
target.setaddress(new udpaddress(snmpinfo.getip()+"/"+snmpinfo.getport()));
switch (snmpinfo.getlevel())
target.settimeout(3000); //3s
target.setretries(2);
第二步,建立snmp
物件:
transport.listen();
snmp manager = new snmp(transport);
經過測試,只支援 udp 協議,tcp 協議貌似不支援。
第三步,新增認證使用者資訊:
//獲取摘要演算法對應的 oid 物件
oid authprotocol = null;
string signaturetype = snmpinfo.getauthprotocol();
if(signaturetype.equals(signature_md5)) else if(signaturetype.equals(signature_sha))
//獲取加密演算法對應的 oid 物件
oid encryptprotocol = null;
string encrypttype = snmpinfo.getencrypttype();
if(encrypttype.equals(encrypt_des)) else
}//建立使用者安全模型物件
usm usm = new usm(securityprotocols.getinstance(),
new octetstring(mpv3.createlocalengineid()), 0);
securitymodels.getinstance().addsecuritymodel(usm);
//新增使用者配置資訊
usm.adduser(new octetstring(snmpinfo.getaccount()),
new usmuser(new octetstring(snmpinfo.getaccount()), authprotocol,
new octetstring(snmpinfo.getpassword()), encryptprotocol,
new octetstring(snmpinfo.getprivatekey())));
snmpinfo
是乙個儲存了 v3 配置資訊的實體,類的屬性有:
ip:snmp 管理裝置 ip
port:通訊埠,預設 161
level:安全等級
account:帳號
password:口令
authprotocol:摘要演算法
encrypttype:加密演算法
privatekey:加密金鑰
前面三部分合起來,就是乙個完整的基於 snmp4j 工具包提供的 v3 版本的例子了。開始對官方給出的例子不是很明白,因為只是**片段,也沒有完整的引數說明,官網文件開著三天,因為沒搞明白,沒敢關。
轉機發生在分析過 v3 協議的配置資訊後,再對比 demo ,突然就知道了 v3 版本的配置資訊對應什麼引數了,這可能就是傳說中的頓悟吧,就這樣解決了 snmp 版本的支援!
謹以此文,記錄此過程。
區塊鏈V3版本實現思路
當前版本問題 區塊在記憶體中,每次執行完程式就釋放,無法重用 建立區塊不靈活,在main中寫死,無法隨意新增區塊 v3版本思路 bolt資料庫介紹 輕量級 開源 go語言實現 key value進行讀取 map byte byte blockchain結構重寫 newblockchain函式重寫 由...
區塊鏈V3版本實現之六
命令列demo 1 package main23 import 4 fmt 5 os 6 78func main 16 顯示效果 使用命令列分析 所有的支配動作交給命令列來做 主函式只需要呼叫命令列結構即可 根據輸入的不同命令,命令列做相應動作 a addblock b printchain cli...
區塊鏈V3版本實現之四
部分 blockchain.go檔案中改寫addblock函式 1 v3版本 2 func bc blockchain addblock data string 12 block newblock data,bc.tail 13 b.put block.hash,block.serialize 將區...