Learning Objectives
- 說出資訊安全的三個目標:機密性、完整性、可用性
- 分辨病毒、蠕蟲、木馬、勒索軟體、間諜軟體,並說出對應的防護方法
- 辨認釣魚訊息的常見特徵,說明多因素驗證為什麼能保護帳號
- 分辨對稱加密與非對稱(公開金鑰)加密,用小數字的 RSA 走一次加密與解密
- 說出雜湊的特性,以及網站為什麼存雜湊而不存密碼、為什麼要加鹽
- 說明數位簽章與憑證怎麼證明「是誰送的、有沒有被改過」
一則包裹簡訊
你收到一則簡訊:「您的包裹因地址不完整無法配送,請於今日內點擊連結更新資料。」連結點開是一個長得很像物流公司的網頁,要你輸入姓名、地址和信用卡號碼。
這一課要回答幾個問題:
- 電腦上會遇到哪些威脅?哪些是程式造成的,哪些是衝著「人」來的?
- 密碼怎麼設才安全?為什麼登入時還要再輸入一次手機上的驗證碼?
- 瀏覽器網址列的鎖頭背後,用了哪些密碼學工具?加密、雜湊、數位簽章各解決什麼問題?
資訊安全的三個目標
| 目標 | 意思 | 被破壞的例子 |
|---|---|---|
| 機密性(confidentiality) | 只有該看的人看得到 | 個資外洩、密碼被偷 |
| 完整性(integrity) | 資料沒有被偷偷改掉 | 轉帳金額在傳送途中被竄改 |
| 可用性(availability) | 需要時用得到 | 檔案被勒索軟體鎖住、網站被大量流量灌爆而無法連線 |
這三個英文字的字首合起來常被稱為 CIA。後面每一種威脅與防護,都可以問一句:它破壞或保護的是哪一個目標?
本課只介紹觀念與防護方法。未經授權存取別人的電腦、帳號或資料是違法行為;想學資安實務,請在課程或合法授權的練習環境中進行。
惡意程式的種類
惡意程式(malware)是故意設計來造成損害、竊取資料或控制電腦的軟體。常見的種類依「怎麼傳播」與「做什麼」來分:
| 種類 | 怎麼傳播 | 會做什麼 |
|---|---|---|
| 病毒(virus) | 附在其他檔案或程式上,使用者執行那個檔案時才發作並感染其他檔案 | 破壞或修改檔案 |
| 蠕蟲(worm) | 自己透過網路找有漏洞的電腦複製過去,不需要使用者執行 | 大量占用網路與電腦資源 |
| 木馬(Trojan horse) | 偽裝成有用的軟體(破解版、免費小工具),讓使用者自己安裝 | 開後門讓別人遠端控制、偷資料 |
| 勒索軟體(ransomware) | 常透過釣魚信件附件或未修補的漏洞進入 | 把檔案加密,要求付款才給解密金鑰 |
| 間諜軟體(spyware) | 常和其他軟體綁在一起安裝 | 偷偷記錄鍵盤輸入、瀏覽紀錄、帳號密碼 |
| 廣告軟體(adware) | 和免費軟體綁在一起 | 不斷跳出廣告、改掉瀏覽器首頁 |
被入侵的電腦也可能被集中控制,組成殭屍網路(botnet),在主人不知情的情況下被拿去寄垃圾郵件或灌爆別人的網站。
防護的基本功
| 做法 | 擋住什麼 |
|---|---|
| 作業系統與軟體保持更新 | 很多惡意程式利用的是已經有修補程式、但使用者沒有更新的漏洞 |
| 只從官方商店或原廠網站安裝軟體,不用破解版 | 木馬、綁在一起的間諜軟體 |
| 開啟作業系統內建的防毒與防火牆 | 已知的惡意程式、未經允許的連線 |
| 平常用一般使用者權限,不隨便按「允許」 | 惡意程式取得系統管理權限 |
| 定期備份,而且至少一份備份平常不連在電腦上 | 勒索軟體、硬碟故障;檔案被鎖住時可以直接從備份還原 |
備份常用「3-2-1」原則來記:至少 3 份資料、存在 2 種不同的媒體、其中 1 份放在別的地方。
社交工程與釣魚
最常見的入侵方式不是破解技術,而是騙人。利用人的信任、恐懼或貪小便宜,讓人自己交出密碼或執行檔案,稱為社交工程(social engineering)。
釣魚(phishing)是最常見的社交工程:假冒銀行、物流、學校、網購平台寄出訊息,引導你到假網站輸入帳號密碼或信用卡。透過簡訊的叫簡訊釣魚,針對特定對象、內容量身打造的叫魚叉式釣魚(spear phishing)。
釣魚訊息的常見特徵
| 特徵 | 例子 |
|---|---|
| 製造急迫感 | 「今日內未處理將停權」「最後通知」 |
| 要你提供不該提供的東西 | 密碼、簡訊驗證碼、信用卡背面的末三碼 |
| 網址和官方的不一樣 | 字母換成長得像的數字(examp1e.com)、多了一段(example.com.login-check.example.net) |
| 好到不像真的 | 中獎、退稅、超低價 |
| 意外的附件 | 「發票.zip」「薪資調整.exe」 |
遇到可疑訊息怎麼做
- 不要點訊息裡的連結登入。自己打官方網址,或打開原本就裝好的官方 App 查看。
- 用官方網站上的電話查證,不要打訊息裡留的電話。
- 已經輸入了密碼:立刻到官方網站改密碼,並檢查其他用同一組密碼的帳號。已經輸入了信用卡:馬上打給發卡銀行。
- 在臺灣,懷疑是詐騙可以撥打 165 反詐騙諮詢專線查證。
密碼與多因素驗證
密碼:長度最重要
猜密碼的難度取決於「所有可能的組合有多少」:可用字元數的密碼長度次方。
| 密碼規則 | 可能的組合數 |
|---|---|
| 6 位數字 | 10⁶=100 萬 |
| 8 個小寫字母 | 26⁸ ≈ 2.1×10¹¹ |
| 8 個大小寫字母加數字 | 62⁸ ≈ 2.2×10¹⁴ |
| 16 個小寫字母 | 26¹⁶ ≈ 4.4×10²² |
把長度加倍,組合數不是變兩倍,而是變成原本的平方。所以一句好記的長句子(例如四、五個不相關的詞串在一起)通常比短而複雜的密碼更安全,也更好記。
另外兩個原則:
- 每個網站用不同的密碼。一個網站外洩時,別人會拿同一組帳號密碼去試其他網站。記不住這麼多組,就用密碼管理器。
- 不要用個人資訊:生日、學號、手機號碼都很容易查到。
多因素驗證(MFA)
只靠密碼,密碼外洩就失守了。多因素驗證(multi-factor authentication)要求同時提供兩種以上不同類型的證明:
| 類型 | 例子 |
|---|---|
| 你知道的 | 密碼、PIN 碼 |
| 你擁有的 | 手機(收簡訊驗證碼、驗證器 App 的一次性密碼)、實體安全金鑰 |
| 你本身的 | 指紋、臉部辨識 |
就算密碼被釣走,對方手上沒有你的手機,還是登不進去。也因為這樣,簡訊驗證碼絕對不能告訴任何人,包括自稱是客服或警察的人:給出驗證碼,等於把第二道鎖的鑰匙交出去。
有些網站支援通行金鑰(passkey):用手機或電腦上的指紋、臉部辨識解鎖,背後用的是後面會介紹的公開金鑰密碼學,不需要記密碼,也不會被假網站騙走。
想一想:威脅與防護
你收到簡訊:「包裹地址有誤,請點連結更新資料並支付補運費 25 元。」最好的做法是?
勒索軟體把你電腦裡的檔案全部加密,要求付款才給解密金鑰。事前做好哪一件事,最能讓你不付錢也能恢復檔案?
有人打電話自稱是銀行客服,說你的帳戶有異常,請你念出剛剛收到的簡訊驗證碼「以便解除鎖定」。應該怎麼做?
加密的基本名詞與凱撒密碼
加密(encryption)是把看得懂的資料變成看不懂的資料,只有擁有正確金鑰的人才能還原。
| 名詞 | 意思 |
|---|---|
| 明文(plaintext) | 原本的訊息 |
| 密文(ciphertext) | 加密後的訊息 |
| 演算法 | 加密與解密的步驟 |
| 金鑰(key) | 演算法需要的祕密參數;同一個演算法,換一把金鑰結果就不同 |
現代密碼學有一個重要原則(以提出者 Kerckhoffs 命名):系統的安全應該只依賴金鑰保密,就算演算法完全公開也一樣安全。所以標準的加密演算法都是公開的,經過全世界專家檢驗;要保密的只有金鑰。
凱撒密碼
最古老的例子之一。相傳古羅馬的凱撒在書信中把每個字母換成字母表中往後數第 3 個(A 寫成 D、B 寫成 E),後來把「每個字母往後移固定格數」的方法統稱為凱撒密碼。這裡的金鑰就是「移幾格」。
原文:H E L L O
位移 3 ↓ ↓ ↓ ↓ ↓
密文:K H O O R
它有兩個弱點:
- 金鑰太少:只有 25 種有意義的位移,一個一個試很快就試完。
- 頻率不變:英文裡 E 最常出現,加密後最常出現的字母,很可能就是 E 移過去的。
下面的練習會讓你親手感受這兩點。
對稱加密與公開金鑰加密
對稱加密:同一把金鑰
凱撒密碼的加密與解密用同一把金鑰(位移幾格),這類方法稱為對稱加密。現代最常用的對稱加密是 AES(進階加密標準),金鑰長度 128 或 256 位元,速度很快,適合加密大量資料,例如整顆硬碟或一整段影片串流。
對稱加密有一個難題:金鑰怎麼交給對方? 如果能安全地把金鑰交過去,似乎直接把訊息交過去就好了。在網路上,你和購物網站從來沒見過面,要怎麼約定一把只有雙方知道的金鑰?
公開金鑰加密:一對金鑰
1976 年,Diffie 與 Hellman 發表〈New Directions in Cryptography〉,提出公開金鑰密碼學的構想,以及讓雙方在公開的網路上協商出共同金鑰的方法(Diffie–Hellman 金鑰交換)。1977 年,MIT 的 Rivest、Shamir、Adleman 提出 RSA(取三人姓氏的字首),是第一個廣泛使用的公開金鑰加密方法。
公開金鑰加密(又稱非對稱加密)每個人有一對金鑰:
| 公鑰(public key) | 私鑰(private key) | |
|---|---|---|
| 給誰 | 公開給所有人 | 只有自己保管,永遠不給別人 |
| 加密時 | 別人用你的公鑰加密要給你的訊息 | |
| 解密時 | 只有你的私鑰解得開 |
就像一個大家都能投信、只有你有鑰匙打開的信箱。
RSA 的安全性建立在一個數學事實上:兩個大質數相乘很容易,但把乘積分解回原本的兩個質數非常困難。公鑰裡有乘積 n,私鑰需要知道 n 是哪兩個質數相乘;真實的 n 有數百位數,目前沒有有效率的方法分解它。
兩種一起用
公開金鑰加密的計算比對稱加密慢很多。實務上(例如 HTTPS)兩者合作:先用公開金鑰的方法安全地約定一把臨時的對稱金鑰,接下來大量的資料都用對稱加密。
| 對稱加密 | 公開金鑰加密 | |
|---|---|---|
| 金鑰 | 雙方共用同一把 | 每人一對:公鑰與私鑰 |
| 速度 | 快 | 慢 |
| 難題 | 金鑰怎麼安全地交給對方 | 怎麼確定拿到的公鑰真的是對方的(見後面的憑證) |
| 常見用途 | 加密大量資料 | 約定金鑰、數位簽章 |
剛剛發生了什麼
RSA 的步驟整理如下(練習裡的數字是 p=61、q=53、e=17):
| 步驟 | 計算 | 練習裡的值 |
|---|---|---|
| 選兩個質數 | p、q | 61、53 |
| 算乘積 | n=p×q | 3233 |
| 算 φ(n) | (p−1)×(q−1) | 3120 |
| 選公開指數 e | 和 φ(n) 沒有公因數 | 17 |
| 算私鑰 d | 讓 e×d 除以 φ(n) 餘 1 | 2753 |
| 加密 | c=mᵉ mod n | 65¹⁷ mod 3233=2790 |
| 解密 | m=cᵈ mod n | 2790²⁷⁵³ mod 3233=65 |
mod 是「除以後的餘數」。用公鑰 e 再算一次得不到原文;只有 d 能把 e 的效果抵銷回來。
要算出 d,必須知道 φ(n),也就是必須知道 p 和 q。練習裡的 n=3233 一下子就能分解成 61×53,所以完全不安全;真實的金鑰把 n 做到數百位數,安全性就靠「分解不了」。
雜湊:資料的指紋
雜湊函數(hash function)把任意長度的資料,算成一段固定長度的值,稱為雜湊值或摘要。常用的 SHA-256 不論輸入是一個字還是一整部影片,輸出都是 256 位元(寫成 64 個十六進位字)。
密碼學用的雜湊函數有幾個特性:
| 特性 | 意思 |
|---|---|
| 固定長度 | 輸出長度和輸入長度無關 |
| 同樣的輸入,永遠得到同樣的輸出 | 所以可以拿來比對 |
| 單向 | 從雜湊值沒辦法反推回原本的資料 |
| 雪崩效應 | 輸入只改一個字,輸出大約一半的位元都會改變 |
| 很難找到碰撞 | 實際上找不到兩份不同的資料有相同的雜湊值 |
雜湊不是加密:加密可以用金鑰還原,雜湊不能還原。
雜湊的用途
- 存密碼:網站不存你的密碼,只存密碼的雜湊。登入時把你輸入的密碼算雜湊,和資料庫裡的比對。資料庫就算外洩,對方拿到的也只是雜湊。
- 加鹽(salt):只存雜湊有個問題,兩個人用同一組密碼,雜湊會一模一樣。所以每個使用者配一段隨機字串(鹽),和密碼接在一起再算雜湊;同樣的密碼也會得到不同的雜湊。實務上還會用專為密碼設計、刻意算得比較慢的雜湊方法。
- 檢查檔案有沒有被改過:軟體下載頁常附上檔案的 SHA-256,下載後自己算一次,相同就代表檔案完整、沒有被竄改。
較舊的 MD5、SHA-1 已經被找到碰撞的方法,不建議再用於安全用途。
想一想:加密與雜湊
下面的程式算兩段文字的 SHA-256,會印出什麼?
import hashlib
a = hashlib.sha256('密碼'.encode()).hexdigest()
b = hashlib.sha256(('很長的文字' * 100).encode()).hexdigest()
print(len(a), len(b))
下面的程式用凱撒密碼加密,會印出什麼?
text = 'CAT'
out = ''
for ch in text:
out += chr((ord(ch) - 65 + 3) % 26 + 65)
print(out)
很多不認識的同學都要寄作業檔案給你,而且希望只有你打得開。用公開金鑰加密,應該怎麼做?
數位簽章與憑證
加密解決「別人看不到」。另一個問題是:怎麼確定訊息真的是某人送的,而且途中沒有被改過? 這是數位簽章(digital signature)的工作。
簽章與驗證
數位簽章把公開金鑰的用法反過來:
寄件端:訊息 ──雜湊──▶ 摘要 ──用「自己的私鑰」運算──▶ 簽章
把「訊息+簽章」一起送出
收件端:收到的訊息 ──雜湊──▶ 摘要 A
收到的簽章 ──用「寄件人的公鑰」運算──▶ 摘要 B
A 和 B 相同 ⇒ 簽章有效
- 只有持有私鑰的人簽得出能被公鑰驗證通過的簽章,所以能證明來源。
- 訊息改一個字,雜湊就完全不同,驗證會失敗,所以能證明完整性。
- 簽章不負責保密:訊息本身仍是明文。要保密,得另外加密。
憑證:這把公鑰真的是他的嗎
驗證簽章要用寄件人的公鑰。可是如果有人冒充寄件人,給你一把假的公鑰呢?
數位憑證(certificate)把「身分」和「公鑰」綁在一起,由憑證機構(certificate authority,CA)用它自己的私鑰簽章。瀏覽器與作業系統內建一份信任的憑證機構清單,所以能驗證網站送來的憑證。
你連到 https:// 開頭的網站時,瀏覽器會:
- 收到網站的憑證,用憑證機構的公鑰驗證憑證上的簽章;
- 確認憑證上的網域名稱就是你連的網址、而且還沒過期;
- 用憑證上的公鑰和網站約定一把臨時的對稱金鑰,之後的資料都加密傳送。
網址列的鎖頭代表連線有加密、而且對方確實擁有這個網域的憑證,不代表這個網站是好人:釣魚網站也可以申請到自己網域的憑證。所以還是要看清楚網址是不是官方的。
想一想:網址列的鎖頭
你點開一封信裡的連結,網址是 https://examp1e-bank.example.net,網址列也有鎖頭。下列哪個說法正確?
重點整理
- 資訊安全的三個目標:機密性(只有該看的人看得到)、完整性(沒被偷改)、可用性(需要時用得到)。
- 惡意程式依傳播與行為分成病毒、蠕蟲、木馬、勒索軟體、間諜軟體、廣告軟體等;基本防護是更新、只裝可信來源的軟體、最小權限、定期且離線的備份。
- 社交工程與釣魚騙的是人:急迫感、要驗證碼、網址不對都是警訊。不點訊息裡的連結,自己從官方管道查證;臺灣可撥 165 查證。
- 密碼的強度主要看長度;每個網站不同密碼,用密碼管理器;開啟多因素驗證,驗證碼絕不告訴任何人。
- 對稱加密用同一把金鑰,速度快;公開金鑰加密每人一對金鑰,公鑰加密、私鑰解密,解決了金鑰交換的問題。RSA 的安全性來自大數難以分解。
- 雜湊把資料算成固定長度的指紋,單向、改一個字就全變;網站存「加鹽後的雜湊」而不存密碼。
- 數位簽章用私鑰簽、公鑰驗證,證明來源與完整性;憑證由憑證機構簽發,把身分和公鑰綁在一起。鎖頭不代表網站可信,網址還是要看清楚。
下一課:第 35 課看物聯網、虛擬實境與人工智慧怎麼運作。這一課的觀念在那裡也用得到:數以萬計的連網裝置,每一台都是需要更新與保護的電腦。