HMAC 挑戰/響應雙向認證
HMAC結合“挑戰/響應”保障資料傳輸安全
1、流程圖:
HMAC的一個典型應用是結合“挑戰/響應”(Challenge/Response)來保障客戶端和伺服器傳輸資料的安全性 。
2、安全性分析:
使用的金鑰是雙方事先約定的,第三方不可能知道。從整個流程可看出,攻擊者只能截獲作為“挑戰”的隨機數和作為“響應”的
3、HMAC Python例項:
3.1、原始碼:
客戶端程式碼:
#coding:utf-8, #!/usr/bin/env python #說明:使用者向伺服器發起RPC請求,用於更新使用者名稱字、地址等資訊。 import xmlrpclib,hmac,hashlib key = "d5ea6c5905746ebb826a9c8ad31db1be" #金鑰 name = "Andy" address = "WaltStreet";
server = xmlrpclib.ServerProxy(“http://10.80.21.34:8888”)
challenge = server.getChallenge(); #向伺服器獲取“挑戰”碼
message = name + address + challenge; #組合明文訊息和“挑戰”碼
signature = hmac.new(key,message).hexdigest() #獲取明文訊息摘要
print server.updateMsg(signature,name,address) #
服務端程式碼:
#coding:utf-8, #!/usr/bin/env python #說明:伺服器驗證來客戶端的請求是否合法,以及對請求進行處理。 import SimpleXMLRPCServer,hmac,hashlib,random key = "d5ea6c5905746ebb826a9c8ad31db1be" #金鑰,實際應用中可以從資料庫中獲取
class MyClass:
challenge = ‘’;
def getChallenge(self): #生成32位的隨機數“挑戰”碼
self.challenge = “”.join([random.choice(“0123456789abcdefghjijklmnopqrstuvwxyz”) for i in range(0,32)])
return self.challenge;
def updateMsg(self, signature, name , address): #請求處理
message = name + address + self.challenge; #組合明文訊息和“挑戰”碼
if hmac.new(key,message).hexdigest() != signature: #對比兩者是否一致
return “Authen Failed! Forbidden !”
else:
return ‘Update success!’
server_object = MyClass()
server = SimpleXMLRPCServer.SimpleXMLRPCServer((“0.0.0.0”, 8888))
server.register_instance(server_object) #註冊RPC服務
print “Listening on port 8888”
server.serve_forever()
3.2、過程分析:
(1)、在伺服器端啟動監聽:
(2)、執行客戶端程式碼,wireshark抓包如下:
(3)、伺服器返回認證通過:
(4)、修改程式碼使得客戶端和伺服器金鑰不一致,則認證失敗。
分類: 安全知識庫 好文要頂 關注我 收藏該文 Fish_Ou關注 - 0
粉絲 - 29 +加關注 0 0 « 上一篇: Smart config風險分析與對策
» 下一篇: 橢圓曲線加密演算法(ECC)原理和C++實現原始碼(摘錄)
<div class="postDesc">posted on <span id="post-date">2015-01-06 20:57</span> <a href="https://www.cnblogs.com/fishou/">Fish_Ou</a> 閱讀(<span id="post_view_count">584</span>) 評論(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=4206980" rel="nofollow">編輯</a> <a onclick="AddToWz(4206980);return false;" href="#">收藏</a></div>