1. 程式人生 > >HMAC 挑戰/響應雙向認證

HMAC 挑戰/響應雙向認證

HMAC結合“挑戰/響應”保障資料傳輸安全

1、流程圖:

         HMAC的一個典型應用是結合“挑戰/響應”(Challenge/Response)來保障客戶端和伺服器傳輸資料的安全性 。

image

2、安全性分析:

         使用的金鑰是雙方事先約定的,第三方不可能知道。從整個流程可看出,攻擊者只能截獲作為“挑戰”的隨機數和作為“響應”的

HMAC結果,無法根據這兩個資料推算出金鑰。由於不知道金鑰,所以攻擊者無法偽造出正確的響應。同時,由於每次請求獲得的“挑戰”隨機數都不一樣,攻擊者也無法對請求進行重放攻擊。

3HMAC 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)、在伺服器端啟動監聽:

clip_image002

2)、執行客戶端程式碼,wireshark抓包如下:

clip_image004

3)、伺服器返回認證通過:

clip_image006

clip_image008

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>