作者wuwt4y (Poky)
看板PHP
標題[請益] api key 安全性問題
時間Mon Aug 13 20:36:24 2018
小弟最近在做api 的安全機制,
參考了amazon api key 的做法。
我給client 一組api key跟secret key
他每次請求要給我api key,timestamp,sign
sign 我用請求的api key, timestamp, url下去簽名(HMAC256)
但是主管說同一時間簽出來的東西都一樣,這樣不安全,時間夠久就可以算出我的SECRET K
EY
但是有那麼好算嗎?
他又不知道我用什麼下去簽,
即使知道,算出來也不太可能吧?
想請問如果他今天可以攔截到我發出的東西,也知道我用什麼下去簽,那算出我secret key
可能性高嗎?真的是時間夠就一定算的出來嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.150.140.80
※ 文章網址: https://webptt.com/m.aspx?n=bbs/PHP/M.1534163787.A.F6A.html
1F:推 MoMoShota: 先說結論:理論上可行但實際上困難 擔心的話定期改 key 08/13 20:43
2F:推 hiigara: timestamp 有 replay attack 的機會 08/13 20:53
3F:→ hiigara: 不過量大的時候用 nonce 也是有點麻煩,看強度需求吧 08/13 20:53
4F:→ hiigara: 差點忘記,用時間的話 client 跟 server 還要能夠對時 08/13 21:03
5F:→ knives: 貴司網站有那麼熱門? 08/14 03:30
6F:→ wuwt4y: 這樣似乎也沒有比較好的解法 08/14 13:08
7F:→ MOONRAKER: 用完整的timestamp不是136年才會重覆 08/14 14:29
8F:推 hiigara: overflow 好解決,問題是在容許雙方有多大的時間差 08/14 16:21
9F:→ hiigara: 容許五分鐘就是五分鐘內可以可以被重播連打 08/14 16:22
10F:→ hiigara: 五秒鐘那就是對時機制要做 08/14 16:23
11F:→ hiigara: 如果 API 沒有需要防禦 replay 那就好解決 08/14 16:24
12F:→ MOONRAKER: 其實參數有timestamp 等於告訴人家會用timestamp算 08/14 19:18
13F:推 hiigara: 這部分 nonce 也是一樣,反正整個 URL 都露出了,倒還好 08/14 22:27
14F:→ hiigara: 存取量不大的話 nonce 很方便,存取量大的時候光是把所有 08/14 22:29
15F:→ hiigara: nonce 存起來就有點麻煩,可行但是會有些囉唆事要照顧 08/14 22:33
16F:→ hiigara: 要看樓主想保護什麼,被攻破有多嚴重,以及client可信度 08/14 22:38
17F:→ hiigara: 才能決定最好的做法是什麼 08/14 22:38
18F:→ hiigara: 如果 client 可信也不會放進瀏覽器,其實 https 很硬了 08/14 22:39
19F:→ hiigara: 只要強迫走 https 就能擋掉九成的問題 08/14 22:40
20F:→ wuwt4y: 使用nonce 等於client每次發起請求之前,要先跟我發起一個 08/15 09:18
21F:→ wuwt4y: 要nonce的請求嗎?等於每次都要發兩次請求? 08/15 09:19
22F:推 hiigara: nonce 只是 client 加一段不會重複使用的隨機字串 08/15 09:51
23F:→ hiigara: 應該說,nonce這個字的意思是只用一次的隨機字串 08/15 09:58
24F:→ hiigara: server 發的話就像是 server 挑戰給 client 08/15 10:00
25F:推 hiigara: 但我不知道 挑戰-回應 與 client 送 nonce 相比的好處 08/15 10:04
26F:推 hiigara: server 不用存一大堆用過的 nonce 大概算好處吧 08/15 10:08
27F:→ wuwt4y: 如果client 自己發的話,我server 要如何知道他得隨機字串 08/16 15:06
28F:→ wuwt4y: 他這個隨機字串 不能付在外部,而是只有簽名會用到,這樣才 08/16 15:08
29F:→ wuwt4y: 安全吧,那這樣的話我server如何知道他的隨機字串 08/16 15:08
30F:→ MOONRAKER: 要在request裏面一起送去吧?以前接API是這樣 08/16 15:53
31F:→ MOONRAKER: 跟你的timestamp一樣 我自己寫是沒用過 08/16 15:54
32F:推 SS327: 棒 11/01 23:19