From 3b1d18b001c03680c1cae6236fce5d5b67fc0d2f Mon Sep 17 00:00:00 2001 From: Satakun Utama Date: Fri, 23 Jan 2026 20:47:02 +0700 Subject: [PATCH] More fixes --- Acknowledgements.typ | 2 + Chapter2/HTTPS.typ | 14 ++-- Chapter2/Microcontroller.typ | 139 +++++++++++++++++++---------------- Chapter2/NFC.typ | 24 +++--- Chapter2/PIR.typ | 9 +-- Chapter2/TLS.typ | 38 +++++----- Chapter2/X509.typ | 95 ++++++++++++------------ Chapter2/x690.typ | 11 --- Chapter3/Chapter3.typ | 63 ++++++---------- PageTemplate.typ | 89 +++++++++++++++++++--- main.typ | 2 +- 11 files changed, 274 insertions(+), 212 deletions(-) diff --git a/Acknowledgements.typ b/Acknowledgements.typ index 2762151..08e3d0b 100644 --- a/Acknowledgements.typ +++ b/Acknowledgements.typ @@ -4,6 +4,8 @@ #i ผู้จัดทำขอขอบคุณครูที่ปรึกษาและครูที่ปรึกษาร่วม นายภาคิน เหรียญทอง และนายวสันต์ สารคำ ที่ได้ให้คำปรึกษาและคำแนะนำวิธีการในการจัดทำโครงงานให้แก่กลุ่มของข้าพเจ้า ช่วยให้ชิ้นงานสำเร็จลุล่วงตามจุดประสงค์ที่ได้ตั้งไว้อย่างราบรื่น และขอขอบคุณวิทยาลัยเทคนิคหนองคายที่ได้ให้โอกาศแก่กลุ่มของข้าพเจ้าในการประดิษฐ์เครื่องยืนยันตัวตนด้วยระบบ NFC นี้ขึ้นมา +#v(1em) + #align(right, grid( columns: 2, column-gutter: 1em, diff --git a/Chapter2/HTTPS.typ b/Chapter2/HTTPS.typ index c5e91db..165825b 100644 --- a/Chapter2/HTTPS.typ +++ b/Chapter2/HTTPS.typ @@ -55,16 +55,16 @@ Foundation; EFF) ด้วยการสนับสนุนจากนัก #[ #set enum(indent: 6em) - + ผู้ใช้เชื่อมั่นว่าอุปกรณ์ของตน โฮสต์เบราว์เซอร์ และวิธีการเข้าถึงเบราว์เซอร์นั้นไม่ถูกบุกรุก (กล่าวคือ + 1. ผู้ใช้เชื่อมั่นว่าอุปกรณ์ของตน โฮสต์เบราว์เซอร์ และวิธีการเข้าถึงเบราว์เซอร์นั้นไม่ถูกบุกรุก (กล่าวคือ ไม่มีการโจมตีซัพพลายเชน) - + ผู้ใช้เชื่อมั่นว่าซอฟต์แวร์เบราว์เซอร์ใช้งาน HTTPS + 2. ผู้ใช้เชื่อมั่นว่าซอฟต์แวร์เบราว์เซอร์ใช้งาน HTTPS ได้อย่างถูกต้องพร้อมกับผู้ให้บริการออกใบรับรองที่ติดตั้งไว้ล่วงหน้าอย่างถูกต้อง - + ผู้ใช้เชื่อมั่นว่าผู้ให้บริการออกใบรับรองจะรับรองเฉพาะเว็บไซต์ที่ถูกต้องตามกฎหมายเท่านั้น (กล่าวคือ + 3. ผู้ใช้เชื่อมั่นว่าผู้ให้บริการออกใบรับรองจะรับรองเฉพาะเว็บไซต์ที่ถูกต้องตามกฎหมายเท่านั้น (กล่าวคือ ผู้ให้บริการออกใบรับรองจะไม่ถูกบุกรุกและไม่มีการออกใบรับรองที่ผิดพลาด) - + เว็บไซต์มีใบรับรองที่ถูกต้อง ซึ่งหมายความว่าได้รับการลงนามโดยผู้ให้บริการที่เชื่อถือได้ - + ใบรับรองระบุเว็บไซต์ได้อย่างถูกต้อง (เช่น เมื่อเบราว์เซอร์เข้าชม https://example.com + 4. เว็บไซต์มีใบรับรองที่ถูกต้อง ซึ่งหมายความว่าได้รับการลงนามโดยผู้ให้บริการที่เชื่อถือได้ + 5. ใบรับรองระบุเว็บไซต์ได้อย่างถูกต้อง (เช่น เมื่อเบราว์เซอร์เข้าชม https://example.com ใบรับรองที่ได้รับนั้นถูกต้องสำหรับ example.com และไม่ใช่ของหน่วยงานอื่น) - + ผู้ใช้เชื่อมั่นว่าเลเยอร์การเข้ารหัสของโปรโตคอล (SSL/TLS) มีความปลอดภัยเพียงพอจากการดักฟัง + 6. ผู้ใช้เชื่อมั่นว่าเลเยอร์การเข้ารหัสของโปรโตคอล (SSL/TLS) มีความปลอดภัยเพียงพอจากการดักฟัง ] #iii HTTPS มีความสำคัญอย่างยิ่งต่อเครือข่ายที่ไม่ปลอดภัยและเครือข่ายที่อาจถูกแทรกแซง @@ -151,7 +151,7 @@ HTTP เริ่มต้นด้วย "http://" และใช้พอร #iiiii มีผู้ให้บริการออกใบรับรองเชิงพาณิชย์จำนวนหนึ่งที่เสนอใบรับรอง SSL/TLS แบบชำระเงินหลายประเภท รวมถึงใบรับรองการตรวจสอบขยาย -#iiiii Let's Encrypt เปิดตัวในเดือนเมษายน 2559 ให้บริการใบรับรอง SSL/TLS +#iiiii Let's Encrypt เปิดตัวในเดือนเมษายน 2559 ให้บริการใบรับรอง#jb SSL/TLS พื้นฐานแบบอัตโนมัติฟรีแก่เว็บไซต์ มูลนิธิ Electronic Frontier Foundation ระบุว่า Let's Encrypt จะทำให้การเปลี่ยนจาก HTTP เป็น HTTPS "ง่ายดายเพียงแค่ออกคำสั่งหรือคลิกปุ่ม" ปัจจุบันผู้ให้บริการเว็บโฮสต์และผู้ให้บริการคลาวด์ส่วนใหญ่ใช้ประโยชน์จาก Let's Encrypt diff --git a/Chapter2/Microcontroller.typ b/Chapter2/Microcontroller.typ index 6fd9e28..e2ac994 100644 --- a/Chapter2/Microcontroller.typ +++ b/Chapter2/Microcontroller.typ @@ -163,33 +163,34 @@ IBM อ้างสิทธิ์ก่อนหน้านี้ คอมพ #iii ณ ปี 2008 มีผู้ขายและสถาปัตยกรรมไมโครคอนโทรลเลอร์จำนวนมาก รวมไปถึง:#jb -#block(inset: (left: 5.5em))[ - + หน่วยประมวลผล ARM core โดยเฉพาะคอร์ประเภท ARM Cortex-M - + Microchip Technology Atmel AVR (8 บิต), AVR32 (32 บิต), และ AT91SAM (32 บิต) - + คอร์ M8C ของ Cypress Semiconductor's ที่ถูกใช้ใน Cypress PSoC ของพวกเขา - + Freescale ColdFire (32 บิต) และ S08 (8 บิต) - + Freescale 68HC11 (8 บิต) และอื่น ๆ ที่มีรากฐานมาจากครอบครัว Motorola 6800 - + Intel 8051, ซึ่งนอกจาก Intel ก็ถูกผลิตโดย NXP Semiconductors, Infineon, และอื่น ๆ +#[ + #set enum(indent: 5.5em) + 1. หน่วยประมวลผล ARM core โดยเฉพาะคอร์ประเภท ARM Cortex-M + 2. Microchip Technology Atmel AVR (8 บิต), AVR32 (32 บิต), และ AT91SAM (32 บิต) + 3. คอร์ M8C ของ Cypress Semiconductor's ที่ถูกใช้ใน Cypress PSoC ของพวกเขา + 4. Freescale ColdFire (32 บิต) และ S08 (8 บิต) + 5. Freescale 68HC11 (8 บิต) และอื่น ๆ ที่มีรากฐานมาจากครอบครัว Motorola 6800 + 6. Intel 8051, ซึ่งนอกจาก Intel ก็ถูกผลิตโดย NXP Semiconductors, Infineon, และอื่น ๆ หลายรายการ - + Infineon: 8 บิต XC800, 16 บิต XE166, 32 บิต XMC4000 (ARM based Cortex M4F), 32 + 7. Infineon: 8 บิต XC800, 16 บิต XE166, 32 บิต XMC4000 (ARM based Cortex M4F), 32 บิต TriCore, และ 32 บิต Aurix Tricore Bit microcontrollers - + Maxim Integrated MAX32600, MAX32620, MAX32625, MAX32630, MAX32650, MAX32640 - + MIPS - + Microchip Technology PIC, (8 บิต PIC16, PIC18, 16 บิต dsPIC33 / PIC24), (32 บิต - PIC32) - + NXP Semiconductors LPC1000, LPC2000, LPC3000, LPC4000 (32 บิต), LPC900, + 8. Maxim Integrated MAX32600, MAX32620, MAX32625, MAX32630, MAX32650, MAX32640 + 9. MIPS + 10. Microchip Technology PIC, (8 บิต PIC16, PIC18, 16 บิต dsPIC33 / PIC24), (32 + บิต PIC32) + 11. NXP Semiconductors LPC1000, LPC2000, LPC3000, LPC4000 (32 บิต), LPC900, LPC700 (8 บิต) - + Parallax Propeller - + PowerPC ISE - + Rabbit 2000 (8 บิต) - + Renesas Electronics: RL78 16 บิต MCU; RX 32 บิต MCU; SuperH; V850 32 บิต MCU; + 12. Parallax Propeller + 13. PowerPC ISE + 14. Rabbit 2000 (8 บิต) + 15. Renesas Electronics: RL78 16 บิต MCU; RX 32 บิต MCU; SuperH; V850 32 บิต MCU; H8; R8C 16 บิต MCU - + Silicon Laboratories ไมโครคอนโทรลเลอร์ Pipelined 8 บิต 8051 + 16. Silicon Laboratories ไมโครคอนโทรลเลอร์ Pipelined 8 บิต 8051 และไมโครคอนโทรลเลอร์แบบ ARM-based 32 บิต สัญญาณผสม - + STMicroelectronics STM8 (8 บิต), ST10 (16 บิต), STM32 (32 บิต), SPC5 + 17. STMicroelectronics STM8 (8 บิต), ST10 (16 บิต), STM32 (32 บิต), SPC5 (automotive 32 บิต) - + Texas Instruments TI MSP430 (16 บิต), MSP432 (32 บิต), C2000 (32 บิต) - + Toshiba TLCS-870 (8 บิต/16 บิต) + 18. Texas Instruments TI MSP430 (16 บิต), MSP432 (32 บิต), C2000 (32 บิต) + 19. Toshiba TLCS-870 (8 บิต/16 บิต) ] #iiii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก @@ -206,22 +207,21 @@ dual-core หรือไมโครโปรเซสเซอร์ RISC-V ยังรวมส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF เครื่องขยายกำลัง เครื่องรับสัญญาณรบกวนต่ำ ตัวกรอง และโมดูลการจัดการพลังงาน -#[ - // #set par(spacing: 0.75em) - #afigure( - image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 2in), - alt: "บอร์ดสีดำ มีพิน GPIO ด้านข้างและมีชิพอยู่บริเวณด้านบนบอร์ด", - attr: [Popolon, CC BY-SA 4.0, - https://commons.wikimedia.org/w/index.php?curid=112634884], - caption: [บอร์ด NodeMCU ที่มี ESP32-C3-32S], - ) +#afigure( + image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 2in), + alt: "บอร์ดสีดำ มีพิน GPIO ด้านข้างและมีชิพอยู่บริเวณด้านบนบอร์ด", + attr: [Popolon, CC BY-SA 4.0, + https://commons.wikimedia.org/w/index.php?curid=112634884], + caption: [บอร์ด NodeMCU ที่มี ESP32-C3-32S], +) - #iii โดยทั่วไปแล้ว ESP32 - จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์หรือนำเสนอเป็นส่วนหนึ่งของชุดการพัฒนาที่มีพินและตัวเชื่อมต่อ - GPIO ที่หลากหลาย โดยมีการกำหนดค่าที่แตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ได้รับการออกแบบโดย - Espressif Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตร - มันเป็นผู้สืบทอดของไมโครคอนโทรลเลอร์ ESP8266 -] +#v(0.5em) + +#iii โดยทั่วไปแล้ว ESP32 +จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์หรือนำเสนอเป็นส่วนหนึ่งของชุดการพัฒนาที่มีพินและตัวเชื่อมต่อ GPIO +ที่หลากหลาย โดยมีการกำหนดค่าที่แตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ได้รับการออกแบบโดย Espressif +Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตร มันเป็นผู้สืบทอดของไมโครคอนโทรลเลอร์ +ESP8266 === Espressif Systems @@ -259,14 +259,15 @@ things (IoT) === Name -#iiii Name คือ ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร (ไม่มีอักขระพิเศษ) +#iiii Name คือ ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร +(ไม่มีอักขระพิเศษ) === Type #iiii Type คือ ประเภทของพาร์ทิชัน สามารถเป็น data หรือ app ได้ #[ - #set enum(indent: 6em) + #set enum(indent: 9.25em) + app คือพาร์ทิชันที่ใช้ในการเก็บแอปพลิเคชัน + data คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป ] @@ -275,46 +276,55 @@ things (IoT) #iiii SubType คือ ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน data และ app -#block(inset: (left: 6em))[ - + data - + ota คือ พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) - โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 - KiB (0x2000 ไบต์) - + nvs คือ พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์, +#[ + #set enum(indent: 9.25em) + 1. data + #listy( + indent: 10.75em, + numbering: thai-numbering, + [ota คือ พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) + โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB + (0x2000 ไบต์)], + [nvs คือ พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์, และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory) โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์) และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64 KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS - นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า - + coredump คือ ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช + นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า], + [coredump คือ ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช โดย core dump นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช - และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000) - + nvs_keys คือ พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS - เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000) - + fat คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ + และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000)], + [nvs_keys คือ พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS + เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000)], + [fat คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling - และการเข้ารหัสได้ - + spiffs คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ - wear leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส - + app - + factory คือ พาร์ทิชันเก็บแอปพลิเคชันเริ่มต้น - โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอปพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA - หรือพาร์ทิชัน OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน ota_0 - สามารถถูกใช้เป็นแอปพลิเคชันเริ่มต้นได้และพาร์ทิชัน factory สามารถถูกนำออกได้ - + ota_0 ถึง ota_15 คือ พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA + และการเข้ารหัสได้], + [spiffs คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ wear + leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส], + ) + 2. app + #listy( + indent: 10.75em, + numbering: thai-numbering, + [factory คือ พาร์ทิชันเก็บแอปพลิเคชันเริ่มต้น + โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอปพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน + OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน ota_0 + สามารถถูกใช้เป็นแอปพลิเคชันเริ่มต้นได้และพาร์ทิชัน factory สามารถถูกนำออกได้], + [ota_0 ถึง ota_15 คือ พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA นั้นจำเป็นต้องใช้พาร์ทิชัน OTA อย่างน้อย 2 พาร์ทิชัน (โดยปกติคือ ota_0 และ ota_1) และจำเป็นต้องใช้พาร์ทิชัน ota ด้วยเช่นกันในการเก็บข้อมูลเกี่ยวกับ OTA โดยสามารถมีพาร์ทิชัน - OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค - + test คือ ใช้สำหรับการทดสอบในโรงงาน + OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค], + [test คือ ใช้สำหรับการทดสอบในโรงงาน], + ) ] === Offset -Offset คือ กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset +#iiii Offset คือ กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset และขนาดของพาร์ทิชันก่อนหน้า 0 อย่างไรก็ตาม Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000) และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น @@ -323,11 +333,12 @@ Offset คือ กำหนดพื้นที่ที่พาร์ทิ === Size -Size คือ ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย 0x), หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000 +#iiii Size คือ ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย 0x), +หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000 === Flags -Flags คือ ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่ +#iiii Flags คือ ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่ == littlefs diff --git a/Chapter2/NFC.typ b/Chapter2/NFC.typ index be5a5db..cd84cf2 100644 --- a/Chapter2/NFC.typ +++ b/Chapter2/NFC.typ @@ -76,12 +76,15 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็ การสื่อสารเกิดขึ้นระหว่างอุปกรณ์ "ตัวเริ่มต้น" ที่ใช้งานอยู่และอุปกรณ์เป้าหมาย ซึ่งอาจเป็น -+ พาสซีฟ โดยอุปกรณ์ตัวเริ่มต้นจะทำหน้าที่เป็นสนามแม่เหล็กพาหะ +#[ + #set enum(indent: 5.5em) + 1. พาสซีฟ โดยอุปกรณ์ตัวเริ่มต้นจะทำหน้าที่เป็นสนามแม่เหล็กพาหะ และอุปกรณ์เป้าหมายจะสื่อสารโดยการปรับสนามแม่เหล็กตกกระทบ ในโหมดนี้ อุปกรณ์เป้าหมายอาจดึงพลังงานจากสนามแม่เหล็กที่ตัวเริ่มต้นจัดหาให้ -+ คล่องแคล่ว โดยทั้งอุปกรณ์เริ่มต้นและอุปกรณ์เป้าหมายสื่อสารกันโดยการสร้างฟิลด์ของตัวเองสลับกัน - อุปกรณ์จะหยุดส่งสัญญาณเพื่อรับข้อมูลจากอีกอุปกรณ์หนึ่ง โหมดนี้กำหนดให้อุปกรณ์ทั้งสองต้องมีแหล่งจ่ายไฟ + 2. คล่องแคล่ว โดยทั้งอุปกรณ์เริ่มต้นและอุปกรณ์เป้าหมายสื่อสารกันโดยการสร้างฟิลด์ของตัวเองสลับกัน + อุปกรณ์จะหยุดส่งสัญญาณเพื่อรับข้อมูลจากอีกอุปกรณ์หนึ่ง โหมดนี้กำหนดให้อุปกรณ์ทั้งสองต้องมีแหล่งจ่ายไฟ +] #figure( table( @@ -101,12 +104,15 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็ #iii อุปกรณ์ NFC ที่ใช้งานอยู่ทุกเครื่องสามารถทำงานในโหมดใดโหมดหนึ่งหรือหลายโหมดได้ -+ การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด - ช่วยให้ผู้ใช้ทำธุรกรรมต่างๆ เช่น การชำระเงินหรือการออกตั๋วได้ ดูการจำลองการ์ดโฮสต์ -+ เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC - ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้ -+ NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC - สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ +#[ + #set enum(indent: 5.5em) + + การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด + ช่วยให้ผู้ใช้ทำธุรกรรมต่างๆ เช่น การชำระเงินหรือการออกตั๋วได้ ดูการจำลองการ์ดโฮสต์ + + เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC + ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้ + + NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC + สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ +] แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb โดยทั่วไปจะมีข้อมูล (ณ ปี 2015 มีขนาดระหว่าง 96 ถึง 8,192 ไบต์) diff --git a/Chapter2/PIR.typ b/Chapter2/PIR.typ index b743b2d..8a08c80 100644 --- a/Chapter2/PIR.typ +++ b/Chapter2/PIR.typ @@ -38,13 +38,10 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก โดยปกติแล้วรังสีนี้มองไม่เห็นด้วยตาเปล่าเนื่องจากแผ่รังสีในช่วงความยาวคลื่นอินฟราเรด แต่อุปกรณ์อิเล็กทรอนิกส์ที่ออกแบบมาเพื่อจุดประสงค์นี้ สามารถตรวจจับได้ -#v(1em) - - == เครื่องตรวจจับการเคลื่อนไหวแบบ PIR -\ + #afigure( - image("PIR/Motion_detector.jpg", height: image-height), + image("PIR/Motion_detector.jpg", height: 2in), alt: "เครื่องตรวจจับความเคลื่อนไหว ติดตั้งบนเพดาน", attr: [CHG, Public Domain, https://commons.wikimedia.org/w/index.php?curid=6087132], @@ -187,7 +184,7 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก #iiii บางรุ่นผลิตขึ้นโดยใช้กระจกพาราโบลา แบบแบ่งส่วนภายใน เพื่อรวมพลังงานอินฟราเรด ในกรณีที่ใช้กระจก ฝาครอบกระจกพลาสติกโดยทั่วไปจะไม่มีเลนส์เฟรสเนลหล่อขึ้นรูป -=== PIR ชนิดกระจกแบ่งส่วน +#h(12em) 1) PIR ชนิดกระจกแบ่งส่วน #afigure( image("PIR/Front-(mirror_type).jpg", height: 2in), diff --git a/Chapter2/TLS.typ b/Chapter2/TLS.typ index 314dc33..d3be639 100644 --- a/Chapter2/TLS.typ +++ b/Chapter2/TLS.typ @@ -43,21 +43,21 @@ Navigator #block(inset: (left: 6em))[ + การจับมือเริ่มต้นเมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS - เพื่อขอการเชื่อมต่อที่ปลอดภัยและไคลเอนต์แสดงรายการชุดรหัสที่รองรับ (รหัสและฟังก์ชันแฮช) -+ จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ -+ โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง - (CA) ที่เชื่อถือได้ซึ่งรับรองความถูกต้องของใบรับรอง และคีย์การเข้ารหัสสาธารณะของเซิร์ฟเวอร์ -+ ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ -+ ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้: - + เข้ารหัสตัวเลขสุ่ม (PreMasterSecret) - ด้วยคีย์สาธารณะของเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังเซิร์ฟเวอร์ - (ซึ่งเฉพาะเซิร์ฟเวอร์เท่านั้นที่จะสามารถถอดรหัสด้วยคีย์ส่วนตัว) - จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ - + ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี) - เพื่อสร้างคีย์เซสชันแบบสุ่มและไม่ซ้ำกันอย่างปลอดภัยสำหรับการเข้ารหัสและถอดรหัส - ซึ่งมีคุณสมบัติเพิ่มเติมของการปกปิดแบบส่งต่อ : หากคีย์ส่วนตัวของเซิร์ฟเวอร์ถูกเปิดเผยในอนาคต - จะไม่สามารถใช้คีย์นั้นเพื่อถอดรหัสเซสชันปัจจุบันได้ - แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม + เพื่อขอการเชื่อมต่อที่ปลอดภัยและไคลเอนต์แสดงรายการชุดรหัสที่รองรับ (รหัสและฟังก์ชันแฮช) + + จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ + + โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง + (CA) ที่เชื่อถือได้ซึ่งรับรองความถูกต้องของใบรับรอง และคีย์การเข้ารหัสสาธารณะของเซิร์ฟเวอร์ + + ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ + + ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้ + + เข้ารหัสตัวเลขสุ่ม (PreMasterSecret) + ด้วยคีย์สาธารณะของเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังเซิร์ฟเวอร์ + (ซึ่งเฉพาะเซิร์ฟเวอร์เท่านั้นที่จะสามารถถอดรหัสด้วยคีย์ส่วนตัว) + จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ + + ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี) + เพื่อสร้างคีย์เซสชันแบบสุ่มและไม่ซ้ำกันอย่างปลอดภัยสำหรับการเข้ารหัสและถอดรหัส + ซึ่งมีคุณสมบัติเพิ่มเติมของการปกปิดแบบส่งต่อ โดยหากคีย์ส่วนตัวของเซิร์ฟเวอร์ถูกเปิดเผยในอนาคต + จะไม่สามารถใช้คีย์นั้นเพื่อถอดรหัสเซสชันปัจจุบันได้ + แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม ] #iii @@ -76,7 +76,7 @@ TLS จะล้มเหลวและการเชื่อมต่อจ #[ #set enum(indent: 6em) - + การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้ + 1. การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้ อัลกอริทึมคีย์แบบสมมาตรในการเข้ารหัสข้อมูลที่ส่ง คีย์สำหรับการเข้ารหัสแบบสมมาตรนี้จะถูกสร้างขึ้นอย่างเฉพาะเจาะจงสำหรับแต่ละการเชื่อมต่อ และอิงจากความลับร่วมที่เจรจากันไว้เมื่อเริ่มต้นเซสชัน @@ -85,9 +85,9 @@ TLS จะล้มเหลวและการเชื่อมต่อจ (ความลับที่เจรจากันไว้จะไม่สามารถเข้าถึงได้โดยผู้ดักฟังและไม่สามารถได้รับ แม้แต่โดยผู้โจมตีที่วางตัวเองอยู่ตรงกลางการเชื่อมต่อ) และเชื่อถือได้ (ไม่มีผู้โจมตีคนใดสามารถแก้ไขการสื่อสารระหว่างการเจรจาโดยไม่ถูกตรวจพบ) -+ การยืนยันตัวตนของฝ่ายที่สื่อสารสามารถยืนยันได้โดยใช้การเข้ารหัสด้วยคีย์สาธารณะการยืนยันตัวตนนี้จำเป็นสำหรับเซิร์ฟเวอร์และเป็นทางเลือกสำหรับไคลเอนต์ -+ การเชื่อมต่อมีความน่าเชื่อถือ (หรือมีความสมบูรณ์) - เนื่องจากข้อความแต่ละข้อความที่ส่งออกจะมีการตรวจสอบความสมบูรณ์ของข้อความโดยใช้รหัสยืนยันข้อความเพื่อป้องกันการสูญหายหรือการเปลี่ยนแปลงข้อมูลที่ไม่ถูกตรวจพบระหว่างการส่งข้อมูล + 2. การยืนยันตัวตนของฝ่ายที่สื่อสารสามารถยืนยันได้โดยใช้การเข้ารหัสด้วยคีย์สาธารณะการยืนยันตัวตนนี้จำเป็นสำหรับเซิร์ฟเวอร์และเป็นทางเลือกสำหรับไคลเอนต์ + 3. การเชื่อมต่อมีความน่าเชื่อถือ (หรือมีความสมบูรณ์) + เนื่องจากข้อความแต่ละข้อความที่ส่งออกจะมีการตรวจสอบความสมบูรณ์ของข้อความโดยใช้รหัสยืนยันข้อความเพื่อป้องกันการสูญหายหรือการเปลี่ยนแปลงข้อมูลที่ไม่ถูกตรวจพบระหว่างการส่งข้อมูล ] #iii TLS รองรับวิธีการที่หลากหลายสำหรับการแลกเปลี่ยนคีย์ การเข้ารหัสข้อมูล diff --git a/Chapter2/X509.typ b/Chapter2/X509.typ index 51abc50..d156a6b 100644 --- a/Chapter2/X509.typ +++ b/Chapter2/X509.typ @@ -16,7 +16,7 @@ TLS/SSL ซึ่งเป็นพื้นฐานของ HTTPS โปร #iii X.509 ยังกำหนดรายการเพิกถอนใบรับรองซึ่งเป็นวิธีการแจกจ่ายข้อมูลเกี่ยวกับใบรับรองที่ถือว่าไม่ถูกต้องโดยผู้มีอำนาจลงนาม ตลอดจนอัลกอริทึมการตรวจสอบเส้นทางการรับรองซึ่งช่วยให้ใบรับรองได้รับการลงนามโดยใบรับรอง CA -ตัวกลาง ซึ่งใบรับรองเหล่านี้จะได้รับการลงนามโดยใบรับรองอื่นๆ ต่อไปจนไปถึงจุดยึดที่เชื่อถือได้ในที่สุด +ตัวกลาง ซึ่งใบรับรองเหล่านี้จะได้รับการลงนามโดยใบรับรองอื่น ๆ ต่อไปจนไปถึงจุดยึดที่เชื่อถือได้ในที่สุด #iii X.509 ถูกกำหนดโดย "Standardization Sector" ของ ITU (SG17 ของ ITU-T) ใน ITU-T Study Group 17 และมีพื้นฐานมาจาก Abstract Syntax Notation One (ASN.1) @@ -28,18 +28,20 @@ Notation One (ASN.1) #iiii โครงสร้างของใบรับรองดิจิทัล X.509 v3 มีดังนี้ -+ ใบรับรอง - + หมายเลขเวอร์ชัน - + หมายเลขซีเรียล - + รหัสอัลกอริทึมลายเซ็น - + ชื่อผู้ออก - + ระยะเวลาใช้งานไม่ก่อนหรือไม่หลังจากนั้น - + ชื่อเรื่อง - + ข้อมูลคีย์สาธารณะของเรื่องได้แก่อัลกอริทึมคีย์สาธารณะ - คีย์สาธารณะของเรื่องเช่นรหัสประจำตัวผู้ออก (ไม่จำเป็น) - รหัสประจำตัวเฉพาะเรื่อง (ไม่จำเป็น) ส่วนขยาย (ไม่จำเป็น) -+ อัลกอริทึมลายเซ็นใบรับรอง -+ ลายเซ็นใบรับรอง +#block(inset: (left: 9.25em))[ + + ใบรับรอง + + หมายเลขเวอร์ชัน + + หมายเลขซีเรียล + + รหัสอัลกอริทึมลายเซ็น + + ชื่อผู้ออก + + ระยะเวลาใช้งาน โดยระบุเวลาไม่ก่อนและไม่หลังจากนั้น + + ชื่อเรื่อง + + ข้อมูลคีย์สาธารณะของเรื่อง ได้แก่ อัลกอริทึมคีย์สาธารณะ + คีย์สาธารณะของเรื่องเช่นรหัสประจำตัวผู้ออก (ไม่จำเป็น) รหัสประจำตัวเฉพาะเรื่อง (ไม่จำเป็น) + ส่วนขยาย (ไม่จำเป็น) + + อัลกอริทึมลายเซ็นใบรับรอง + + ลายเซ็นใบรับรอง +] #iiii ฟิลด์ส่วนขยาย (ถ้ามี) จะเป็นลำดับของส่วนขยายใบรับรองอย่างน้อยหนึ่งรายการ แต่ละส่วนขยายมีรหัสประจำตัวเฉพาะของตัวเอง ซึ่งแสดงเป็นตัวระบุวัตถุ (OID) @@ -71,39 +73,40 @@ Notation One (ASN.1) มีหลายประเภทนามสกุลไฟล์เหล่านี้ยังใช้สำหรับข้อมูลอื่น ๆ เช่น คีย์ส่วนตัวด้วย #[ - #set enum(indent: 9.75em) - + `.pem` -- (อีเมลอิเล็กทรอนิกส์ที่เพิ่มความเป็นส่วนตัว) ใบรับรอง DER ที่เข้ารหัส Base64 - แนบระหว่าง `-----BEGIN CERTIFICATE-----` และ `-----END CERTIFICATE-----` -+ `.cer`, `.crt`, `.der` -- โดยปกติจะอยู่ในรูปแบบไบนารี DER แต่ใบรับรองที่เข้ารหัส Base64 - ก็เป็นเรื่องปกติเช่นกัน (ดู `.pem` ด้านบน) -+ `.p8`, `.p8e`, `.pk8` -- คีย์ส่วนตัวที่ส่งออกตามที่ระบุไว้ใน PKCS\#8 อาจอยู่ในรูปแบบ DER หรือ - PEM ที่ขึ้นต้นด้วย `-----BEGIN PRIVATE KEY-----` คีย์ที่เข้ารหัสจะขึ้นต้นด้วย - `-----BEGIN ENCRYPTED PRIVATE KEY-----` และอาจมี `.p8e` เป็นนามสกุลไฟล์ -+ `.p10`, `.csr` -- PKCS\#10 เป็นคำขอลงนามใบรับรอง (CSR) ในรูปแบบ PEM ขึ้นต้นด้วย - `-----BEGIN CERTIFICATE REQUEST-----` แบบฟอร์มเหล่านี้สร้างขึ้นเพื่อส่งไปยังผู้ออกใบรับรอง - (CA) แบบฟอร์มประกอบด้วยรายละเอียดสำคัญของใบรับรองที่ร้องขอ เช่น ชื่อสามัญ (/CN), หัวเรื่อง, - องค์กร, รัฐ, ประเทศ รวมถึงคีย์สาธารณะของใบรับรองที่ต้องการให้ลงนาม - คีย์เหล่านี้จะได้รับการลงนามโดย CA และใบรับรองจะถูกส่งกลับคืน ใบรับรองที่ส่งคืนคือใบรับรอง - สาธารณะ (ซึ่งมีคีย์สาธารณะแต่ไม่มีคีย์ส่วนตัว) ซึ่งตัวใบรับรองเองสามารถอยู่ในรูปแบบต่างๆ - ได้หลายรูปแบบ แต่โดยปกติจะเป็น `.p7r` -+ `.p7r` -- คำตอบ ของ PKCS\#7 ต่อ CSR ประกอบด้วยใบรับรองที่เพิ่งลงนาม และใบรับรองของ CA - เอง -+ `.p7s` -- ลายเซ็นดิจิทัล PKCS\#7 อาจมีไฟล์หรือข้อความที่ลงนามต้นฉบับ ใช้ใน S/MIME - สำหรับการลงนามในอีเมลกำหนดไว้ใน RFC 2311 -+ `.p7m` -- PKCS\#7 (SignedData, EnvelopedData) ข้อความ เช่น ไฟล์ที่เข้ารหัส - ("enveloped") ข้อความ หรือจดหมายอีเมล MIME กำหนดไว้ใน RFC 2311 -+ `.p7c` -- โครงสร้าง SignedData แบบ "certs-only" ของ PKCS\#7 ที่เสื่อมลง - โดยไม่มีข้อมูลใดๆ ให้ลงนาม กำหนดไว้ใน RFC 2311 -+ `.p7b` -- โครงสร้าง SignedData ของ PKCS\#7 ที่ไม่มีข้อมูล มีเพียงใบรับรองแบบบันเดิลหรือ CRL - (ไม่ค่อยเกิดขึ้น) แต่ไม่มีคีย์ส่วนตัว ใช้รูปแบบ DER หรือ BER หรือ PEM ที่ขึ้นต้นด้วย - `-----BEGIN PKCS7-----` รูปแบบที่ Windows ใช้สำหรับการแลกเปลี่ยนใบรับรอง รองรับโดย Java - แต่มักใช้นามสกุล `.keystore` แทน ซึ่งแตกต่างจากใบรับรองแบบ `.pem` - รูปแบบนี้มีวิธีที่กำหนดไว้สำหรับการรวมใบรับรองเส้นทางการรับรอง -+ `.p12`, `.pfx`, `.pkcs12` -- PKCS\#12 อาจมีใบรับรอง (สาธารณะ) และคีย์ส่วนตัว - (ป้องกันด้วยรหัสผ่าน) ในไฟล์เดียว `.pfx` - _Personal Information eXchange_ PFX - ซึ่งเป็นรุ่นก่อนของ PKCS\#12 (โดยปกติจะมีข้อมูลในรูปแบบ PKCS\#12 เช่น ไฟล์ PFX ที่สร้างใน IIS) -+ `.crl` -- รายการเพิกถอนใบรับรอง (CRL) - หน่วยงานที่ออกใบรับรองจะจัดทำรายการเหล่านี้ขึ้นเพื่อใช้ในการเพิกถอนใบรับรองก่อนหมดอายุ + #set enum(indent: 9.25em) + 1. `.pem` -- (อีเมลอิเล็กทรอนิกส์ที่เพิ่มความเป็นส่วนตัว) ใบรับรอง DER ที่เข้ารหัส Base64 + แนบระหว่าง `-----BEGIN CERTIFICATE-----` และ `-----END CERTIFICATE-----` + 2. `.cer`, `.crt`, `.der` -- โดยปกติจะอยู่ในรูปแบบไบนารี DER แต่ใบรับรองที่เข้ารหัส + Base64 ก็เป็นเรื่องปกติเช่นกัน (ดู `.pem` ด้านบน) + 3. `.p8`, `.p8e`, `.pk8` -- คีย์ส่วนตัวที่ส่งออกตามที่ระบุไว้ใน PKCS\#8 อาจอยู่ในรูปแบบ DER + หรือ PEM ที่ขึ้นต้นด้วย `-----BEGIN PRIVATE KEY-----` คีย์ที่เข้ารหัสจะขึ้นต้นด้วย + `-----BEGIN ENCRYPTED PRIVATE KEY-----` และอาจมี `.p8e` เป็นนามสกุลไฟล์ + 4. `.p10`, `.csr` -- PKCS\#10 เป็นคำขอลงนามใบรับรอง (CSR) ในรูปแบบ PEM ขึ้นต้นด้วย + `-----BEGIN CERTIFICATE REQUEST-----` แบบฟอร์มเหล่านี้สร้างขึ้นเพื่อส่งไปยังผู้ออกใบรับรอง + (CA) แบบฟอร์มประกอบด้วยรายละเอียดสำคัญของใบรับรองที่ร้องขอ เช่น ชื่อสามัญ (/CN), หัวเรื่อง, + องค์กร, รัฐ, ประเทศ รวมถึงคีย์สาธารณะของใบรับรองที่ต้องการให้ลงนาม + คีย์เหล่านี้จะได้รับการลงนามโดย CA และใบรับรองจะถูกส่งกลับคืน ใบรับรองที่ส่งคืนคือใบรับรอง + สาธารณะ (ซึ่งมีคีย์สาธารณะแต่ไม่มีคีย์ส่วนตัว) ซึ่งตัวใบรับรองเองสามารถอยู่ในรูปแบบต่างๆ + ได้หลายรูปแบบ แต่โดยปกติจะเป็น `.p7r` + 5. `.p7r` -- คำตอบ ของ PKCS\#7 ต่อ CSR ประกอบด้วยใบรับรองที่เพิ่งลงนาม และใบรับรองของ + CA เอง + 6. `.p7s` -- ลายเซ็นดิจิทัล PKCS\#7 อาจมีไฟล์หรือข้อความที่ลงนามต้นฉบับ ใช้ใน S/MIME + สำหรับการลงนามในอีเมลกำหนดไว้ใน RFC 2311 + 7. `.p7m` -- PKCS\#7 (SignedData, EnvelopedData) ข้อความ เช่น ไฟล์ที่เข้ารหัส + ("enveloped") ข้อความ หรือจดหมายอีเมล MIME กำหนดไว้ใน RFC 2311 + 8. `.p7c` -- โครงสร้าง SignedData แบบ "certs-only" ของ PKCS\#7 ที่เสื่อมลง + โดยไม่มีข้อมูลใดๆ ให้ลงนาม กำหนดไว้ใน RFC 2311 + 9. `.p7b` -- โครงสร้าง SignedData ของ PKCS\#7 ที่ไม่มีข้อมูล มีเพียงใบรับรองแบบบันเดิลหรือ + CRL (ไม่ค่อยเกิดขึ้น) แต่ไม่มีคีย์ส่วนตัว ใช้รูปแบบ DER หรือ BER หรือ PEM ที่ขึ้นต้นด้วย + `-----BEGIN PKCS7-----` รูปแบบที่ Windows ใช้สำหรับการแลกเปลี่ยนใบรับรอง รองรับโดย + Java แต่มักใช้นามสกุล `.keystore` แทน ซึ่งแตกต่างจากใบรับรองแบบ `.pem` + รูปแบบนี้มีวิธีที่กำหนดไว้สำหรับการรวมใบรับรองเส้นทางการรับรอง + 10. `.p12`, `.pfx`, `.pkcs12` -- PKCS\#12 อาจมีใบรับรอง (สาธารณะ) และคีย์ส่วนตัว + (ป้องกันด้วยรหัสผ่าน) ในไฟล์เดียว `.pfx` - _Personal Information eXchange_ PFX + ซึ่งเป็นรุ่นก่อนของ PKCS\#12 (โดยปกติจะมีข้อมูลในรูปแบบ PKCS\#12 เช่น ไฟล์ PFX ที่สร้างใน + IIS) + 11. `.crl` -- รายการเพิกถอนใบรับรอง (CRL) + หน่วยงานที่ออกใบรับรองจะจัดทำรายการเหล่านี้ขึ้นเพื่อใช้ในการเพิกถอนใบรับรองก่อนหมดอายุ ] #iiii PKCS\#7 เป็นมาตรฐานสำหรับการลงนามหรือเข้ารหัสข้อมูล (เรียกอย่างเป็นทางการว่า diff --git a/Chapter2/x690.typ b/Chapter2/x690.typ index 50f9a45..a6143f4 100644 --- a/Chapter2/x690.typ +++ b/Chapter2/x690.typ @@ -24,14 +24,3 @@ ASN.1 เช่นเดียวกับ CER การเข้ารหัส ในการเข้ารหัสลับและช่วยให้มั่นใจว่าโครงสร้างข้อมูลที่จำเป็นต้องมีการลงนามดิจิทัลจะสร้างการแสดงแบบอนุกรมที่ไม่ซ้ำกัน DER ถือเป็นรูปแบบมาตรฐานของ BER ตัวอย่างเช่นใน BER ค่าบูลีน true สามารถเข้ารหัสเป็นค่าไบต์ที่ไม่ใช่ศูนย์ 255 ค่า ในขณะที่ DER มีวิธีการเข้ารหัสค่าบูลีน true เพียงวิธีเดียว - -#pagebreak() - -ข้อจำกัดการเข้ารหัส DER ที่สำคัญที่สุดคือ: - -1. การเข้ารหัสความยาวจะต้องใช้รูปแบบที่แน่นอน - - นอกจากนี้ จะต้องใช้การเข้ารหัสที่มีความยาวสั้นที่สุดเท่าที่จะเป็นไปได้ -2. บิตสตริง อ็อกเท็ตสตริง และสตริงอักขระที่จำกัดต้องใช้การเข้ารหัสแบบดั้งเดิม -3. องค์ประกอบของชุดจะถูกเข้ารหัสตามลำดับการเรียงลำดับตามค่าแท็ก - -DER ถูกใช้กันอย่างแพร่หลายสำหรับใบรับรอง ดิจิทัลเช่น X.509 diff --git a/Chapter3/Chapter3.typ b/Chapter3/Chapter3.typ index c6c4d0e..6998593 100644 --- a/Chapter3/Chapter3.typ +++ b/Chapter3/Chapter3.typ @@ -47,8 +47,11 @@ === แผนขั้นตอนและวิธีการดำเนินงาน +ตาราง 3.1 ระยะเวลาการดำเนินงาน +#v(0.5em, weak: true) + #table( - columns: 12, + columns: (2fr, 1fr, 1fr, 1fr, 1fr, 1fr), align: ( left + horizon, center, @@ -56,16 +59,10 @@ center, center, center, - center, - center, - center, - center, - center, - center, ), table.header( table.cell( - [ขั้นตอนการ\ ดำเนินการ], + [ขั้นตอนการดำเนินการ], rowspan: 2, ), table.cell( @@ -74,48 +71,30 @@ ), table.cell( [พ.ศ.2569], - colspan: 8, + colspan: 2, ), [ต.ค.], [พ.ย.], [ธ.ค.], [ม.ค.], [ก.พ.], - [มี.ค], - [เม.ย], - [พ.ค.], - [มิ.ย.], - [ก.ค.], - [ส.ค.], ), [ศึกษาค้นคว้าข้อมูล], table.cell(arrow, colspan: 3), [], [], - [], - [], - [], - [], - [], - [], - [เสนอหัวข้อ], arrow, [], [], [], [], [], [], [], [], [], [], - [เสนอครั้งที่ 1], [], arrow, [], [], [], [], [], [], [], [], [], - [ออกแบบและสร้าง], [], table.cell(arrow, colspan: 5), [], [], [], [], [], + [เสนอหัวข้อ], arrow, [], [], [], [], + [เสนอครั้งที่ 1], [], arrow, [], [], [], + [ออกแบบและสร้าง], [], table.cell(arrow, colspan: 3), [], [จัดซื้ออุปกรณ์ทดลอง], [], table.cell(arrow, colspan: 3), [], - [], - [], - [], - [], - [], - [], - [ทดลองการทำงาน], [], [], table.cell(arrow, colspan: 4), [], [], [], [], [], - [ปรับปรุงแก้ไข], [], [], [], [], table.cell(arrow, colspan: 5), [], [], - [เสนอครั้งที่ 2], [], [], [], arrow, [], [], [], [], [], [], [], - [จัดทำรูปเล่ม], table.cell(arrow, colspan: 11), - [นำเสนอโครงงาน], [], [], [], [], [], [], [], [], [], [], [], + [ทดลองการทำงาน], [], [], table.cell(arrow, colspan: 2), [], + [ปรับปรุงแก้ไข], [], [], [], [], arrow, + [เสนอครั้งที่ 2], [], [], [], arrow, [], + [จัดทำรูปเล่ม], table.cell(arrow, colspan: 5), + [นำเสนอโครงงาน], [], [], [], [], [], ) #show: page-theme @@ -146,6 +125,8 @@ == ขั้นตอนการประกอบ +=== การติดตั้งอุปกรณ์ + โครงงานแบ่งออกเป็น 3 โมดูล + โมดูลเซนเซอร์ NFC ขาเข้าและบอร์ด ESP32 @@ -163,12 +144,16 @@ } } -=== โมดูลเซนเซอร์ NFC ขาออก +==== โมดูลเซนเซอร์ NFC ขาเข้าและบอร์ด ESP32 -#i ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ -จากนั้นนำสายไฟร้อยผ่านช่องดังกล่าวและต่อเข้ากับเซนเซอร์ NFC ให้เรียบร้อยตามขั้นตอน +#iiii ทำการเจาะรู -=== การติดตั้งอุปกรณ์ +==== โมดูลเซนเซอร์ NFC ขาออก + +#iiii ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ +จากนั้นนำสายไฟร้อยผ่านช่องดังกล่าวและต่อเข้ากับเซนเซอร์ NFC ให้เรียบร้อย + +==== โมดูลเซนเซอร์ PIR === การเขียนเฟิร์มแวร์ diff --git a/PageTemplate.typ b/PageTemplate.typ index 8a74aaf..ab0b910 100644 --- a/PageTemplate.typ +++ b/PageTemplate.typ @@ -1,3 +1,12 @@ +#let page-numbering(n) = { + let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช") + if n <= chars.len() { + chars.at(n - 1) + } else { + str(n - chars.len()) // fallback to numbers if exceeds available characters + } +} + #let thai-numbering(n) = { let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช") if n <= chars.len() { @@ -5,6 +14,7 @@ } else { str(n - chars.len()) // fallback to numbers if exceeds available characters } + [)] } #let chapter-page(doc) = { @@ -38,6 +48,26 @@ #let iiiiii = h(16.85em) +#let listy( + numbering: "1)", + indent: 1em, + hanging-indent: 0em, + body-spacing: .3em, + ..items, +) = context { + let nums = range(1, items.pos().len() + 1) + let fnums = nums.map(std.numbering.with(numbering)) + let numwidth = calc.max(..fnums.map(it => measure(it).width)) + for (num, item) in fnums.zip(items.pos()) { + block(inset: (left: hanging-indent), { + h(indent - hanging-indent) + box(width: numwidth + body-spacing, stroke: none, num) + item + }) + v(1em, weak: true) + } +} + #let page-theme(doc) = { set page( paper: "a4", @@ -49,7 +79,7 @@ ), header: context [ #h(1fr) - #counter(page).display(thai-numbering) + #counter(page).display(page-numbering) ], ) set text( @@ -101,18 +131,57 @@ } show figure.where(kind: "i-figured-table"): set align(start) show figure.where(kind: table): set figure.caption(position: top) - show figure.caption: it => { - text(weight: "bold")[ - #it.supplement - #it.counter.display(it.numbering) - ] - it.body + show figure.where(kind: table): t => { + show figure.caption: it => { + it.supplement + " " + it.counter.display(it.numbering) + " " + it.body + } + it } show figure.caption.where(position: bottom): it => place(center, it, dy: 2em) - set figure.caption(separator: "") - // show figure.where(kind: image): set figure(gap: 2em) + show figure.where(kind: "i-figured-image"): i => { + show figure.caption: it => { + place( + center, + [ + #text(weight: "bold")[ + #it.supplement + #it.counter.display(it.numbering) + ] + #it.body + ], + dy: 2em, + ) + } + i + } + set figure.caption(separator: " ") show figure.where(kind: image): set block(below: 2.5em) set enum(number-align: start + top) + show enum.item: it => context { + if (it.number == auto) { + return it + } + + let spacing = enum.indent + if spacing == auto { + if enum.tight { + spacing = par.leading + } else { + spacing = par.spacing + } + } + ( + h(spacing) + + [#{ str(it.number) + ")" }] + + h(enum.body-indent) + + it.body + + linebreak() + ) + } set ref(supplement: "หัวข้อ") doc } @@ -132,7 +201,7 @@ ), header: context [ #h(1fr) - #counter(page).display(thai-numbering) + #counter(page).display(page-numbering) ], ) set text( diff --git a/main.typ b/main.typ index 3527245..2616051 100644 --- a/main.typ +++ b/main.typ @@ -38,7 +38,7 @@ column-gutter: 1fr, it.indented(it.prefix(), it.body()), h(1em), - context thai-numbering(counter(page).at(it.element.location()).first()), + context page-numbering(counter(page).at(it.element.location()).first()), ), ) }