大家好,這幾天較有時間,終於可以好好的思考文章 XD。由於最近周遭的朋友對安全性演算法這個詞時常感到高深莫測,這次就來介紹安全性演算法的應用吧!
安全性演算法是相當複雜的,但事實上他的`應用概念`是很直覺的,我們不妨直接以應用來了解,演算法採用網路大家常用的 library 即可。
所以這幾篇文章會以實際應用來講解,不琢磨演算法細節。
P.S. 我是從[演算法圖鑑](https://www.books.com.tw/products/0010771263)這本書來了解安全性演算法的,因為安全性演算法的目標都一樣,所以文章內容雖然都是我內化的,但可能會許多雷同,請多多包涵 XD。
## 安全性演算法的目標
這些演算法到底要保護什麼事情,就是保護`傳送`這個動作會產生的 4 個問題:
1. 竊聽(eavesdrop)
2. 電子欺騙(spoofing)
3. 竄改(falsification)
4. 抵賴(repudiation)
而這些問題可以透過以下 3 個方法來解決:
1. 加密(encryption)
2. 訊息識別碼(message authentication code)
3. 數位簽章(digital signature)
是怎麼解決的呢?以下會以`小明`、`線上早餐店阿姨`與在他們對話間做壞事的`壞蛋`來講解。
## 竊聽(eavesdrop)是什麼?
答:
> 偷取傳輸過程中的資料
假設`小明`要線上付款早餐店款項,理想如下圖:
```mermaid
sequenceDiagram
participant a as 小明
participant b as 線上早餐店阿姨
a ->> b: 傳送付款密碼
b ->> b: 付款成功
```
❗ 但如果有`壞蛋`從中攔截封包,就可以取得`小明`的付款密碼:
```mermaid
sequenceDiagram
participant a as 小明
participant bad as 壞蛋
participant b as 線上早餐店阿姨
a ->> bad: 傳送付款密碼
bad ->> bad: 被壞蛋攔截,<br>從此壞蛋擁有了你的付款密碼
bad ->> b: 照樣把付款密碼傳送,<br>阿姨完全沒有察覺以被攔截
b ->> b: 付款成功
```
🌟 怎麼防範?
> 將傳送的資料加密,這樣就算壞蛋偷走了也不知道資料內容
只要`小明`與`早餐店阿姨`有協議好一個雙方才知道的加解密方法,而`壞蛋`不知道,就可以如以下模式運作:
```mermaid
sequenceDiagram
participant a as 小明
participant bad as 壞蛋
participant b as 線上早餐店阿姨
a ->> a: 預先加密付款密碼
a ->> bad: 傳送'以加密'的付款密碼
bad ->> bad: 被壞蛋攔截,<br>但壞蛋解密不開此資料
bad ->> b: 無奈把資料傳送
b ->> b: 解密付款密碼
b ->> b: 付款成功
```
## 電子欺騙(spoofing)是什麼?
答:
> 無法確認傳輸對象的身份
假設`小明`要購買一杯大冰奶,理想如下圖:
```mermaid
sequenceDiagram
participant a as 小明
participant b as 線上早餐店阿姨
a ->> b: 我要喝大冰奶
b -->> a: OK,外送大冰奶過去
```
❗ 但如果有`壞蛋`也聲稱自己是`小明`,就可以謊報資料:
```mermaid
sequenceDiagram
participant a as 小明
participant bad as 壞蛋
participant b as 線上早餐店阿姨
bad ->> b: 聲稱自己是小明,說小明要大冰紅
b -->> a: OK,外送大冰紅過去
a ->> a: ???,我明明沒點大冰紅啊
```
🌟 怎麼防範?
> 傳輸人員在資料上產生一筆獨一無二的代碼供另一端驗證
此代碼可以是`訊息識別碼`或`數位簽章`,`小明`會透過金鑰與資料一起產生此代碼,`早餐店阿姨`只需再接收到資料時再用金鑰與資料一起產生代碼,比對代碼是否相同即可判斷是不是`小明`傳的:
```mermaid
sequenceDiagram
participant a as 小明
participant bad as 壞蛋
participant b as 線上早餐店阿姨
bad ->> bad: 壞人不知道小明的金鑰,<br>所以用自己的金鑰與資料產生代碼
bad ->> b: 將資料與代碼傳送
b ->> b: 拿小明的金鑰與資料一起產生代碼,<br>發現與傳過來的代碼不同,<br>所以傳送端不是小明,取消傳送
a ->> a: 沒收到任何假借名義的早餐
```
## 竄改(falsification)是什麼?
答:
> 修改傳輸的資料
假設`小明`要購買一杯大冰奶,理想如下圖:
```mermaid
sequenceDiagram
participant a as 小明
participant b as 線上早餐店阿姨
a ->> b: 我要喝大冰奶
b -->> a: OK,外送大冰奶過去
```
❗ 但如果`壞蛋`竄改了`小明`的訂單,`小明`就會收到不預期的回應:
```mermaid
sequenceDiagram
participant a as 小明
participant bad as 壞蛋
participant b as 線上早餐店阿姨
a ->> bad: 我要喝大冰奶
bad ->> bad: 被壞蛋攔截,<br>壞蛋修改了訂單成大冰紅
bad ->> b: 把訂單傳送,<br>阿姨完全沒有察覺以被攔截
b -->> a: OK,外送大冰紅過去
a ->> a: ???,我不是點大冰紅啊
```
🌟 怎麼防範?
> 電子欺騙的解決方法相同,傳輸人員在資料上產生一筆獨一無二的代碼供另一端驗證
此代碼可以是`訊息識別碼`或`數位簽章`,`小明`會透過金鑰與資料一起產生此代碼,`早餐店阿姨`只需再接收到資料時再用金鑰與資料一起產生代碼,比對代碼是否相同即可判斷是不是`小明`傳的:
```mermaid
sequenceDiagram
participant a as 小明
participant bad as 壞蛋
participant b as 線上早餐店阿姨
a ->> a: 預先將金鑰與大冰奶一起產生代碼
a ->> bad: 將資料與代碼傳送
bad ->> bad: 被壞蛋攔截,<br>壞蛋修改了訂單成大冰紅
bad ->> bad: 但壞人不知道小明的金鑰,<br>所以用自己的金鑰與資料產生代碼
bad ->> b: 將資料與代碼傳送
b ->> b: 拿小明的金鑰與資料一起產生代碼,<br>發現與傳過來的代碼不同,<br>所以傳送端不是小明,取消傳送
a ->> a: 沒收到任何假借名義的早餐
```
## 抵賴(repudiation)是什麼?
答:
> 無法證明傳輸方有做過這件事
❗ 假設`小明`心懷不軌,買了一杯大冰奶卻不想付錢,他可以這樣做:
```mermaid
sequenceDiagram
participant a as 小明
participant b as 線上早餐店阿姨
a ->> b: 我要喝大冰奶
b -->> a: OK,外送大冰奶過去
Note over a,b: 小明開始賴帳
b ->> a: 我要準備從小明你的帳戶扣錢囉
a ->> b: 嗯?我沒有買大冰奶啊
b ->> a: 蛤!你有啊,我給你看訂單
a ->> b: 訂單上又沒有我的簽名你怎麼證明是我訂的
```
🌟 怎麼防範?
> 要求傳輸人員在資料上產生一筆獨一無二的代碼供另一端驗證
此代碼為`數位簽章`,不可為`訊息識別碼`,因為`訊息識別碼`的機制是傳送`雙方`共同約定好的金鑰,而`數位簽章`的機制是`小明`擁有一把`個人金鑰`,才可證明是`小明`傳送的。
`小明`得透過`個人金鑰`與資料一起產生此代碼,如果小明賴帳,`早餐店阿姨`只需拿此代碼去跟小明討帳即可:
```mermaid
sequenceDiagram
participant a as 小明
participant b as 線上早餐店阿姨
a ->> a: 預先用個人金鑰與大冰奶一起產生代碼
a ->> b: 將資料與代碼傳送
b ->> b: 確認此代碼是小明產生的
b -->> a: OK,外送大冰奶過去
Note over a,b: 小明開始賴帳
b ->> a: 我要準備從小明你的帳戶扣錢囉
a ->> b: 嗯?我沒有買大冰奶啊
b ->> a: 蛤!你有啊,我給你看訂單與你自己的代碼
a ->> b: 拍謝,我付錢
b ->> a: 進土城看守所再說吧!
```
## 各個安全性演算法的特性
有了以上慨念後,在針對任何傳輸安全性的問題,你可以透過此表來思考到底要用何種技術解決:
| | 竊聽 | 電子欺騙 | 竄改 | 抵賴 |
| ---------- | ---- | -------- | ---- | ---- |
| 加密 | v | | | |
| 訊息識別碼 | | v | v | |
| 數位簽章 | | v | v | v |
## 你可能會需要注意的
- 到底從何處攔截?答: 比如說路由器,從個人電腦 > 路由器 > Server,不當程式就可以在路由器中攔截
- 你會發現,這些安全性演算法都在保護資料的完整性與正確性,資料被攔截並且惡意`丟棄`並不是這些演算法保護的目標
## 參考
- [演算法圖鑑](https://www.books.com.tw/products/0010771263)