owned this note changed a year ago
Linked with GitHub

API 驗證授權,你所該知道的那些事 / John Liu @ TW(劉奕為)

歡迎來到 Modern Web 2020 共筆

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

共筆入口:https://hackmd.io/@ModernWeb/2020
手機版請點選上方 按鈕展開議程列表。

簡報下載

共筆從這開始

技術長 打雜
每週二晚上桌遊店固定會討論web技術沒有的話就打桌遊
歡迎 8:00 後過來~ by JohnLiu

關於驗證

介紹驗證常見形式與特色

驗證vs授權

  • 驗證
    • Authentication
    • 你是誰
    • HTTP 401
  • 授權
    • Authorization
    • 你可以做甚麼
    • HTTP 403

驗證四要素

  • Ownership-based authentication (你有什麼)
    • 實體物品,如實體金鑰(USB),信用卡・AuthenticatorApp
  • Characteristic-based authentication(你是什麼)
    • 多為生物識別,如touchID指紋辨識虹膜・語音等等。
  • Knowledge-based authentication (你知道什麼)
    • 最常見,只有特定用戶知道的資訊,如密碼,PINcode
  • Location-based authentication(你在哪裡)
    • 與特定主機的連接或利用GPS信號來識別位置
    • 不同地方登入,陌生地點登入之類的檢查。

Password-based authentication

  • 最常見的驗證機制·透過一組帳號密碼做使用者驗證
  • 常使用Salt機制,模糊化密碼
    • 此密碼不能被反推
    • SHA-256最常用
    • PBKDF2可以抵禦彩虹表攻擊
  • 需注意字典攻擊,定期透過password資料庫試user密碼
  • 常見實作2-step authentication,先密碼後PIN值
    • 透過兩階段驗證,知道你是誰
    • 常見的為Google Authenticator

2FA ( two-factor authentication )

  • 又稱多重要素驗證,用戶要通過兩種以上的認證機制之後·才能得到授權
  • 最常見
    1.先透過密碼(你知道什麼)再透邊指紋所識登入(你是什麼)
    2.先透過密碼(你知道什麼)再透過特定App登入(你擴有什
    • 常用在金融相關App or 公司內部登入服務

OTP ( one-time password )

  • 一次性密碼,又稱動態密碼或單次有效密碼
  • 常見透過手機裝置或Email收取一次性密碼
  • 比較高規格的安全防護需求-RSA token
    • 實體載具
    • RSA token
  • 蘋果提出之 one-time password建議規格(獲得 Google支持)
    ​​​​747723 1s your Exampteco authentication code.
    ​​​​@example,com #747723
    
  • PIN 的全名就叫 Personal identification number

關於授權

介紹授權常見的JWT.

JWT ( Json Web Token)

  • TOKEN - 令牌、通行證
  • 驗證授權常用機制,利用有規則字串辨識用戶
    • 透過token知道這個人是誰
  • 更符合設計 RESTfulAPI時「Stateless無狀態」原則
  • 常用在 SSO(Single SignOn)使用情境、無關安全議題操作權限授與、App與IOT裝置串接API
    • SSO - 多個服務在同一個網站登入(Ex. Gmail、Drive)
  • 相較session和cookie・安全性提高
  • 不須對資料庫做操作 (使用者資料可以存在前端)

  • token在client端會存在localstorage

JWT structure

payload就是資料主體啦

JWT payload - registrered claims

建議要有的欄位
但是不是填了就會有效,要自己去實作

3

程式碼範例與總結

Ruby與 Python 範例 Code

JWT 全貌

中間用.區隔

  • 有工具可以直接解碼

關於Base64

不是拿來加密,他有一定的規則,就是只能拿來編碼

JWT的資安問題

  1. Secret Key的對稱問題
    • 解決方式:
      • 使用非對稱加密方式(RSA)
      • 使用組合式,或分散式金鑰
  2. 非法資料問題
    • 解決方式:
      • 使用aud, exe等JWT參數做資料的正確性核對
  3. 密鑰洩漏&不指定演算法問題
  4. 現實事件:

推薦閱讀:JWT做api認證安全嗎?.|by Chestermo| Medium

常見API加密範例-加密後簽章

  • 需求描述:
    以HMAC簽章驗證使用者的身份使用者在請求API服務時將APP Key與當下時間(格式使用GMT時間)做HMAC-SHA1加密運算後轉成Base64 格式,帶入signature屬性欄位,Server將驗證使用者請求時的header欄位

常見 API 加密範例 - AES + IV

  • 需求描述:
    將交易資料透過專屬加密 HashKey 與專屬加密 HashIV,產生 AES 256 加密交易資料。

總結

  • 驗證
    • 四要素:有什麼,是什麼,知道什麼和在哪裡
    • 三常見方式: password, 2FA, one-time
  • 授權(JWT)
    • 優勢在於輕量、符合RESTful API原則
    • 需注意資安問題
  • API驗證加密常見模式: hash加密驗證、AES+IV加密
tags: MW20 框架與設計 API授權驗證
Select a repo