-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
24 changed files
with
3,441 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# 【Go!帶你探索 FIDO2 資安技術全端應用】Day 08 - FIDO2 解決了什麼 | ||
|
||
在前面幾天,我們認識了組成 FIDO2 的 WebAuthn、CTAP 兩大規範,以及基於 FIDO2 的 Passkeys | ||
|
||
今天我們要來說說 FIDO2 究竟解決了什麼問題! | ||
|
||
## 解決了什麼 | ||
|
||
FIDO2 主要解決了四個問題 | ||
|
||
1. 無需再記錄密碼 | ||
2. 防止重送攻擊 | ||
3. 防止網路釣魚 | ||
4. 隱私保護 | ||
|
||
### 無需再記錄密碼 | ||
|
||
透過使用 FIDO2,傳統的密碼已經轉換成一個個的 Credential 也就是 Passkeys | ||
透過 Authenticator 進行生物辨識驗證等方式,即可證明是否與註冊時為同一位使用者 | ||
|
||
### 防止重送攻擊 | ||
|
||
由於每次進行 WebAuthn 時,RP Server 產生的 Challenge 都是隨機產生的,以及 RP Server 對於請求的來源也有限制, | ||
因此當有中間人從中攔截時,只要重新產生一組新的 Challenge,中間人就算持有舊的 Challenge,從其他來源發起請求,也無法進行後續驗證,可有效防止重送攻擊 | ||
|
||
### 防止網路釣魚 | ||
|
||
WebAuthn 採用公私鑰 key-pair,攻擊者無法透過網路釣魚的方式取得儲存於使用者裝置上的私鑰 | ||
此外 WebAuthn 的每個 Credential 都綁定在特定 domain 上,因此每個 Credential 都是唯一的 | ||
|
||
### 隱私保護 | ||
|
||
承上點,在執行 WebAuthn 流程中,私鑰永遠會儲存在使用者裝置上,只有公鑰會傳送給伺服器,既使攻擊者拿到公鑰,也無法代表原使用者 | ||
|
||
好~透過這 8 天的認識,應該對於 FIDO2、WebAuthn、CTAP 這些名詞和概念有初步理解一點了 | ||
接下來會透過實際操作,來帶大家繼續探索 FIDO2 的前後端應用~ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# 【Go!帶你探索 FIDO2 資安技術全端應用】Day 09 - 前後端實作環境準備 | ||
|
||
前面簡單認識了 FIDO2、WebAuthn、CTAP 之後,接下來就要開始來進行實作了~ | ||
|
||
既然要開始實作,那麼第一步肯定是要先把環境安裝好,畢竟俗話說的好,工欲善其事,必先利其器 | ||
|
||
## 前端環境準備 | ||
|
||
前端我會使用 `iOS App` 來進行範例實作,所以會需要先將 `Xcode` 安裝好 | ||
|
||
Xcode 的安裝教學可以參考我在 2021 年鐵人賽參加的文章 | ||
|
||
> [【在 iOS 開發路上的大小事-Day01】先裝個 Xcode 開發環境壓壓驚](https://ithelp.ithome.com.tw/articles/10259406) | ||
以及這次會使用到 Apple 提供的 Passkeys API,這是需要 Apple 付費開發者帳號才能使用的功能 | ||
所以也會需要準備好一個 `Apple 付費開發者帳號` | ||
|
||
前端環境的準備,大致如上,接下來是後端環境的準備 | ||
|
||
## 後端環境 | ||
|
||
後端我會使用 Go 來進行範例實作,關於 Go 的開發環境可以參考去年 2023 鐵人賽參加的文章 | ||
|
||
> [【하나, 둘, ready, get set, go】Day 2 - 開發環境](https://ithelp.ithome.com.tw/articles/10314137) | ||
在 Day 03 的時候有提到說,RP Server 會需要一個 Public domain 供外部存取 | ||
所以也會需要準備好一個 Public domain 給 RP Server 使用 | ||
(PS:如果沒有 Public domain 的話,後面也會告訴大家可以怎麼暫時替代) | ||
|
||
在 WebAuthn Library 的部分,我會使用 [go-webauthn](https://github.com/go-webauthn/webauthn) 來實際示範 | ||
|
||
這個 Library 也在 [webauthn.io](https://webauthn.io) 中列出,算是比較多人使用的 | ||
|
||
![WebAuthn Library](https://ithelp.ithome.com.tw/upload/images/20240910/20140363BsRc3vNOA1.png) | ||
|
||
▲ 圖截自 [webauthn.io](https://webauthn.io) | ||
|
||
### 安裝方式 | ||
|
||
只要在 Terminal 中輸入下面指令,就可以安裝好 `go-webauthn` 了 | ||
|
||
```shell | ||
go get -u github.com/go-webauthn/webauthn | ||
``` | ||
|
||
將前後端環境都準備好之後,後面就可以實作前後端了~ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
# 【Go!帶你探索 FIDO2 資安技術全端應用】Day 10 - 建立 WebAuthn RP Server API Route | ||
|
||
昨天準備好 Go 的開發環境後,今天就要來建立 WebAuthn RP Server 啦 | ||
|
||
## 建立 WebAuthn RP Server API Route | ||
|
||
### 建立專案 | ||
|
||
使用 Visual Studio Code 建立一個資料夾,來存放 RP Server 的 source code | ||
|
||
```shell | ||
go mod init <GO MODULE 名稱> | ||
touch main.go | ||
``` | ||
|
||
這邊我以 `leoho.io/it16th-webauthn-rp-server` 作為 `GO MODULE 名稱` | ||
|
||
![go mod init](https://ithelp.ithome.com.tw/upload/images/20240911/20140363zMEbvZlSA1.png) | ||
▲ go mod init | ||
|
||
接著新增 `main.go` 的檔案 | ||
|
||
![新增 main.go](https://ithelp.ithome.com.tw/upload/images/20240911/20140363n4vGGBqbRQ.png) | ||
▲ 新增 main.go | ||
|
||
### 安裝相關套件 | ||
|
||
建立 API Route 我們會需要使用 [gin](https://github.com/gin-gonic/gin) 這個套件 | ||
我們透過 go get 來進行安裝,`go get -u github.com/gin-gonic/gin` | ||
|
||
> 可參考去年的 [【하나, 둘, ready, get set, go】Day 24 - 使用 Gin 撰寫第一支 Web Backend API](https://ithelp.ithome.com.tw/articles/10317339) | ||
### 建立 route、controller 資料夾 | ||
|
||
接著建立用來存放 API Route 和處理 Request 請求的 Controller 資料夾 | ||
|
||
![建立 route、controller 資料夾](https://ithelp.ithome.com.tw/upload/images/20240911/20140363wGk6HrkwgN.png) | ||
▲ 建立 route、controller 資料夾 | ||
|
||
### 建立 API Route | ||
|
||
我們先看到 route 資料夾,在裡面建立一個 `route.go` 的檔案,其 package 為 route,建立好之後,會像下面這樣 | ||
|
||
![建立 route.go](https://ithelp.ithome.com.tw/upload/images/20240911/20140363hZDXp0qoz9.png) | ||
▲ 建立 route.go | ||
|
||
接著新增一個用來設定 API Route 的 Function,這邊我取名為 `NewRoute`,這個 Function 會在 `main.go` 裡的 `main()` 裡面呼叫 | ||
|
||
接著在 `NewRoute` Function 中新增下面的程式碼,新增後整個 `route.go` 會長得像下面這樣 | ||
|
||
```go | ||
package route | ||
|
||
import ( | ||
"github.com/gin-gonic/gin" | ||
|
||
"leoho.io/it16th-webauthn-rp-server/controller" | ||
) | ||
|
||
func NewRoute() { | ||
// 1. | ||
app := gin.Default() | ||
|
||
// 2. | ||
attestation := app.Group("/attestation") | ||
{ | ||
attestation.POST("/options", controller.StartAttestationHandler) | ||
attestation.POST("/result", controller.FinishAttestationHandler) | ||
} | ||
|
||
// 3. | ||
assertion := app.Group("/assertion") | ||
{ | ||
assertion.POST("/options", controller.StartAssertionHandler) | ||
assertion.POST("/result", controller.FinishAssertionHandler) | ||
} | ||
|
||
// 4. | ||
app.Run("0.0.0.0:8080") | ||
} | ||
``` | ||
|
||
1. 建立一個 gin 預設路由物件 | ||
2. 建立 attestation 路由群組,管理 WebAuthn 註冊流程的 API Route | ||
3. 建立 assertion 路由群組,管理 WebAuthn 驗證流程的 API Route | ||
4. 使用 `0.0.0.0:8080` 來建立 API Route,在區網內,可以使用主機的 IP:8080 來呼叫到 API Route | ||
|
||
上面看到的 controller,是實際要處理 Request 的地方,接下來我們來繼續新增! | ||
|
||
### 建立 Controller | ||
|
||
在剛剛建立的 controller 資料夾內,新增兩個檔案,分別為 `attestation.go` 和 `assertion.go`,兩個檔案的 package 都是 controller | ||
|
||
`attestation.go` 負責處理 WebAuthn 註冊流程 | ||
`assertion.go` 負責處理 WebAuthn 驗證流程 | ||
|
||
![建立對應的 controller go 檔案](https://ithelp.ithome.com.tw/upload/images/20240911/2014036321i6ENAfHN.png) | ||
▲ 建立對應的 controller go 檔案 | ||
|
||
#### attestation.go | ||
|
||
我們新增兩個 Function 來處理 WebAuthn 註冊流程,分別為 `StartAttestationHandler` 和 `FinishAttestationHandler` | ||
|
||
```go | ||
package controller | ||
|
||
import "github.com/gin-gonic/gin" | ||
|
||
func StartAttestationHandler(ctx *gin.Context) { | ||
// 1. | ||
} | ||
|
||
func FinishAttestationHandler(ctx *gin.Context) { | ||
// 2. | ||
} | ||
``` | ||
|
||
1. StartAttestationHandler 負責處理 WebAuthn 產生註冊資訊的請求,也就是 `Credential Creation Options`,可以透過呼叫 `http://<主機 IP:8080/attestation/options>` 來與 API 互動 | ||
2. FinishAttestationHandler 負責處理 WebAuthn 驗證註冊資訊的請求,也就是 `Authenticator Attestation Response`,可以透過呼叫 `http://<主機 IP:8080/attestation/result>` 來與 API 互動 | ||
|
||
#### assertion.go | ||
|
||
我們新增兩個 Function 來處理 WebAuthn 驗證流程,分別為 `StartAssertionHandler` 和 `FinishAssertionHandler` | ||
|
||
```go | ||
package controller | ||
|
||
import "github.com/gin-gonic/gin" | ||
|
||
func StartAssertionHandler(ctx *gin.Context) { | ||
// 1. | ||
} | ||
|
||
func FinishAssertionHandler(ctx *gin.Context) { | ||
// 2. | ||
} | ||
``` | ||
|
||
1. StartAssertionHandler 負責處理 WebAuthn 產生登入資訊的請求,也就是 `Credential Get Options`,可以透過呼叫 `http://<主機 IP:8080/assertion/options>` 來與 API 互動 | ||
2. FinishAssertionHandler 負責處理 WebAuthn 驗證登入資訊的請求,也就是 `Authenticator Assertion Response`,可以透過呼叫 `http://<主機 IP:8080/assertion/result>` 來與 API 互動 | ||
|
||
今天我們將 WebAuthn 註冊 / 驗證流程的四支 API Route 都先建立好了,那麼明天就可以來撰寫邏輯的部份了~ |
Oops, something went wrong.