Kong的插件: hmac

hmac簡述

hmac是Hashing for Message Authentication的簡寫,可以用來保證數據的完整,客戶端把內容通過散列/哈希算法算出一個摘要,並把算法和內容以及摘要傳送給服務端,服務端按照這個算法也算一遍,和摘要比一下如果一樣就認爲內容是完整的,如果不一樣就認爲內容被篡改了。

關於Kong的hmac說幾點

  • Clock Skew
    使用Kong的hmac後,請求必須帶有Date和x-date請求頭,這個是防止重放攻擊(Replay Attacks),默認的情況下,客戶端傳過來的時間和服務端的時間相差300s,Kong就認爲這個請求是有問題的。這個值可以修改的,通過修改config.clock_skew的參數
  • Headers的完整性
    使用Kong的hmac來確保請求頭的完整性。具體要確保那個頭,這個也是可以配置的,下面會演示。官方推薦,最差應該是 request-line, host, and date這三個頭,最好是全部的頭。
  • Body的完整性
  • 使用Kong的hmac可以確保請求內容的完整性,下面會演示

確保請求頭的完整性

  • 基礎環境準備
    你要有一個正常的route和service,如果沒有的話,可以參考https://blog.csdn.net/u014686399/article/details/100084613,我的試驗也是基於這個博客的

  • 針對服務啓用插件

/services/2fc52878-1fe9-48ba-bc45-146da3822851/plugins
{
	"name":"hmac-auth",
	"config": {
		"enforce_headers": ["testhamc"],
		"algorithms": ["hmac-sha1", "hmac-sha256"]
	}
}
  • 2fc52878-1fe9-48ba-bc45-146da3822851這個是服務的id,當然你可以針對route啓用插件
  • hmac-auth這個是固定值, 插件的名字
  • config.enforce_headers這是指定你要校驗的頭,我這裏用了一個testhamc,如果你是生產環境還是遵循一下官網的建議吧
  • 創建一個consumer
consumers/ POST
{
	"username":"xjj_user_01",
	"custom_id":"users_001"
}
  • 創建證書
/consumers/f4c713c0-6bf1-4079-83a0-135180d6ba53/hmac-auth  POST
{
	"username":"rita",
	"secret":"123.com"
}
  • f4c713c0-6bf1-4079-83a0-135180d6ba53這個是consumer的id
  • secret是用來做算法的key的,算法一般會用sha256或者sha1
  • 測試
    • 直接訪問
      在這裏插入圖片描述
      可以看到直接訪問不了了
    • 添加Authorization頭
#  首先確定一下testhamc頭,因爲這是我自定義的頭,所以值我就自定義爲123456
#  做簽名,我是通過一個python腳本實現的
import hashlib
import hmac
import base64
	
message = "testhamc: 123456" # 這裏寫你要加密的內容
secret = "123.com"  # 這裏寫Key,是證書的 secret
	
signature = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())
print(signature)
運行腳本,會輸出簽名

在這裏插入圖片描述
再次訪問

curl -i -X GET http://172.16.0.92:31545/xjj_tv/main \
      -H "testhamc: 123456" \
      -H 'Authorization: hmac  username="rita", algorithm="hmac-sha256", headers="testhamc", signature="cnKy69DPkd1rycOvz5biWTJ6rk/UObLAXrNzEOCF4TE="'
  • username是證書的用戶名
    在這裏插入圖片描述
    會提示我們添加一個DATE的頭
  • 添加後再訪問
curl -i -X GET http://172.16.0.92:31545/xjj_tv/main \
      -H "Date: Web, 28 Aug 2019 09:09:00 GMT" \
      -H "testhamc: 123456" \
      -H 'Authorization: hmac  username="rita", algorithm="hmac-sha256", headers="testhamc", signature="cnKy69DPkd1rycOvz5biWTJ6rk/UObLAXrNzEOCF4TE="'
  • DATE是 GMT格式的,和服務器上不能相差300秒
    在這裏插入圖片描述
    訪問通過了

確保body的完整性

  • 確定一個body
body肯定是事先確定的,我這裏定的內容是 xiaojiejiehao
  • 製作body的簽名,我是通過Python實現的
import hashlib
import base64

message = b"xiaojiejiehao" # 這裏寫你要加密的內容
x = hashlib.sha256()
x.update(message)

signature = base64.b64encode(x.digest())
print(signature.decode("utf-8"))

在這裏插入圖片描述

  • 測試
curl -i -X GET http://172.16.0.92:31545/xjj_tv/main   -H "Date: Web, 28 Aug 2019 10:20:00 GMT"  -H "testhamc: 123456"        -H 'Authorization: hmac  username="rita", algorithm="hmac-sha256", headers="testhamc", signature="cnKy69DPkd1rycOvz5biWTJ6rk/UObLAXrNzEOCF4TE="' -H "Digest: SHA-256=l12ueyMM3AyCTH8uE9Cs3PVF1ZGR29rhi1l+SsuJzEI="  -d "xiaojiejiehao"

在這裏插入圖片描述測試通過


先寫到這裏了,有問題進QQ羣630300475

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章