Skip to content

Commit

Permalink
Upload it16th Day 08 ~ Day 29
Browse files Browse the repository at this point in the history
  • Loading branch information
leoho0722 committed Sep 25, 2024
1 parent 1583116 commit 103eabf
Show file tree
Hide file tree
Showing 24 changed files with 3,441 additions and 1 deletion.
23 changes: 23 additions & 0 deletions docs/Writerside/hi.tree
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,29 @@
<toc-element topic="Day06.md">
</toc-element>
<toc-element topic="Day07.md"/>
<toc-element topic="Day08.md"/>
<toc-element topic="Day09.md"/>
<toc-element topic="Day10.md"/>
<toc-element topic="Day11.md"/>
<toc-element topic="Day12.md"/>
<toc-element topic="Day13.md"/>
<toc-element topic="Day14.md"/>
<toc-element topic="Day15.md"/>
<toc-element topic="Day16.md"/>
<toc-element topic="Day17.md"/>
<toc-element topic="Day18.md"/>
<toc-element topic="Day19.md"/>
<toc-element topic="Day20.md"/>
<toc-element topic="Day21.md"/>
<toc-element topic="Day22.md"/>
<toc-element topic="Day23.md"/>
<toc-element topic="Day24.md"/>
<toc-element topic="Day25.md"/>
<toc-element topic="Day26.md"/>
<toc-element topic="Day27.md"/>
<toc-element topic="Day28.md">
</toc-element>
<toc-element topic="Day29.md"/>
</toc-element>
</toc-element>
</toc-element>
Expand Down
36 changes: 36 additions & 0 deletions docs/Writerside/topics/it-ironman/it16th/Day08.md
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 的前後端應用~
46 changes: 46 additions & 0 deletions docs/Writerside/topics/it-ironman/it16th/Day09.md
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
```

將前後端環境都準備好之後,後面就可以實作前後端了~
142 changes: 142 additions & 0 deletions docs/Writerside/topics/it-ironman/it16th/Day10.md
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 都先建立好了,那麼明天就可以來撰寫邏輯的部份了~
Loading

0 comments on commit 103eabf

Please sign in to comment.