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