[Day 10] 使用者驗證 (一)

erichung0404
2024-08-10 15:08:45

上篇原本想說是最後一個常見的 系統元件 了
今天借朋友的筆電登入 ItHome 帳號才驚覺...忘記講 使用者驗證了!

於是想了想, 不如就把一些沒打算講的元件也一併講好了XD

所以預計在進入 Scaling 之前, 還會繼續介紹

使用者驗證

支付服務

今天就先繼續講 使用者驗證吧

使用者驗證

使用者驗證涵蓋的範圍也相當廣泛, 從簡單的 帳號密碼登入 到複雜的 2FA
我們一樣來看看各種驗證方式的特點和適用情境

預計會介紹以下幾個

帳號密碼登入

One-time Password (OTP)

Two-factor Authentication (2FA)

生物識別

硬體驗證

Single Sign On (SSO)

Open Authorization 2.0 (OAuth2)

Vault

...落落長的清單@@

希望在看完本文後, 大家能夠有基本的了解

帳號密碼登入

最常見的使用者驗證機制

只要使用者輸入 帳號 和 密碼 就能驗證了
聽起來很合理, 但是具體是怎麼做的呢?

帳號 和 密碼 配對

直覺來想, 我們只要檢查使用者輸入的 密碼 和 註冊時的密碼 (存在我們伺服器) 相同即可
(反過來不行XD)

所以流程會是

1. 使用者 輸入帳密

2. 服務 收到使用者帳密

3. 服務 根據 使用者帳號 去撈出 註冊時的密碼

4. 服務 比對 收到的密碼 和 註冊時的密碼

5. 匹配則登入成功; 反之則失敗

最簡單的 使用者驗證 服務就完成了

登出也很簡單, 只需要把使用者的 Session 清掉即可

那麼重設密碼呢?

忘記密碼

相信大家都有過忘記密碼的經驗XD

在我們點下 Forgot Password? 或是 Reset Password 的按鈕後, 到我們收到重設密碼的驗證信, 這中間發生了什麼事? 為什麼不給我當初註冊的密碼就好?

Hash 密碼

(題外話: 這邊就不解釋 Hash 的原理, 只要知道 被 Hash 後的字串是無法還原的即可)

由於大部分人在註冊各種服務時, 都是用相同的密碼 (可以想想自己 ItHome 的密碼是不是和其他網站相同XD)

為了避免 Database 資料外洩 (如惡意攻擊, 不小心洩漏等) 時, 所有人的密碼都被看光光, 我們的服務可以在使用者註冊時 "先將密碼 Hash 後再存起來" (這叫做非明文儲存)

比如:
密碼用明文儲存

username: erichung0404
password: ironmen2024

Hash 後儲存 (比如 HMAC-SHA-256)

username: erichung0404
password: 5dc0ab517531e04d4ca0479090cecb579404f2400dcb44a47b805a61e32c385f

(Hash 演算法也有很多種, 這邊就不一一介紹, 有興趣可以自行查閱, 這邊提供幾種常用來 Hash 密碼的演算法: HMAC-SHA-256, PBKDF2, Argon2 etc.)

由於 Hash 的特性是 "無法還原", 所以萬一我們忘記密碼, 服務也只知道我們 "Hash 後的密碼", 就算拿 Hash 後的密碼再 Hash 一次, 也不會是原本的密碼!

這就是為什麼只能重設密碼了~

優點: 簡單快速

缺點: 可能被暴力破解, 無法 "確認使用者身份" (比如我拿我朋友的電腦或手機登入服務)

適用場景有: 頻繁登入, 使用者體驗重要 且 不包含個人敏感性資訊 的服務或應用 (如遊戲, 不包含使用者敏感資料的網站等)

One-time Password (OTP)

為了避免密碼被暴力破解, 我們可以用 一次性密碼 增加安全性
步驟大致如下

1. 伺服器 可以根據 時間 (Time-based OTP, TOTP) 或 事件 (HMAC-based OTP, HOTP) 產生一次性密碼 (用完即丟)

2. 使用者 透過 Authenticator, SMS 或 Email 取得一次性密碼

3. 使用者 輸入 一次性密碼

4. 伺服器 同步生成 一次性密碼 並比對

5. 成功則該 一次性密碼 自動過期

通常搭配 2FA 使用

優點: 比傳統帳密驗證安全性更高

缺點: 流程較複雜, 無法 "確認使用者身份"

Two-factor Authentication (2FA)

就是常聽見的 兩階段驗證 (或是雙重驗證, 雙因素驗證), 這邊簡單介紹一下概念

2FA 將 "身份驗證" 分為四個面向, 並從中選擇兩個組合作為 身份驗證 機制

1. 知識因素 (Knowledge Factor)

2. 持有因素 (Posession Factor)

3. 生物因素 (Inherent Factor)

4. 行為因素 (Behavioural Factor)

一般 2FA 都是由 知識因素 搭配 持有因素或生物因素

知識因素 (Knowledge Factor)

即是 "只有使用者知道" 的因素, 比如 帳密驗證 中的密碼
上面已經介紹過就不贅述

持有因素 (Posession Factor)

即 "只有使用者持有" 的因素, 比如 手機, 私人電腦 等等

手機由電信業者提供, 理論上會綁定身分證 (Know your customer, KOC), 所以可以視為持有人即為 該服務使用者 (除非手機被偷...), 就可以透過 簡訊 寄送 OTP 達成 2FA 效果

使用情境如: 手機應用程式

生物因素 (Inherent Factor)

由於 持有因素 "還不夠證明你真的是 服務使用者", 因為 持有物品 可能被偷走或盜用
所以更為嚴謹的方式是透過 生物驗證, 比如 人臉辨識, 指紋辨識, 聲音辨識 等等

這些資訊屬於 敏感性資料, 所以根據 General Data Protection Regulation (GDPR) 應將其 "去識別化"
(題外話, 雖然 GDPR 是 歐盟 (EU) 的法規, 但由於網路的無界特性, 如果我們的服務會面向 EU 使用者, 有可能會被告, 當然自營應該機會不大XD)

和前面針對 密碼 處理 (Hash) 的概念類似, 都需要 "去識別化" 後才儲存在 伺服器
但相對於 密碼的 Hash, 生物特徵 則是透過 "特徵提取" (由使用者設備負責)

使用情境如: 交易驗證, 銀行服務登入 等需要 KYC 的服務

行為因素 (Behavioural Factor)

根據 使用者 的使用習慣來辨識, 有以下幾種

打字行為（Keystroke Dynamics）

比如 打字的節奏, 按鍵間隔, 按壓時間 等特徵來驗證身份

適用情境: 銀行服務, 公司內部系統

滑鼠行為（Mouse Dynamics）

使用滑鼠的行為模式, 比如移動速度, 點擊頻率, 移動軌跡等

適用情境: 常用於在線應用和網頁安全驗證，特別是在防範機器人攻擊時

觸控行為（Touch Dynamics）

比如 手機, 平板 的觸摸模式, 包括 觸摸力道, 滑動速度, 觸點數量等

適用情境: 通常用在 行動支付

瀏覽行為（Browsing Behavior）

比如 瀏覽習慣, 點擊模式, 停留時間 等來識別

適用情境: 比如 電商網站, 社群網站 等

手勢識別（Gesture Recognition）

比如 手寫簽名和手勢操作 等

適用情境: 電子簽名

Reference

What is two-factor authentication (2FA)?