
ที่มาภาพ: Unknown Source
วิธีตั้งค่าและใช้ SQLite Encryption Extension บน macOS อย่างปลอดภัย
⚡ สรุป 30 วิ
**SQLite Encryption Extension (SEE) คือส่วนขยายที่ให้ SQLite รองรับการเข้ารหัสข้อมูลโดยอัตโนมัติบนไฟล์ฐานข้อมูล การใช้งาน SEE บน macOS ต้องทำตามขั้นตอนตั้งค่าและคอมไพล์อย่างระมัดระวัง เพื่อป้องกันข้อม…
Overview
**SQLite Encryption Extension (SEE) คือส่วนขยายที่ให้ SQLite รองรับการเข้ารหัสข้อมูลโดยอัตโนมัติบนไฟล์ฐานข้อมูล การใช้งาน SEE บน macOS ต้องทำตามขั้นตอนตั้งค่าและคอมไพล์อย่างระมัดระวัง เพื่อป้องกันข้อมูลรั่วไหลหรือการโจมตีจากผู้ไม่ประสงค์ดี
- เข้ารหัส ทำให้ทุกหน้า (page) ของไฟล์ฐานข้อมูลถูกปกปิดด้วยคีย์ลับ
- ปลอดภัย ต้องใช้คีย์ที่มีความยาวและสุ่มอย่างเพียงพอ
- ง่ายต่อการบูรณาการ สามารถเรียกใช้งานผ่านไลบรารี C/C++ หรือภาษาอื่น ๆ ที่รองรับ SQLite
**Tip: อย่าเก็บคีย์ไว้ในโค้ดต้นฉบับ ควรใช้ Keychain ของ macOS หรือไฟล์ที่เข้ารหัสแยกต่างหาก
Prerequisites
ก่อนเริ่มติดตั้ง SEE เราต้องตรวจสอบสภาพแวดล้อมของเครื่อง macOS ให้พร้อมใช้งาน
- Xcode Command Line Tools ติดตั้งด้วย `xcode-select --install`
- Homebrew เพื่อจัดการแพคเกจ เช่น `brew install openssl`
- git สำหรับดึงซอร์สโค้ด SEE จาก GitHub หรือแหล่งที่มาที่เชื่อถือได้
- macOS เวอร์ชัน 10.13 ขึ้นไป รองรับไลบรารีการเข้ารหัสล่าสุด
ดาวน์โหลดและเตรียมไฟล์ SEE
SEE ไม่เปิดให้ดาวน์โหลดฟรี ต้องซื้อใบอนุญาตจาก SQLite Consortium ก่อน
- ลงทะเบียนที่ https://sqlite.org/see/doc/tradeoffs.html เพื่อรับไฟล์ `sqlite-see.zip`
- แตกไฟล์ในโฟลเดอร์ `$HOME/sqlite-see`
- ตรวจสอบว่าไฟล์ `sqlite3.c`, `sqlite3.h`, `sqlite3ext.h` อยู่ครบ
คอมไพล์ SEE บน macOS
การคอมไพล์ต้องกำหนดค่าให้เชื่อมต่อกับ OpenSSL หรือ CommonCrypto ตามที่ต้องการ
กำหนดค่าการคอมไพล์ด้วย OpenSSL
- **ขั้นตอน 1: ตั้งตัวแปรสภาพแวดล้อมเพื่อบ่งชี้ตำแหน่งของ OpenSSL
```bash export OPENSSL_ROOT_DIR=$(brew --prefix openssl) ```
- **ขั้นตอน 2: ใช้ clang คอมไพล์โดยระบุไฟล์ SEE และลิงก์กับ libcrypto
```bash clang -DSQLITE_HAS_CODEC -I$HOME/sqlite-see -I$OPENSSL_ROOT_DIR/include \ $HOME/sqlite-see/*.c -L$OPENSSL_ROOT_DIR/lib -lcrypto -o libsqlite3see.dylib -dynamiclib ```
ใช้ CommonCrypto (ไม่มีการติดตั้งเพิ่มเติม)
- **ขั้นตอน 1: คอมไพล์โดยกำหนดให้ใช้ CryptoKit ของ Apple
```bash clang -DSQLITE_HAS_CODEC -I$HOME/sqlite-see $HOME/sqlite-see/*.c \ -framework Security -o libsqlite3see.dylib -dynamiclib ```
**Tip: หากต้องการทำงานบนหลายสถาปัตยกรรม (Intel + Apple Silicon) ให้เพิ่ม `-arch x86_64 -arch arm64` เข้าไปในคำสั่งคอมไพล์
ตั้งค่าใช้งาน SEE ในโค้ดของคุณ
หลังจากได้ไฟล์ `.dylib` แล้ว ต้องโหลดไลบรารีและตั้งค่าคีย์ก่อนเปิดฐานข้อมูล
```c #include "sqlite3.h" extern int sqlite3_key(sqlite3 *db, const void *pKey, int nKey); extern int sqlite3_rekey(sqlite3 *db, const void *pNewKey, int nNewKey);
int main(void) { sqlite3 *db; // เปิดไฟล์ฐานข้อมูล (จะถูกสร้างเป็นแบบเข้ารหัสถ้ายังไม่มี) if (sqlite3_open("secure.db", &db) != SQLITE_OK) return 1;
// ตั้งค่าคีย์ (ตัวอย่างใช้ key จาก Keychain หรือ environment variable) const char *key = getenv("SQLITE_KEY"); sqlite3_key(db, key, strlen(key));
// ทำงานกับฐานข้อมูลตามปกติ... sqlite3_close(db); return 0; } ```
- **ควร: ดึงคีย์จาก Keychain (`SecKeychainFindGenericPassword`) หรือจากไฟล์ที่เข้ารหัสด้วย `openssl enc`
- **ห้าม: ใส่คีย์เป็นข้อความตรงในโค้ดหรือเก็บไว้ใน Repository
การจัดการคีย์อย่างปลอดภัย
ความปลอดภัยของ SEE พึ่งพาความลับของคีย์เป็นหลัก
| วิธีเก็บคีย์ | ความปลอดภัย | ความสะดวก |
|---|---|---|
| Keychain ของ macOS | สูง (เข้ารหัสโดยระบบ) | ปานกลาง (ต้องเรียก API) |
| Environment Variable | กลาง (สามารถอ่านจาก `ps` ได้) | สูง (ง่ายต่อการตั้งค่า) |
| ไฟล์ที่เข้ารหัสด้วย OpenSSL | สูง (ต้องใช้รหัสผ่านเพิ่ม) | ต่ำ (ต้องจัดการไฟล์) |
- Keychain เป็นวิธีแนะนำสำหรับแอปพลิเคชันเดสก์ท็อป
- Environment Variable เหมาะกับสคริปต์หรือ CI/CD pipeline ที่มีขั้นตอนกำหนดคีย์อย่างปลอดภัย
**Tip: ตั้งค่า `chmod 600` ให้ไฟล์ที่เก็บคีย์ เพื่อให้ผู้ใช้คนเดียวเท่านั้นสามารถอ่านได้
ตรวจสอบว่าฐานข้อมูลถูกเข้ารหัสจริงหรือไม่
หลังเปิดฐานข้อมูลด้วย SEE ควรทำการตรวจสอบโดยการอ่านบล็อกแรกของไฟล์
```bash xxd -l 16 secure.db ```
- ถ้าเห็นค่าที่เป็นสุ่ม (hex) แสดงว่าไฟล์ถูกเข้ารหัส
- หากเจอข้อความ “SQLite format 3” หมายถึงยังไม่ได้ตั้งค่าคีย์หรือใช้ SQLite ปกติ
การบำรุงรักษาและอัปเดตคีย์
เมื่อคีย์ต้องเปลี่ยน (เช่น พนักงานลาออก) ควรรี-เข้ารหัสฐานข้อมูลทั้งหมด
- **ขั้นตอน: เปิดฐานข้อมูลด้วยคีย์เก่า ใช้ `sqlite3_rekey` เพื่อเปลี่ยนเป็นคีย์ใหม่
```c const char *oldKey = "old_secret"; const char *newKey = "new_secret";
sqlite3_key(db, oldKey, strlen(oldKey)); sqlite3_rekey(db, newKey, strlen(newKey)); ```
- หลังทำเสร็จ ควรลบคีย์เก่าออกจากระบบทั้งหมด
ปัญหาที่พบบ่อยและวิธีแก้ไข
- **Error: “SQLITE_NOTADB” – เกิดเมื่อไฟล์ไม่ได้เข้ารหัสด้วย SEE หรือใช้คีย์ผิด
- ตรวจสอบว่าคุณได้เรียก `sqlite3_key` ก่อนทำคำสั่งใด ๆ
- Segmentation fault ระหว่างคอมไพล์
- ตรวจสอบว่าไฟล์ `.c` ทั้งหมดจาก SEE ถูกระบุในคำสั่งคอมไพล์ และใช้เวอร์ชันของ clang ที่รองรับ macOS เวอร์ชันปัจจุบัน
- Library not loaded: libsqlite3see.dylib – เกิดเมื่อระบบไม่พบไลบรารีที่สร้าง
- เพิ่ม path ของไดเรกทอรีไลบรารีลงใน `DYLD_LIBRARY_PATH` หรือใส่ `@rpath` ตอนลิงก์
สรุป (Summary)
การใช้ SQLite Encryption Extension บน macOS ต้องทำตามขั้นตอนที่ชัดเจน ตั้งแต่เตรียมเครื่องมือ ดาวน์โหลดคอมไพล์ ไลบรารี ไปจนถึงจัดการคีย์อย่างปลอดภัย
- ตั้งค่าเครื่อง: Xcode, Homebrew, OpenSSL/Keychain
- คอมไพล์ SEE ด้วย `clang -DSQLITE_HAS_CODEC` และลิงก์กับ libcrypto หรือ Security framework
- โหลดและกำหนดคีย์ ก่อนเปิดฐานข้อมูลทุกครั้ง
- เก็บคีย์อย่างปลอดภัย โดยใช้ Keychain หรือไฟล์เข้ารหัส
- ตรวจสอบและบำรุงรักษา คีย์ด้วย `sqlite3_key` / `sqlite3_rekey`
**Tip สุดท้าย: อย่าลืมทำการสำรองฐานข้อมูลแบบไม่เข้ารหัสไว้เป็นที่หนึ่งก่อนทำการเปลี่ยนคีย์หรืออัปเดต SEE เพื่อป้องกันความเสียหายจากขั้นตอนผิดพลาด.
แชร์บทความนี้:
ชอบบทความแบบนี้?
สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม
แหล่งข่าวต้นฉบับ
- ชื่อต้นฉบับ
- วิธีตั้งค่าและใช้ SQLite Encryption Extension บน macOS อย่างปลอดภัย
- ผู้เขียน
- กองบรรณาธิการ Thai Tech News
- แหล่ง
- บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
- วันที่เผยแพร่
- 30 กรกฎาคม 2569 เวลา 10:51



