我們一起聊聊如何設(shè)計(jì)安全的對(duì)外 API?
當(dāng)向外部服務(wù)暴露 API 時(shí),確保安全通信至關(guān)重要,以防止未經(jīng)授權(quán)的訪(fǎng)問(wèn)和數(shù)據(jù)泄露。
兩種常用的 API 安全方法是基于 Token 的身份認(rèn)證和基于 HMAC(哈希消息認(rèn)證碼)的認(rèn)證。
下面我們來(lái)介紹這兩種方法的工作原理,并比較它們的不同之處。
圖片
01 基于令牌
- 第 1 步 - 用戶(hù)在客戶(hù)端輸入密碼,客戶(hù)端將密碼發(fā)送給驗(yàn)證服務(wù)器。
- 第 2 步 - 驗(yàn)證服務(wù)器驗(yàn)證憑據(jù)并生成一個(gè)有有效期的令牌。
- 第 3 步和第 4 步 - 現(xiàn)在,客戶(hù)端可以發(fā)送請(qǐng)求,客戶(hù)端在每個(gè) API 請(qǐng)求的 Authorization 頭中包含這個(gè)Token,訪(fǎng)問(wèn)服務(wù)器資源。這種訪(fǎng)問(wèn)在令牌過(guò)期前一直有效。
優(yōu)點(diǎn)
- 無(wú)狀態(tài):服務(wù)器不需要維護(hù)會(huì)話(huà)狀態(tài),Token 本身包含驗(yàn)證所需的所有信息。
- 靈活性:Token 可以包含角色或權(quán)限等元數(shù)據(jù),支持細(xì)粒度的訪(fǎng)問(wèn)控制。
- 支持 OAuth 集成:與OAuth 2.0 兼容,適合第三方集成場(chǎng)景。
缺點(diǎn)
- Token 泄露風(fēng)險(xiǎn):如果 Token 被攔截,攻擊者可以在 Token 過(guò)期前濫用它,除非有其他機(jī)制(如 Token 吊銷(xiāo))在起作用。
- Token 存儲(chǔ):客戶(hù)端需要安全存儲(chǔ) Token,對(duì)于 Web 或移動(dòng)應(yīng)用程序來(lái)說(shuō),這可能比較復(fù)雜。
02 基于 HMAC
該機(jī)制使用哈希函數(shù)(SHA256 或 MD5)生成消息驗(yàn)證碼(簽名)。
- 第 1 和 2 步 - 服務(wù)器生成兩個(gè)密鑰,一個(gè)是公共 APP ID(公鑰),另一個(gè)是 API 密鑰(私鑰)。
- 第 3 步:現(xiàn)在我們?cè)诳蛻?hù)端生成一個(gè) HMAC 簽名(hmac A)。該簽名是根據(jù)圖中列出的一組屬性生成的。
- 第 4 步 - 客戶(hù)端發(fā)送訪(fǎng)問(wèn)服務(wù)器資源的請(qǐng)求,HTTP 頭中包含 hmac A。
- 第 5 步 - 服務(wù)器收到包含請(qǐng)求數(shù)據(jù)和身份驗(yàn)證標(biāo)頭的請(qǐng)求。它從請(qǐng)求中提取必要的屬性,并使用存儲(chǔ)在服務(wù)器端的 API 密鑰生成簽名(hmac B。)
- 第 6 和 7 步 - 服務(wù)器會(huì)比較 hmac A(在客戶(hù)端生成)和 hmac B(在服務(wù)器端生成)。如果兩者匹配,請(qǐng)求的資源將返回給客戶(hù)端。
優(yōu)點(diǎn)
- 防篡改:HMAC 確保請(qǐng)求在傳輸過(guò)程中未被篡改,哪怕只改變一個(gè)字節(jié),簽名也會(huì)不匹配。
- 簡(jiǎn)單:不需要 Token 的發(fā)放或刷新,僅依賴(lài)共享密鑰和哈希算法。
- 無(wú) Token 泄露風(fēng)險(xiǎn):因?yàn)闆](méi)有 Token 可被盜取,這種方法天然安全。
缺點(diǎn)
- 密鑰管理:客戶(hù)端和服務(wù)器都必須安全地管理和存儲(chǔ)共享密鑰。一旦密鑰泄露,安全性就會(huì)受到影響。
- 無(wú)狀態(tài) API 較復(fù)雜:HMAC 不提供內(nèi)嵌元數(shù)據(jù)的無(wú)狀態(tài)認(rèn)證,訪(fǎng)問(wèn)控制需要單獨(dú)處理。
在 HMAC 簽名中加入時(shí)間戳是為了防止重放攻擊(replay attack)。重放攻擊是一種網(wǎng)絡(luò)攻擊方式,攻擊者攔截合法的請(qǐng)求并在之后重復(fù)發(fā)送相同的請(qǐng)求,試圖偽造身份或重復(fù)操作。通過(guò)時(shí)間戳,服務(wù)器可以驗(yàn)證請(qǐng)求是否在合理的時(shí)間范圍內(nèi),從而大大提高系統(tǒng)的安全性。