IPAS 資訊技術相關知識
IPAS 考試簡介與準備方向
💡 比喻:資訊界的駕照 IPAS 就像是資訊領域的「駕照」:
- 證明你有基本的資訊技術能力
- 企業在招聘時會參考這張證照
- 分為「初級」和「中級」兩種,就像普通駕照和職業駕照
IPAS 經濟部產業人才能力鑑定
┌──────────────────────────────────────────────┐
│ 資訊技術應用類 │
│ │
│ 初級能力鑑定 │
│ ├── 資訊技術應用 │
│ │ ├── 資訊安全概論 │
│ │ ├── 軟體工程概論 │
│ │ ├── 資料庫概論 │
│ │ └── 網路概論 │
│ │ │
│ 中級能力鑑定 │
│ ├── 進階資訊技術應用 │
│ │ ├── 資訊安全實務 │
│ │ ├── 軟體開發與測試 │
│ │ ├── 資料庫管理 │
│ │ └── 網路管理 │
└──────────────────────────────────────────────┘
// IPAS 考試準備策略
var examPrep = new ExamStrategy // 考試準備策略
{
ExamName = "IPAS 資訊技術應用", // 考試名稱
Duration = "90 分鐘", // 考試時間
QuestionType = "選擇題", // 題型:全部選擇題
PassingScore = 60, // 及格分數 60 分
Tips = new List<string> // 準備建議
{
"每個領域都要讀,不能只挑喜歡的", // 四個領域平均出題
"歷屆試題一定要做,至少做三年份", // 考古題非常重要
"概念理解比死背重要", // 理解原理才能應變
"計算題要練熟(子網路遮罩、正規化)", // 計算題是拿分關鍵
}
};
資訊安全基礎(CIA 三要素)
💡 比喻:保管箱的三個特性
- 機密性 (Confidentiality):只有你有鑰匙能打開(防偷看)
- 完整性 (Integrity):箱子裡的東西不能被偷偷換掉(防竄改)
- 可用性 (Availability):你想用的時候隨時能打開(防故障)
// CIA 三要素是資訊安全的核心
public class InformationSecurity // 資訊安全基礎
{
// 機密性 (Confidentiality):防止未授權存取
public void ProtectConfidentiality() // 保護機密性
{
// 加密:把資料變成看不懂的密文
var encrypted = Encrypt(data, key); // 加密資料
// HTTPS:網路傳輸加密
var secureUrl = "https://example.com"; // 使用 HTTPS 協定
// 存取控制:只有授權人員能看
if (!user.HasPermission("read")) // 檢查使用者權限
throw new UnauthorizedException(); // 沒有權限就拒絕
}
// 完整性 (Integrity):確保資料沒被竄改
public void ProtectIntegrity() // 保護完整性
{
// 雜湊:計算資料的「指紋」
var hash = SHA256.HashData(data); // 計算雜湊值
// 數位簽章:證明資料來源可信
var signature = SignData(data, privateKey); // 用私鑰簽名
// 版本控制:追蹤所有修改記錄
git.Commit("修改了設定檔"); // 用 Git 追蹤變更
}
// 可用性 (Availability):確保服務隨時可用
public void ProtectAvailability() // 保護可用性
{
// 備份:定期備份資料
BackupDatabase("daily"); // 每日備份
// 負載均衡:分散流量
var lb = new LoadBalancer(servers); // 負載均衡器
// 災難復原:有備援方案
var drPlan = new DisasterRecoveryPlan(); // 災難復原計畫
}
}
常見的資安威脅
// IPAS 考試常考的資安威脅類型
var securityThreats = new Dictionary<string, string> // 資安威脅對照表
{
// 社交工程攻擊(針對人的弱點)
["釣魚攻擊 Phishing"] = "假冒銀行寄信騙你輸入密碼", // 最常見的攻擊
["魚叉式釣魚 Spear"] = "針對特定人物的釣魚攻擊", // 更精準的攻擊
["社交工程 Social Eng."] = "假裝是 IT 人員騙你給密碼", // 利用人性弱點
// 惡意程式(針對電腦的攻擊)
["病毒 Virus"] = "附著在程式上,會自我複製", // 需要宿主程式
["蠕蟲 Worm"] = "不需宿主,自動透過網路傳播", // 不需要人操作
["木馬 Trojan"] = "偽裝成正常程式的惡意軟體", // 偽裝成有用程式
["勒索軟體 Ransomware"] = "加密你的檔案,要你付贖金", // 近年最猖獗
// 網路攻擊
["DDoS"] = "大量假流量癱瘓你的伺服器", // 分散式阻斷攻擊
["SQL Injection"] = "在輸入框注入 SQL 指令", // 注入攻擊
["XSS"] = "在網頁注入惡意 JavaScript", // 跨站腳本攻擊
["MITM"] = "中間人攻擊,竊聽你的通訊", // 中間人攻擊
};
加密基礎概念
// 對稱加密 vs 非對稱加密
// 對稱加密:同一把鑰匙加密和解密
var key = GenerateKey(); // 產生一把鑰匙
var encrypted = AES.Encrypt(data, key); // 用鑰匙加密
var decrypted = AES.Decrypt(encrypted, key); // 用同一把鑰匙解密
// 優點:速度快 | 缺點:鑰匙怎麼安全地給對方?
// 非對稱加密:公鑰加密,私鑰解密
var (publicKey, privateKey) = RSA.GenerateKeyPair(); // 產生一對鑰匙
var encrypted = RSA.Encrypt(data, publicKey); // 用公鑰加密(公開)
var decrypted = RSA.Decrypt(encrypted, privateKey); // 用私鑰解密(保密)
// 優點:不用交換私鑰 | 缺點:速度慢
// 雜湊 (Hash):不可逆的「指紋」
var hash = SHA256.ComputeHash(password); // 密碼雜湊
// 特性:同樣輸入一定得到同樣輸出 // 確定性
// 特性:無法從 hash 反推原始資料 // 不可逆性
// 特性:輸入差一點點,輸出差很多 // 雪崩效應
軟體工程基礎(SDLC、敏捷開發)
💡 比喻:蓋房子的不同方式
- 瀑布式開發:先畫完所有設計圖 → 打地基 → 蓋結構 → 裝潢(一步一步來)
- 敏捷開發:先蓋一間小木屋能住 → 再加房間 → 再加車庫(邊蓋邊改)
SDLC 軟體開發生命週期
瀑布式模型 (Waterfall)
┌──────────┐
│ 需求分析 │ → 了解客戶要什麼
├──────────┤
│ 系統設計 │ → 決定怎麼做
├──────────┤
│ 實作開發 │ → 寫程式
├──────────┤
│ 測試驗證 │ → 找 Bug
├──────────┤
│ 部署上線 │ → 給客戶用
├──────────┤
│ 維護運營 │ → 持續修 Bug
└──────────┘
每個階段完成才能進入下一階段
// SDLC 各階段的工作
var sdlcPhases = new Dictionary<string, List<string>> // SDLC 各階段工作
{
["需求分析"] = new() // 第一階段
{
"訪談客戶,了解需求", // 知道客戶要什麼
"撰寫需求規格書 (SRS)", // 正式文件化
"確認可行性(技術、成本、時間)", // 評估做不做得到
},
["系統設計"] = new() // 第二階段
{
"架構設計(前後端分離?微服務?)", // 決定大方向
"資料庫設計(ER 圖、正規化)", // 設計資料結構
"UI/UX 設計(Wireframe、Mockup)", // 設計使用者介面
},
["實作開發"] = new() // 第三階段
{
"寫程式碼", // 動手寫
"程式碼審查 (Code Review)", // 同事互相檢查
"版本控制 (Git)", // 追蹤所有修改
},
["測試驗證"] = new() // 第四階段
{
"單元測試 (Unit Test)", // 測試個別功能
"整合測試 (Integration Test)", // 測試組合功能
"使用者驗收測試 (UAT)", // 客戶確認OK
},
};
敏捷開發 (Agile / Scrum)
// Scrum 框架的核心概念
public class ScrumFramework // Scrum 敏捷開發框架
{
// 三個角色
public string ProductOwner = "產品負責人"; // 決定「做什麼」
public string ScrumMaster = "Scrum 教練"; // 確保流程順暢
public string DevTeam = "開發團隊"; // 負責「怎麼做」
// Sprint:2-4 週的開發迭代
public class Sprint // 一次衝刺
{
public int DurationWeeks = 2; // 通常 2 週一個 Sprint
public List<string> BacklogItems; // 這次要完成的工作
public string Goal; // 這次 Sprint 的目標
}
// 四個會議
public void SprintPlanning() { } // 計畫會議:決定做什麼
public void DailyStandup() { } // 每日站會:15 分鐘同步進度
public void SprintReview() { } // 檢視會議:展示成果給客戶
public void SprintRetro() { } // 回顧會議:團隊自我改善
}
// 瀑布式 vs 敏捷的比較
// ┌─────────────┬──────────────┬──────────────────┐
// │ 特性 │ 瀑布式 │ 敏捷式 │
// ├─────────────┼──────────────┼──────────────────┤
// │ 需求變更 │ 困難且昂貴 │ 歡迎變更 │
// │ 交付頻率 │ 最後一次交付 │ 每 2-4 週交付 │
// │ 客戶參與 │ 開頭和結尾 │ 全程參與 │
// │ 文件量 │ 大量文件 │ 夠用就好 │
// │ 風險 │ 後期才發現 │ 早期就發現 │
// │ 適合情境 │ 需求明確 │ 需求常變動 │
// └─────────────┴──────────────┴──────────────────┘
資料庫基礎概念(正規化、ER 圖)
💡 比喻:整理衣櫃
- 未正規化:所有衣服丟在一個大箱子裡(找東西很慢,重複的很多)
- 正規化:分類放好(上衣一區、褲子一區、配件一區,用標籤連結)
正規化 (Normalization)
// 未正規化的資料(很多重複)
// ┌────┬──────┬────────┬──────────┬────────────┐
// │學號│ 姓名 │ 課程1 │ 課程2 │ 老師 │
// ├────┼──────┼────────┼──────────┼────────────┤
// │001 │ 小明 │ C#入門 │ 資料庫 │ 王老師 │
// │002 │ 小華 │ C#入門 │ 網路概論 │ 王老師 │
// └────┴──────┴────────┴──────────┴────────────┘
// 問題:「C#入門」重複出現,「王老師」也重複
// 如果王老師改名,要改很多地方
// 第一正規化 (1NF):消除重複群組
// 規則:每個欄位只能有一個值(原子值)
var firstNF = new List<Enrollment> // 一筆一筆記錄
{
new(StudentId: "001", Name: "小明", // 學生資訊
Course: "C#入門", Teacher: "王老師"), // 一門課一筆
new(StudentId: "001", Name: "小明", // 同一個學生
Course: "資料庫", Teacher: "李老師"), // 另一門課另一筆
};
// 第二正規化 (2NF):消除部分相依
// 規則:非主鍵欄位必須完全依賴主鍵
// 把「學生」和「選課」分開
// 第三正規化 (3NF):消除遞移相依
// 規則:非主鍵欄位不能依賴其他非主鍵欄位
// 把「課程」和「老師」也分開
// 正規化後的結構
public class Student // 學生資料表
{
public string StudentId { get; set; } // 主鍵:學號
public string Name { get; set; } // 姓名
}
public class Course // 課程資料表
{
public string CourseId { get; set; } // 主鍵:課程編號
public string CourseName { get; set; } // 課程名稱
public string TeacherId { get; set; } // 外鍵:老師編號
}
public class Enrollment // 選課資料表(關聯表)
{
public string StudentId { get; set; } // 外鍵:學號
public string CourseId { get; set; } // 外鍵:課程編號
}
// 優點:減少重複、方便維護、避免異常
ER 圖 (Entity-Relationship Diagram)
ER 圖的基本元素
┌─────────────┐ ┌─────────────┐
│ 學生 │ │ 課程 │
│ (Entity) │ │ (Entity) │
├─────────────┤ ├─────────────┤
│ *學號 (PK) │ │ *課程編號(PK)│
│ 姓名 │ │ 課程名稱 │
│ 電話 │ │ 學分數 │
└──────┬──────┘ └──────┬──────┘
│ N M │
│ ┌──────────┐ │
└────┤ 選課 ├─────┘
│(Relation) │
├──────────┤
│ 成績 │
└──────────┘
關係類型:
1:1 一對一(一個人有一個身分證)
1:N 一對多(一個老師教多門課)
M:N 多對多(多個學生選多門課)→ 需要關聯表
// 用 Entity Framework 實現 ER 圖的關係
public class Teacher // 老師實體
{
public int Id { get; set; } // 主鍵
public string Name { get; set; } // 姓名
public List<Course> Courses { get; set; } // 一對多:一個老師多門課
}
public class Student // 學生實體
{
public int Id { get; set; } // 主鍵
public string Name { get; set; } // 姓名
public List<Enrollment> Enrollments { get; set; }// 多對多用關聯表
}
網路基礎(TCP/IP、子網路)
💡 比喻:寄信的過程
- IP 位址:收件人的地址(告訴郵差送去哪裡)
- Port:收件人的房間號碼(同一棟大樓的不同房間)
- TCP:掛號信(確保對方收到,收不到會重寄)
- UDP:明信片(寄出去就不管了,快但不保證送達)
TCP/IP 四層模型
TCP/IP 四層模型 vs OSI 七層模型
┌────────────┬───────────────┬──────────────────┐
│ TCP/IP │ OSI │ 常見協定 │
├────────────┼───────────────┼──────────────────┤
│ 應用層 │ 應用層 │ HTTP, HTTPS, │
│ │ 表示層 │ FTP, SMTP, │
│ │ 會議層 │ DNS, SSH │
├────────────┼───────────────┼──────────────────┤
│ 傳輸層 │ 傳輸層 │ TCP, UDP │
├────────────┼───────────────┼──────────────────┤
│ 網路層 │ 網路層 │ IP, ICMP, ARP │
├────────────┼───────────────┼──────────────────┤
│ 網路介面層 │ 資料鏈結層 │ Ethernet, Wi-Fi │
│ │ 實體層 │ 光纖, 雙絞線 │
└────────────┴───────────────┴──────────────────┘
// 常用 Port 號碼(IPAS 必考!)
var commonPorts = new Dictionary<int, string> // 常見 Port 對照表
{
[20] = "FTP 資料傳輸", // 檔案傳輸(資料)
[21] = "FTP 控制", // 檔案傳輸(控制)
[22] = "SSH 安全遠端連線", // 加密的遠端登入
[23] = "Telnet 遠端連線(不安全)", // 明文傳輸,已淘汰
[25] = "SMTP 寄信", // 寄出電子郵件
[53] = "DNS 網域名稱解析", // 把網址轉成 IP
[80] = "HTTP 網頁", // 一般網頁
[110] = "POP3 收信", // 收電子郵件
[143] = "IMAP 收信(進階)", // 進階收信協定
[443] = "HTTPS 加密網頁", // 加密的網頁
[3306] = "MySQL 資料庫", // MySQL 預設 Port
[3389] = "RDP 遠端桌面", // Windows 遠端桌面
};
// TCP vs UDP 的差異
var tcpVsUdp = new // TCP 和 UDP 比較
{
TCP = new // TCP 傳輸控制協定
{
連線方式 = "三次握手建立連線", // SYN → SYN-ACK → ACK
可靠性 = "保證資料送達、順序正確", // 遺失會重傳
速度 = "較慢(因為要確認)", // 可靠但慢
適用 = "網頁、電子郵件、檔案傳輸", // 需要完整資料的場景
},
UDP = new // UDP 使用者資料報協定
{
連線方式 = "不需建立連線", // 直接發送
可靠性 = "不保證送達", // 遺失就算了
速度 = "很快(不用等確認)", // 快但不可靠
適用 = "視訊通話、線上遊戲、DNS", // 要求即時性的場景
},
};
子網路遮罩 (Subnet Mask)
// IP 位址的組成
// IPv4 位址:32 位元,分成 4 組(每組 8 位元)
// 例如:192.168.1.100
// 子網路遮罩:區分「網路部分」和「主機部分」
var ip = "192.168.1.100"; // IP 位址
var subnetMask = "255.255.255.0"; // 子網路遮罩(/24)
// 二進位表示法
// IP: 11000000.10101000.00000001.01100100 // 192.168.1.100
// Mask: 11111111.11111111.11111111.00000000 // 255.255.255.0
// ──────────────────────────────────────────
// 網路: 11000000.10101000.00000001 // 192.168.1(前 24 位)
// 主機: 01100100 // .100(後 8 位)
// 常見的子網路遮罩
var subnets = new Dictionary<string, string> // 子網路遮罩對照表
{
["255.0.0.0"] = "/8 → 可用主機數約 1600 萬", // A 類網路
["255.255.0.0"] = "/16 → 可用主機數約 65000", // B 類網路
["255.255.255.0"] = "/24 → 可用主機數 254", // C 類網路(最常見)
["255.255.255.128"]="/25 → 可用主機數 126", // 切半
["255.255.255.192"]="/26 → 可用主機數 62", // 切四份
};
// 計算可用主機數的公式
int CalcHosts(int prefixLength) // 計算可用主機數
{
int hostBits = 32 - prefixLength; // 主機部分的位元數
int totalHosts = (int)Math.Pow(2, hostBits); // 2 的 n 次方
return totalHosts - 2; // 減掉網路位址和廣播位址
}
// CalcHosts(24) = 2^8 - 2 = 254 // /24 有 254 台主機
// CalcHosts(25) = 2^7 - 2 = 126 // /25 有 126 台主機
考試技巧與常見題型分析
// IPAS 考試常見題型
var examTopics = new Dictionary<string, List<string>> // 各領域重點題型
{
["資訊安全"] = new() // 資安相關題型
{
"CIA 三要素的定義和應用場景", // 必考基礎題
"對稱/非對稱加密的差異", // 加密概念
"各種資安攻擊的辨識", // 知道每種攻擊特徵
"防火牆和 IDS/IPS 的功能", // 網路安全設備
},
["軟體工程"] = new() // 軟工相關題型
{
"SDLC 各階段的工作內容", // 瀑布式模型
"敏捷開發 vs 瀑布式的比較", // 方法論比較
"測試層級(單元/整合/系統/驗收)", // 測試概念
"UML 圖的類型和用途", // 統一塑模語言
},
["資料庫"] = new() // 資料庫相關題型
{
"正規化(1NF, 2NF, 3NF)", // 最常考的計算題
"SQL 基本語法 (SELECT, JOIN)", // SQL 查詢
"ER 圖的關係類型", // 一對一/一對多/多對多
"交易的 ACID 特性", // 交易管理
},
["網路概論"] = new() // 網路相關題型
{
"TCP/IP 和 OSI 模型的對應", // 網路層級
"常用 Port 號碼", // 必背!
"子網路遮罩的計算", // 計算題
"HTTP 狀態碼的意義", // 200/404/500 等
},
};
// HTTP 狀態碼(Web 開發必知)
var httpStatusCodes = new Dictionary<int, string> // HTTP 狀態碼
{
[200] = "OK - 請求成功", // 一切正常
[201] = "Created - 建立成功", // POST 成功建立資源
[301] = "Moved Permanently - 永久重導向", // 網址搬家了
[302] = "Found - 暫時重導向", // 暫時去別的地方
[400] = "Bad Request - 請求格式錯誤", // 你送的資料有問題
[401] = "Unauthorized - 未授權", // 你還沒登入
[403] = "Forbidden - 禁止存取", // 你沒有權限
[404] = "Not Found - 找不到", // 網頁不存在
[500] = "Internal Server Error - 伺服器錯誤", // 伺服器壞了
[503] = "Service Unavailable - 服務不可用", // 伺服器太忙
};
// ACID 交易特性
var acidProperties = new Dictionary<string, string> // 交易的四大特性
{
["Atomicity 原子性"] = "交易要嘛全部成功,要嘛全部失敗", // 不會只做一半
["Consistency 一致性"] = "交易前後資料必須保持一致", // 不會出現矛盾
["Isolation 隔離性"] = "多個交易同時進行不會互相影響", // 彼此獨立
["Durability 持久性"] = "交易完成後的結果會永久保存", // 不會突然消失
};
答題策略
// 考試答題策略
public class ExamTips // 考試小技巧
{
public void AnswerStrategy() // 答題策略
{
// 1. 先做有把握的題目
var easyQuestions = questions // 先找簡單的題目
.Where(q => q.Confidence > 0.8); // 有八成把握的先做
// 2. 刪去法
// 四選一,通常可以先排除 2 個明顯錯的
// 剩下 2 個猜也有 50% 機率 // 比瞎猜 25% 好很多
// 3. 關鍵字作答法
// 題目中的關鍵字通常暗示答案
// 「確保資料不被竄改」→ 完整性 (Integrity) // 看到「竄改」想到完整性
// 「防止未授權存取」→ 機密性 (Confidentiality) // 看到「未授權」想到機密性
// 「系統隨時可用」→ 可用性 (Availability) // 看到「隨時可用」想到可用性
// 4. 時間管理
var timePerQuestion = 90.0 / 50; // 90 分鐘 50 題
// 每題平均 1.8 分鐘 // 不要在一題上花太久
// 先做完全部,再回頭檢查不確定的 // 確保每題都有作答
}
}
🤔 我這樣寫為什麼會錯?
❌ 錯誤 1:搞混 CIA 三要素
// ❌ 常見混淆
// 題目:「某公司的網站被駭客入侵,資料被修改」
// 錯誤答案:這是違反「機密性」 // 很多人選這個
// ✅ 正確答案:這是違反「完整性」 // 資料被「修改」= 完整性
// 記憶口訣:
// 被偷看 → 機密性 (Confidentiality) // 不該看到的人看到了
// 被竄改 → 完整性 (Integrity) // 資料被改了
// 掛掉了 → 可用性 (Availability) // 服務不能用了
❌ 錯誤 2:正規化的順序搞不清楚
// ❌ 以為 2NF 就是把所有欄位拆開
// 正規化是有順序的,必須先滿足前一級
// ✅ 正確的正規化步驟
// 1NF:消除重複群組(每格只有一個值) // 先做這個
// 2NF:消除部分相依(非主鍵欄位完全依賴主鍵) // 1NF 做完才做這個
// 3NF:消除遞移相依(非主鍵欄位不依賴其他非主鍵) // 2NF 做完才做這個
// 口訣:「一格一值 → 完全依賴 → 不傳話」
// 1NF:一個格子只能放一個值(一格一值)
// 2NF:非主鍵欄位要完全依賴整個主鍵(完全依賴)
// 3NF:非主鍵欄位之間不能有相依關係(不傳話)
❌ 錯誤 3:子網路計算粗心
// ❌ 忘記減 2
int wrongHosts = (int)Math.Pow(2, 8); // 2^8 = 256
// 錯!要扣掉網路位址和廣播位址
// ✅ 正確計算
int correctHosts = (int)Math.Pow(2, 8) - 2; // 2^8 - 2 = 254
// 第一個 IP 是網路位址(不能用) // 例如 192.168.1.0
// 最後一個 IP 是廣播位址(不能用) // 例如 192.168.1.255
// 所以可用主機數 = 2^(32-prefix) - 2 // 記得一定要減 2!