
ที่มาภาพ: Unknown Source
วิธีตั้งค่าและใช้งาน SQLCipher เข้ารหัสฐานข้อมูล SQLite บน Android อย่างปลอดภัย
⚡ สรุป 30 วิ
การเข้ารหัสข้อมูลในแอป Android เป็นสิ่งจำเป็นเมื่อต้องจัดเก็บข้อมูลสำคัญ เช่น ข้อมูลผู้ใช้หรือรหัสผ่าน SQLCipher ให้วิธีง่าย ๆ ที่ทำให้ฐานข้อมูล SQLite ของคุณปลอดภัยโดยอัตโนมัติ บทความนี้จะพาคุณตั้งค่…
ภาพรวม — Overview
การเข้ารหัสข้อมูลในแอป Android เป็นสิ่งจำเป็นเมื่อต้องจัดเก็บข้อมูลสำคัญ เช่น ข้อมูลผู้ใช้หรือรหัสผ่าน SQLCipher ให้วิธีง่าย ๆ ที่ทำให้ฐานข้อมูล SQLite ของคุณปลอดภัยโดยอัตโนมัติ บทความนี้จะพาคุณตั้งค่าและใช้งาน SQLCipher ขั้นตอนต่อขั้นตอน พร้อมเคล็ดลับการจัดการคีย์อย่างปลอดภัย
- SQLCipher คือไลบรารีที่ขยาย SQLite ด้วยการเข้ารหัส AES‑256
- ทำงานร่วมกับ Android Studio ได้โดยตรง ผ่าน Gradle หรือ Maven
- รองรับการเปิด/ปิดฐานข้อมูลแบบ dynamic เพียงเปลี่ยนคีย์
ความต้องการเบื้องต้น — Prerequisites
ก่อนเริ่มให้ตรวจสอบว่าระบบพัฒนาของคุณพร้อมใช้งานแล้วหรือยัง
- Android Studio 4.0 ขึ้นไป
- Gradle 3.5 ขึ้นไป หรือใช้ Maven ถ้าติดตั้งผ่านไฟล์ pom.xml
- ความรู้พื้นฐานการเขียน SQLite บนอุปกรณ์ Android
**Tip: หากโครงการของคุณยังใช้เวอร์ชันเก่าของ AndroidX ควรอัปเดตเป็น AndroidX ก่อนเพื่อหลีกเลี่ยงปัญหา dependency
การเพิ่ม SQLCipher ไปในโปรเจกต์ — Add SQLCipher
การนำไลบรารีเข้าโปรเจกต์ทำได้สองวิธี คือใช้ Gradle หรือดาวน์โหลด JAR เอง
- **Gradle: เปิดไฟล์ `build.gradle (Module)` แล้วใส่
```gradle implementation 'net.zetetic:android-database-sqlcipher:4.5.0@aar' ```
- **Maven: เพิ่ม dependency ลงใน `pom.xml`
```xml <dependency> <groupId>net.zetetic</groupId> <artifactId>android-database-sqlcipher</artifactId> <version>4.5.0</version> </dependency> ```
- Sync โปรเจกต์เพื่อให้ Gradle ดาวน์โหลดไลบรารี
**ข้อควรระวัง: อย่าใช้เวอร์ชันเก่ากว่า 4.0 เนื่องจากอาจไม่มีการสนับสนุน AES‑256 ปัจจุบัน
การกำหนดค่าเริ่มต้นของฐานข้อมูล — Initialize Database
เมื่อเพิ่มไลบรารีแล้ว ขั้นตอนต่อไปคือสร้างหรือเปิดฐานข้อมูลที่เข้ารหัส
- เริ่มต้นด้วยการโหลดไลบรารีใน `Application` หรือ `Activity`
```java SQLiteDatabase.loadLibs(this); ```
- สร้างหรือเปิดฐานข้อมูลโดยระบุคีย์
```java String password = "MyStrongPassphrase"; // ควรดึงจาก Keystore File dbFile = getDatabasePath("secure.db"); SupportFactory factory = new SupportFactory(password.getBytes()); Room.databaseBuilder(getApplicationContext(), AppDatabase.class, dbFile.getName()) .openHelperFactory(factory) .build(); ```
- หากฐานข้อมูลไม่มีอยู่ ระบบจะสร้างไฟล์ใหม่โดยอัตโนมัติและเข้ารหัสทันที
**Tip: อย่าเก็บพาสเวิร์ดเป็นข้อความตรง ๆ ในโค้ด ใช้ Android Keystore เพื่อจัดการคีย์อย่างปลอดภัย
การจัดการคีย์อย่างปลอดภัย — Secure Key Management
คีย์เป็นหัวใจของความปลอดภัย หากรั่วไหลข้อมูลทั้งหมดก็จะถูกเปิดเผย
- เก็บคีย์ใน Android Keystore System (API 23+)
```java KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); SecretKey secretKey = (SecretKey) ks.getEntry(alias, null).getSecretKey(); ```
- ใช้ KeyGenParameterSpec เพื่อกำหนดเงื่อนไขการใช้คีย์
```java KeyGenerator keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); keyGenerator.init(new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) .build()); ```
- หากต้องการเปลี่ยนคีย์ให้ใช้ `ATTACH`/`DETACH` เพื่อ re‑encrypt ทั้งฐานข้อมูล
**ข้อควรระวัง: อย่าลืมกำหนด fallback เมื่ออุปกรณ์ไม่รองรับ Keystore (เช่น Android 4.0) ให้แจ้งผู้ใช้และหยุดการทำงาน
การดำเนินการ CRUD บนฐานข้อมูลเข้ารหัส — CRUD Operations
หลังจากเปิดฐานข้อมูลแล้ว การอ่าน‑เขียนข้อมูลทำได้เหมือนกับ SQLite ปกติ
- **INSERT:
```java db.execSQL("INSERT INTO users(name, token) VALUES(?, ?)", new Object[]{"Alice", "abc123"}); ```
- **SELECT:
```java Cursor c = db.rawQuery("SELECT name FROM users WHERE token=?", new String[]{"abc123"}); ```
- UPDATE / DELETE ทำตามมาตรฐาน SQLite
การเข้ารหัสทำงานที่ระดับไฟล์ จึงไม่มีโอเวอร์เฮดจากคำสั่ง SQL เพิ่มเติม
**Tip: ใช้ `transaction` เพื่อบรรจุหลายคำสั่งพร้อมกัน ลดความเสี่ยงของข้อมูลเสียหายระหว่าง re‑encryption
การตรวจสอบว่าฐานข้อมูลถูกเข้ารหัสจริงหรือไม่ — Verification
เพื่อยืนยันว่าไฟล์ฐานข้อมูลเป็นแบบเข้ารหัส ให้ทำการเปิดด้วยคีย์ที่ผิด
```java try { SQLiteDatabase db = SQLiteDatabase.openDatabase( dbPath, "WrongKey".toCharArray(), SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // คาดว่าจะเกิด Exception หากไฟล์ถูกเข้ารหัส } ```
ถ้าเปิดได้โดยไม่มีข้อผิดพลาด แสดงว่าไฟล์ยังไม่ได้เข้ารหัส
| ตรวจสอบ | วิธี | ผลลัพธ์คาดหวัง |
|---|---|---|
| เปิดด้วยคีย์ถูกต้อง | `openDatabase` กับคีย์จริง | เชื่อมต่อสำเร็จ |
| เปิดด้วยคีย์ผิด | `openDatabase` กับคีย์สุ่ม | เกิด Exception |
**Tip: ทำการตรวจสอบนี้ในโหมด debug เท่านั้น เพื่อไม่เปิดเผยข้อมูลสำคัญแก่ผู้ใช้ปลายทาง
ปัญหาที่พบบ่อยและวิธีแก้ — Common Issues
- ไลบรารีไม่โหลด
- ตรวจสอบว่าเรียก `SQLiteDatabase.loadLibs(this);` ก่อนทุกการใช้งาน
- เช็คว่ามีไฟล์ `.so` อยู่ใน `apk/lib/armeabi‑v7a` หรือ `arm64-v8a`
- ฐานข้อมูลเปิดไม่ได้หลังอัปเดต
- ตรวจสอบเวอร์ชันของ SQLCipher ให้ตรงกับเวอร์ชันที่สร้างฐานข้อมูลเดิม
- ใช้ฟังก์ชัน `PRAGMA cipher_migrate;` เพื่อย้ายจากเวอร์ชันเก่า
- คีย์หายหลังรีสตาร์ท
- เก็บ alias ของ Keystore ให้คงที่และไม่ลบใน `SharedPreferences` หรือไฟล์อื่น ๆ
**ข้อควรระวัง: อย่าพยายามเข้ารหัสฐานข้อมูลที่ยังเปิดอยู่หลายอินสแตนซ์พร้อมกัน เนื่องจากอาจทำให้ไฟล์เสียหาย
สรุป — Summary
SQLCipher ทำให้การจัดเก็บข้อมูลบน Android มีความปลอดภัยระดับ AES‑256 ด้วยขั้นตอนไม่ซับซ้อน เพียงเพิ่มไลบรารี ปรับคีย์ผ่าน Keystore แล้วใช้ API ของ SQLite ธรรมดา
- **ติดตั้ง: เพิ่ม dependency ผ่าน Gradle หรือ Maven
- **กำหนดค่า: โหลดไลบรารีและสร้างฐานข้อมูลด้วย `SupportFactory`
- **จัดการคีย์: เก็บใน Android Keystore, ไม่เก็บเป็นข้อความธรรมดา
- **ทำงานกับ DB: CRUD ทำตามปกติ, ใช้ transaction เพื่อประสิทธิภาพ
- **ตรวจสอบ: เปิดไฟล์ด้วยคีย์ผิดเพื่อยืนยันว่ามีการเข้ารหัส
จำไว้ว่า ความปลอดภัยเริ่มจากคีย์ที่แข็งแรงและการจัดเก็บอย่างเหมาะสม – อย่าละเลยขั้นตอน Keystore และหลีกเลี่ยงการ hard‑code คีย์ในโค้ดของคุณ.
แชร์บทความนี้:
ชอบบทความแบบนี้?
สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม
แหล่งข่าวต้นฉบับ
- ชื่อต้นฉบับ
- วิธีตั้งค่าและใช้งาน SQLCipher เข้ารหัสฐานข้อมูล SQLite บน Android อย่างปลอดภัย
- ผู้เขียน
- กองบรรณาธิการ Thai Tech News
- แหล่ง
- บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
- วันที่เผยแพร่
- 25 สิงหาคม 2569 เวลา 17:51



