概要介紹
AK/SK 認證通常用于調(diào)用 Open API【云服務(wù) API】的服務(wù)端認證.
在對接 PASS 平臺和支付平臺的時候跳纳,都會要求我們預(yù)先生成一個 access key【AK】 和 secure key【SK】【私鑰】紊搪,然后通過簽名的方式完成認證請求;這樣可以避免傳輸 SK田柔,且大多數(shù)情況下簽名只允許使用一次俐巴,避免重放攻擊.
這種基于 AK/SK 認證的方式主要利用散列的消息認證碼【Hash-based MessageAuthentication Code】來實現(xiàn),因此很多地方又叫 HMAC 認證.
應(yīng)用方式
我們可以把 HMAC 作為網(wǎng)絡(luò)通信認證設(shè)計中的憑證生成算法硬爆,避免 SK 直接在網(wǎng)絡(luò)上傳輸.
1. 客戶端需要在認證服務(wù)器中預(yù)先申請 AK 和 SK
2. 在調(diào)用 API 的時候欣舵,除傳遞請求必要的參數(shù)之外,還需要傳輸一個通過 HMAC 算法生成的一個簽名串【簽名串的生成方法后面講】
3. 服務(wù)器通過預(yù)先留存的 AK 和 SK 進行同樣的摘要算法計算缀磕,得到的結(jié)果與客戶端傳輸?shù)念~外的參數(shù)進行比對缘圈,如果一致,則認為該請求是有效的袜蚕;否則將拒絕處理這次請求准验,并返回 HTTP 403
簽名串的其中一種生成方法
假設(shè)請求的 URL 格式為 https://baidu.com/gate/move/?c=2&b=1
- 我們可以截取 urlPath部分,得到的結(jié)果為 gate/move
- 截取參數(shù)廷没,c=2&b=1糊饱,然后將參數(shù)的鍵值對拼接在一起得到 c2 和 b1,最后按照首字母排序并拼接為一個字符串為 c2b1.
3.將 1 和 2 得到的兩個字符串拼接在一起得到 r = gate/movec2b1
4.將得到的字符串通過【HMAC_SHA1】算法對 AK 進行簽名 p =【HMAC_SHA1(r,AS)】
5.對結(jié)果轉(zhuǎn)換為十六進制 q = HEX(p)
存在的缺陷
目前的實現(xiàn)方式無法抵御重放攻擊颠黎;因此我們需要在簽名時放入一下干擾信息
在業(yè)界標準中解決這個問題有兩種典型的做法
1)質(zhì)疑/應(yīng)答算法【OCRA: OATH Challenge-Response Algorithm】
質(zhì)疑/應(yīng)答算法需要預(yù)先客戶端先請求一次服務(wù)器另锋,獲得 HTTP 狀態(tài)碼為 401 未認證的返回滞项,并得到一個隨機字符串(nonce)。將 nonce 附加到按照上面說到的方法進行 HMAC_SHA1 簽名夭坪,服務(wù)器使用預(yù)先分配的 nonce 同樣進行簽名校驗文判,這個 nonce 在服務(wù)器只會被使用一次【當然你可以給這個nonce設(shè)置一個有效期,只要在有效期之內(nèi)均可以使用】室梅,因此可以提供唯一的摘要
2)timestamp+nonce方案
nonce 指唯一的隨機字符串戏仓,用來標識每個被簽名的請求,通常為每個請求提供一個唯一的標識符亡鼠,服務(wù)器能夠防止請求被多次使用【記錄所有用過的 nonce 以阻止它們被二次使用】赏殃;但是對于服務(wù)器永久存儲所有接收到的 nonce 的代價非常大,因此可以通過 timestamp 配合 nonce 進行優(yōu)化
假設(shè)客戶端和服務(wù)端最多能存在 1 分鐘的時間差间涵;服務(wù)端需要記錄客戶端所有的 nonce 請求集合仁热,當有新的請求進來后,檢測當前攜帶的 nonce 是否在集合中存在勾哩;
如果不存在抗蠢,則記錄該 nonce 的值,有效期為 1分鐘思劳;
如果存在迅矛,則說明客戶端在一分鐘內(nèi)進行了重復(fù)的請求,則拒絕服務(wù)潜叛;