Bonding (การจับคู่) ใน Bluetooth Low Energy คือกระบวนการสร้างการเชื่อมต่อที่ปลอดภัยแบบถาวรระหว่างอุปกรณ์สองชิ้น โดยการเก็บคีย์การเข้ารหัสในหน่วยความจำที่ไม่เสื่อมสภาพ หลังจาก bonding อุปกรณ์สามารถคืนสภาพการเชื่อมต่อที่ถูกเข้ารหัสได้โดยอัตโนมัติเมื่อเชื่อมต่อใหม่ โดยไม่ต้องป้อน PIN หรือการยืนยันของผู้ใช้ ตาม Bluetooth SIG Core Specification v5.4 (2025) กลไก bonding เป็นภาคบังคับสำหรับอุปกรณ์ที่ต้องการการเชื่อมต่อใหม่โดยอัตโนมัติ — หูฟัง อุปกรณ์ติดตามการออกกำลังกาย เซ็นเซอร์ทางการแพทย์ และอุปกรณ์เสริม IoT
ประเด็นสำคัญ
Bonding เป็นส่วนขยายของกระบวนการ pairing ใน Bluetooth Low Energy โดยอุปกรณ์เก็บคีย์การเข้ารหัสสำหรับการเชื่อมต่อในภายหลัง มาตรฐาน BLE กำหนดโหมดความปลอดภัยสามโหมด: Security Mode 1 (การเข้ารหัสโดยไม่มีการตรวจสอบสิทธิ์), Security Mode 2 (การลงนามข้อมูลโดยไม่มีการเข้ารหัส) และ Security Mode 3 (การเข้ารหัสที่มีการตรวจสอบสิทธิ์) Bonding เกี่ยวข้องกับโหมดที่มีการเข้ารหัสเมื่อต้องการการเชื่อมต่อซ้ำโดยไม่ต้องสร้างคีย์ใหม่
วัตถุประสงค์หลักของ bonding คือการคืนสภาพการเชื่อมต่อที่ถูกเข้ารหัสโดยอัตโนมัติเมื่ออุปกรณ์เชื่อมต่อใหม่ เมื่อผู้ใช้หยิบหูฟังจากเคสและสวมใส่ bonding ช่วยให้เชื่อมต่อกับสมาร์ทโฟนได้ทันทีโดยไม่ต้องเลือกอุปกรณ์ในเมนู Bluetooth อีกครั้ง ตาม Apple Bluetooth Design Guidelines (2025) อุปกรณ์ที่ผูกแล้วควรเชื่อมต่อภายในไม่เกิน 2 วินาทีหลังจากตรวจพบ
ระหว่าง bonding อุปกรณ์แต่ละชิ้นเก็บชุดของวัตถุดิบการเข้ารหัส: Long Term Key (LTK) สำหรับการเข้ารหัสการเชื่อมต่อ Identity Resolving Key (IRK) สำหรับการแก้ไขที่อยู่แบบสุ่ม และ Connection Signature Resolving Key (CSRK) สำหรับตรวจสอบลายเซ็นข้อมูล LTK เป็นคีย์หลักขนาด 128 บิตที่สร้างขึ้นระหว่าง pairing และใช้สำหรับเซสชั่นที่ถูกเข้ารหัสทั้งหมดในภายหลัง
| คีย์ | ความยาว | วัตถุประสงค์ |
|---|---|---|
| LTK | 128 บิต | การเข้ารหัสข้อมูลหลังการเชื่อมต่อใหม่ |
| IRK | 128 บิต | การแก้ไขที่อยู่ส่วนตัวแบบสุ่ม (RPA) |
| CSRK | 128 บิต | การลงนามและตรวจสอบความถูกต้องของข้อมูล |
Pairing คือการเจรจาคีย์ชั่วคราวเพื่อเข้ารหัสเซสชั่นการสื่อสารปัจจุบัน เมื่อการเชื่อมต่อสิ้นสุดลง คีย์การเข้ารหัสจะถูกลบ และการเชื่อมต่อครั้งต่อไปต้องมีกระบวนการ pairing ใหม่อีกครั้ง Bonding รวมทุกขั้นตอนของ pairing แต่เพิ่มการเก็บคีย์สำหรับเซสชั่นในอนาคต อุปกรณ์ Bluetooth เกือบทุกชนิด (หูฟัง ลำโพง นาฬิกา) ใช้ bonding เพราะหากไม่มี การเชื่อมต่อแต่ละครั้งจะต้องป้อน PIN ใหม่
กระบวนการ pairing ตามข้อกำหนด BLE ประกอบด้วยสาม เฟส เฟส 1 — การแลกเปลี่ยนความสามารถของอุปกรณ์ (IO capabilities, การสนับสนุนการตรวจสอบสิทธิ์) เฟส 2 — การสร้างและแลกเปลี่ยน Short Term Key (STK) หรือ LTK ขึ้นอยู่กับวิธีการจับคู่ เฟส 3 — การขนส่งคีย์: การแลกเปลี่ยน LTK, IRK, CSRK ระหว่างอุปกรณ์ หากอุปกรณ์เก็บคีย์ไว้หลังจากเฟส 3 — นี่คือ bonding หากไม่ — เป็นเพียง pairing
| พารามิเตอร์ | Pairing | Bonding |
|---|---|---|
| การเก็บคีย์ | ไม่ได้เก็บ | เก็บใน NVRAM |
| การเชื่อมต่อใหม่อัตโนมัติ | ไม่ | ใช่ |
| การป้อน PIN ใหม่ | ต้องการ | ไม่ต้องการ |
| การใช้งาน | การเชื่อมต่อเป็นครั้งคราว | อุปกรณ์ถาวร |
กระบวนการ bonding เริ่มขึ้นหลังจากที่ pairing เสร็จสมบูรณ์ เมื่ออุปกรณ์ตัวหนึ่งส่งคำขอเก็บคีย์ ใน BLE Central (โดยปกติคือสมาร์ทโฟน) และ Peripheral (อุปกรณ์สวมใส่) แลกเปลี่ยนคีย์ผ่านช่องทางที่ปลอดภัยที่สร้างขึ้นในเฟส 2 หลังจากการแลกเปลี่ยนคีย์สำเร็จ อุปกรณ์แต่ละชิ้นจะเก็บคีย์ไว้ในหน่วยความจำที่ไม่เสื่อมสภาพพร้อมกับที่อยู่ MAC หรือ Identity Address ของคู่ค้า
ฝ่าย Central (iOS/Android) คีย์จะถูกเก็บไว้ในหน่วยความจำ Bluetooth ของระบบ iOS ใช้สแต็ก Core Bluetooth ของระบบที่มีการจัดการ bonding โดยอัตโนมัติ: เมื่อจับคู่ครั้งแรก คีย์จะถูกเก็บใน NVRAM ของอุปกรณ์ และการเชื่อมต่อต่อไปยัง Peripheral เดียวกันจะเกิดขึ้นโดยอัตโนมัติ นักพัฒนาไม่ต้องจัดการคีย์โดยตรง — สแต็ก Core Bluetooth ของระบบจะจัดการ bonding โดยอัตโนมัติเมื่อเชื่อมต่อกับอุปกรณ์ที่รองรับการเก็บคีย์
เมื่อเชื่อมต่อใหม่ Peripheral จะส่งแพ็กเก็ตโฆษณาที่มีที่อยู่สาธารณะหรือ Resolvable Private Address (RPA) Central ได้รับแพ็กเก็ต จับคู่ที่อยู่กับอุปกรณ์ที่ผูกแล้วที่เก็บไว้ และหากพบที่ตรงกัน จะเริ่มการคืนสภาพเซสชั่นโดยใช้ LTK ที่เก็บไว้ ถ้า LTK ตรงกัน การเชื่อมต่อที่ถูกเข้ารหัสจะถูกสร้างขึ้นโดยไม่ต้องทำ pairing ใหม่
ข้อกำหนด BLE กำหนดวิธีการตรวจสอบสิทธิ์หลายวิธีที่ส่งผลต่อระดับความปลอดภัยของ bonding การเลือกวิธีขึ้นอยู่กับความสามารถ IO ของอุปกรณ์ — ไม่ว่าจะมีหน้าจอ แป้นพิมพ์ หรือความสามารถในการยืนยันการเปรียบเทียบตัวเลข Bonding ที่ปลอดภัยต้องใช้อย่างน้อย Just Works สำหรับแอปพลิเคชันที่ไม่สำคัญ และ Numeric Comparison หรือ Passkey Entry สำหรับงานที่ต้องการการป้องกันจากการโจมตี Man-in-the-Middle
Just Works เป็นวิธีที่ไม่มีการตรวจสอบสิทธิ์ใช้เมื่ออุปกรณ์ตัวใดตัวหนึ่งไม่มีหน้าจอหรือแป้นพิมพ์ คีย์การเข้ารหัสจะถูกส่งโดยไม่มีการตรวจสอบตัวตนของอุปกรณ์ที่สอง — เซ็นเซอร์อุณหภูมิ เครื่องวัดอัตราการเต้นของหัวใจ Just Works อ่อนแอต่อการโจมตี MITM ดังนั้นจึงใช้เฉพาะกับอุปกรณ์ที่การบุกรุกข้อมูลไม่เป็นภัยคุกคาม
Numeric Comparison เป็นวิธีการตรวจสอบสิทธิ์ที่อุปกรณ์ทั้งสองแสดงตัวเลขหกหลัก และผู้ใช้ต้องยืนยันความตรงกัน วิธีนี้ให้การป้องกันจากการโจมตี MITM และแนะนำสำหรับอุปกรณ์ที่มีหน้าจอ — นาฬิกาอัจฉริยะ อุปกรณ์ติดตามการออกกำลังกาย รีโมทคอนโทรล หลังจากการยืนยัน bonding จะถูกเก็บไว้ด้วยระดับความเชื่อถือสูงสุด
Passkey Entry ต้องการการป้อน PIN หกหลักบนอุปกรณ์ตัวใดตัวหนึ่ง โดยปกติ รหัสจะถูกสร้างโดยอุปกรณ์หนึ่งและแสดงบนอุปกรณ์นั้น ในขณะที่ผู้ใช้ป้อนบนอุปกรณ์ที่สอง วิธีนี้ใช้สำหรับอุปกรณ์ทางการแพทย์และล็อค IoT ที่ต้องการระดับความปลอดภัยสูง แต่อุปกรณ์ตัวใดตัวหนึ่งไม่มีหน้าจอสำหรับ Numeric Comparison
การจัดการ bonding คือกระบวนการดู ลบ และบำรุงรักษาคีย์ที่เก็บไว้ของอุปกรณ์ที่จับคู่แล้ว ในการพัฒนาแอปพลิเคชันมือถือ สิ่งสำคัญคือต้องจัดการสถานะของอุปกรณ์ที่ผูกแล้วอย่างถูกต้อง โดยเฉพาะเมื่อมีการรีเซ็ตอุปกรณ์รอบข้างหรือเปลี่ยนเฟิร์มแวร์ เมื่อคีย์ bonding บน Peripheral เปลี่ยนแปลง จำเป็นต้องลบคีย์เก่าบน Central และทำการจับคู่ใหม่
iOS จัดการอุปกรณ์ที่ผูกแล้วโดยอัตโนมัติผ่านสแต็กระบบ Core Bluetooth นักวิจัยไม่มี API โดยตรงสำหรับดูหรือลบอุปกรณ์ที่ผูกแล้วทีละตัว — การจัดการทำผ่านการตั้งค่าระบบ (Settings > Bluetooth > อุปกรณ์ > Forget) หากจำเป็นต้องลบความผูกพันโดยโปรแกรม แอปสามารถนำผู้ใช้ไปที่การตั้งค่า Bluetooth ของระบบโดยใช้ UIApplication.openSettingsURLString
Android มี API โดยตรงสำหรับทำงานกับอุปกรณ์ที่ผูกแล้วผ่านคลาส BluetoothAdapter เมธอด getBondedDevices() จะคืนค่า Set<BluetoothDevice> ของอุปกรณ์ที่จับคู่ทั้งหมด สำหรับการลบความผูกพัน ใช้เมธอด removeBond() ผ่านการสะท้อนหรือบน Android 12+ ใช้ API อย่างเป็นทางการ BluetoothDevice.removeBond()
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}
การนำ bonding ไปใช้บน Android ต้องการการจัดการ BroadcastReceiver อย่างถูกต้องสำหรับอีเวนต์ BluetoothDevice.ACTION_BOND_STATE_CHANGED เมื่อเชื่อมต่อกับอุปกรณ์ครั้งแรก ระบบ Android จะเริ่มการ bonding โดยอัตโนมัติหากอุปกรณ์รองรับความสามารถนี้ นักวิจัยต้องจัดการสามสถานะ: BOND_NONE (ไม่ได้จับคู่), BOND_BONDING (กำลังจับคู่), BOND_BONDED (จับคู่แล้ว)
val bondReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
val bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1)
when (bondState) {
BluetoothDevice.BOND_BONDED -> Log.d("Bonding", "Bonded: ${device.name}")
BluetoothDevice.BOND_NONE -> Log.d("Bonding", "ลบการผูกแล้ว")
}
}
}
หากต้องการเริ่มต้น bonding บน Android จำเป็นต้องเรียกเมธอด createBond() บนออบเจ็กต์ BluetoothDevice เมธอดนี้จะคืนค่า boolean — true หากกระบวนการจับคู่เริ่มต้นสำเร็จ ตั้งแต่ Android 12 เมธอด createBond() ต้องการสิทธิ์ BLUETOOTH_CONNECT และอาจถูกปฏิเสธโดยระบบหากแอปไม่มีการเข้าถึง Bluetooth ในพื้นหลัง
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "Bonding เริ่มต้นแล้ว", Toast.LENGTH_SHORT)
}
}
}
นักพัฒนาแอปพลิเคชันมือถือมักพบ ข้อผิดพลาดทั่วไป เมื่อทำงานกับ bonding ของอุปกรณ์ BLE การจัดการสถานะ bonding ที่ไม่ถูกต้องอาจนำไปสู่การเชื่อมต่อล้มเหลว ไม่สามารถจับคู่ใหม่ หรือการสูญเสียข้อมูล มาดูปัญหาที่พบบ่อยที่สุดและวิธีแก้ไข
หลังจากอัปเดตเฟิร์มแวร์ของ อุปกรณ์ BLE คีย์ bonding อาจถูกรีเซ็ต แต่สมาร์ทโฟนยังคงเก็บคีย์เก่า (stale bonding) เมื่อพยายามเชื่อมต่อ Central จะพยายามคืนสภาพเซสชั่นด้วย LTK เก่า Peripheral จะปฏิเสธคีย์ และการเชื่อมต่อจะล้มเหลว วิธีแก้คือลบ bonding บนสมาร์ทโฟนผ่าน Settings > Bluetooth > Forget Device และทำการจับคู่ใหม่
ชิป BLE มีข้อจำกัดจำนวน ระเบียนการผูกที่เก็บได้ สำหรับชิป Nordic nRF5x ยอดนิยม ข้อจำกัดคือ 8-20 ระเบียนขึ้นอยู่กับการกำหนดค่า เมื่อเกินข้อจำกัด อุปกรณ์จะหยุดรับการจับคู่ใหม่ วิธีแก้คือลบระเบียน bonding ที่ไม่ใช้แล้วหรือใช้ห่วงคีย์ที่มีลำดับความสำคัญพร้อมการทำความสะอาด
เมื่อใช้ ฟีเจอร์ความเป็นส่วนตัว (ที่อยู่ MAC แบบสุ่ม) อุปกรณ์จะเปลี่ยนที่อยู่เป็นระยะ หาก Central ไม่ได้เก็บ IRK มันจะไม่สามารถจับคู่ที่อยู่สุ่มใหม่กับอุปกรณ์ที่รู้จัก วิธีแก้คือนำการเก็บ IRK ไปใช้อย่างถูกต้อง และใช้มันในการแก้ RPA ทุกครั้งที่ตรวจพบอุปกรณ์
คำถามที่พบบ่อย
Bonding ใน Bluetooth Low Energy คือกระบวนการเก็บคีย์การเข้ารหัส (LTK, IRK, CSRK) หลังจากสิ้นสุดเซสชั่น pairing เพื่อคืนสภาพการเชื่อมต่อที่ปลอดภัยโดยอัตโนมัติเมื่อเชื่อมต่อใหม่ในภายหลัง โดยไม่ต้องป้อน PIN หรือการยืนยัน
Pairing คือการเจรจาคีย์ชั่วคราวสำหรับเซสชั่นปัจจุบัน ซึ่งจะถูกลบเมื่อขาดการเชื่อมต่อ Bonding รวมกระบวนการ pairing ที่สมบูรณ์บวกกับการเก็บคีย์สำหรับการเชื่อมต่อในอนาคต Bonding จำเป็นสำหรับอุปกรณ์ที่เชื่อมต่อใหม่โดยอัตโนมัติ — หูฟัง นาฬิกา อุปกรณ์ติดตามการออกกำลังกาย
บน iPhone การลบ bonding ทำผ่านการตั้งค่าระบบ: Settings > Bluetooth > แตะไอคอนข้อมูล (i) ข้างอุปกรณ์ > เลือก Forget This Device หลังจากนั้น คีย์การเข้ารหัสจะถูกลบ และการเชื่อมต่อครั้งต่อไปจะต้องมีการจับคู่ใหม่
จำนวน อุปกรณ์ที่ผูกแล้วขึ้นอยู่กับความจุหน่วยความจำที่ไม่เสื่อมสภาพของชิป BLE สมาร์ทโฟนสามารถเก็บได้หลายร้อยระเบียน ในขณะที่อุปกรณ์รอบข้าง BLE ราคาประหยัดถูกจำกัดไว้ที่ 8-20 ระเบียน เมื่อเกินข้อจำกัด ระเบียนเก่าจะถูกเขียนทับหรืออุปกรณ์หยุดรับการจับคู่ใหม่
Stale bonding คือสถานการณ์ที่คีย์การเข้ารหัสบนอุปกรณ์หนึ่ง (โดยปกติ Peripheral) ถูกรีเซ็ต (เช่น หลังจากอัปเดตเฟิร์มแวร์) ในขณะที่ Central ยังคงเก็บคีย์เก่าไว้ ผลคือ การเชื่อมต่อไม่สามารถสร้างขึ้นได้จนกว่าผู้ใช้จะลบ stale bonding ผ่านการตั้งค่า Bluetooth และทำการจับคู่ใหม่
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ