大家好,這幾天較有時間,終於可以好好的思考文章 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)