Bonding: quá trình và bảo mật của ghép nối BLE

Tác giả: IT Sectr Đã đăng: 2026-07-16 Thời gian đọc: 10 phút

Bonding (ghép nối) trong Bluetooth Low Energy là quá trình tạo kết nối bảo mật vĩnh viễn giữa hai thiết bị bằng cách lưu trữ khóa mật mã trong bộ nhớ không bay hơi. Sau khi bonding, các thiết bị có thể tự động khôi phục kết nối đã mã hóa khi kết nối lại mà không cần nhập lại PIN hoặc xác nhận của người dùng. Theo Bluetooth SIG Core Specification v5.4 (2025), cơ chế bonding là bắt buộc đối với các thiết bị yêu cầu tự động kết nối lại — tai nghe, trình theo dõi thể dục, cảm biến y tế và phụ kiện IoT.

Điểm chính

  • Bonding là việc lưu trữ dài hạn các khóa mã hóa giữa các thiết bị BLE sau khi kết thúc phiên.
  • Khác với pairing, bonding cho phép tự động khôi phục các kết nối đã mã hóa mà không cần xác nhận lặp lại.
  • Quá trình bonding bao gồm trao đổi khóa LTK, IRK, CSRK và lưu trữ chúng trong bộ nhớ của cả hai thiết bị.
  • iOS quản lý các thiết bị đã liên kết qua Settings > Bluetooth với khả năng xóa khóa đã lưu.
  • Trên Android, việc quản lý bonding được thực hiện qua BluetoothAdapter và API getBondedDevices().

Bonding trong BLE là gì?

Bonding là phần mở rộng của quá trình pairing trong Bluetooth Low Energy, nơi các thiết bị lưu trữ khóa mã hóa cho các kết nối sau này. Tiêu chuẩn BLE định nghĩa ba chế độ bảo mật: Security Mode 1 (mã hóa không xác thực), Security Mode 2 (ký dữ liệu không mã hóa) và Security Mode 3 (mã hóa có xác thực). Bonding phù hợp với các chế độ mã hóa khi cần kết nối lặp lại mà không tái tạo khóa.

Tại sao cần Bonding

Mục đích chính của bonding là tự động khôi phục các kết nối đã mã hóa khi các thiết bị kết nối lại. Khi người dùng lấy tai nghe ra khỏi hộp và đeo vào, bonding đảm bảo kết nối tức thời với điện thoại thông minh mà không cần chọn lại thiết bị trong menu Bluetooth. Theo Apple Bluetooth Design Guidelines (2025), các thiết bị đã liên kết phải kết nối trong vòng không quá 2 giây kể từ khi phát hiện.

Dữ liệu nào được lưu trong Bonding

Trong quá trình bonding, mỗi thiết bị lưu trữ một tập vật liệu mật mã: Long Term Key (LTK) để mã hóa kết nối, Identity Resolving Key (IRK) để giải quyết địa chỉ ngẫu nhiên và Connection Signature Resolving Key (CSRK) để xác minh chữ ký dữ liệu. LTK là khóa chính 128 bit được tạo trong quá trình pairing và được sử dụng cho tất cả các phiên mã hóa sau đó.

KhóaĐộ dàiMục đích
LTK128 bitMã hóa dữ liệu sau khi kết nối lại
IRK128 bitGiải quyết địa chỉ riêng ngẫu nhiên (RPA)
CSRK128 bitKý và xác minh tính xác thực dữ liệu

Bonding và Pairing: khác nhau thế nào

Pairing là việc thương lượng tạm thời các khóa để mã hóa phiên giao tiếp hiện tại. Khi kết nối kết thúc, các khóa mã hóa bị xóa và kết nối tiếp theo yêu cầu một quá trình pairing đầy đủ mới. Bonding bao gồm tất cả các giai đoạn pairing nhưng bổ sung lưu trữ khóa cho các phiên trong tương lai. Hầu như tất cả các thiết bị Bluetooth tiêu dùng (tai nghe, loa, đồng hồ) đều sử dụng bonding vì nếu không, mỗi kết nối sẽ yêu cầu nhập lại PIN.

Ba giai đoạn của Pairing và Bonding

Quá trình pairing theo đặc tả BLE bao gồm ba giai đoạn. Giai đoạn 1 — trao đổi khả năng thiết bị (khả năng IO, hỗ trợ xác thực). Giai đoạn 2 — tạo và trao đổi Short Term Key (STK) hoặc LTK, tùy theo phương thức ghép nối. Giai đoạn 3 — vận chuyển khóa: trao đổi LTK, IRK, CSRK giữa các thiết bị. Nếu các thiết bị đã lưu khóa sau Giai đoạn 3 — đây là bonding. Nếu không — đó chỉ là pairing.

Tham sốPairingBonding
Lưu trữ khóaKhông lưuLưu trong NVRAM
Tự động kết nối lạiKhông
Nhập lại PINYêu cầuKhông yêu cầu
Sử dụngKết nối không thường xuyênThiết bị thường trực

Quá trình Bonding hoạt động ra sao

Quá trình bonding được bắt đầu sau khi hoàn thành pairing thành công, khi một thiết bị gửi yêu cầu lưu trữ khóa. Trong BLE, Central (thường là điện thoại thông minh) và Peripheral (thiết bị đeo) trao đổi khóa qua kênh bảo mật được thiết lập ở Giai đoạn 2. Sau khi trao đổi khóa thành công, mỗi thiết bị lưu chúng trong bộ nhớ không bay hơi cùng với địa chỉ MAC hoặc Identity Address của đối tác.

Lưu trữ khóa ở phía Central

ở phía Central (iOS/Android), các khóa được lưu trong bộ nhớ Bluetooth hệ thống. iOS sử dụng ngăn xếp hệ thống Core Bluetooth với quản lý bonding tự động: khi ghép nối lần đầu, các khóa được lưu trong NVRAM của thiết bị và các kết nối sau đó với cùng Peripheral diễn ra tự động. Nhà phát triển không quản lý trực tiếp khóa — ngăn xếp hệ thống Core Bluetooth xử lý bonding tự động khi kết nối với thiết bị hỗ trợ lưu trữ khóa.

Khôi phục kết nối qua Bonding

Khi kết nối lại, Peripheral gửi các gói quảng cáo chứa địa chỉ công khai hoặc Resolvable Private Address (RPA). Central nhận gói tin, so khớp địa chỉ với các thiết bị đã liên kết được lưu và nếu tìm thấy sự trùng khớp, sẽ bắt đầu khôi phục phiên bằng LTK đã lưu. Nếu LTK trùng khớp, kết nối đã mã hóa được thiết lập mà không cần pairing lại.

Phương thức xác thực trong Bonding

Đặc tả BLE định nghĩa một số phương thức xác thực ảnh hưởng đến mức độ bảo mật của bonding. Việc lựa chọn phương thức phụ thuộc vào khả năng IO của thiết bị — có màn hình, bàn phím hay khả năng xác nhận so sánh số. Bonding an toàn yêu cầu sử dụng ít nhất Just Works cho các ứng dụng không quan trọng và Numeric Comparison hoặc Passkey Entry cho các tác vụ cần bảo vệ khỏi các cuộc tấn công Man-in-the-Middle.

Just Works

Just Works là phương thức không xác thực được sử dụng khi một trong các thiết bị không có màn hình hoặc bàn phím. Các khóa mã hóa được truyền mà không xác minh danh tính của thiết bị thứ hai — cảm biến nhiệt độ, máy theo dõi nhịp tim. Just Works dễ bị tấn công MITM, do đó chỉ được sử dụng cho các thiết bị mà việc xâm phạm dữ liệu không gây ra mối đe dọa.

Numeric Comparison

Numeric Comparison là phương thức xác thực trong đó cả hai thiết bị hiển thị một số có sáu chữ số và người dùng phải xác nhận sự trùng khớp. Phương thức này cung cấp khả năng bảo vệ khỏi các cuộc tấn công MITM và được khuyến nghị cho các thiết bị có màn hình — đồng hồ thông minh, trình theo dõi thể dục, điều khiển từ xa. Sau khi xác nhận, bonding được lưu với mức tin cậy tối đa.

Passkey Entry

Passkey Entry yêu cầu nhập PIN gồm sáu chữ số trên một trong các thiết bị. Thông thường, mã được tạo bởi một thiết bị và hiển thị trên đó, trong khi người dùng nhập mã trên thiết bị thứ hai. Phương thức này được sử dụng cho các thiết bị y tế và khóa IoT khi cần mức bảo mật cao nhưng một trong các thiết bị không có màn hình cho Numeric Comparison.

Quản lý thiết bị đã liên kết trong iOS và Android

Quản lý bonding là quá trình xem, xóa và bảo trì các khóa đã lưu của các thiết bị đã ghép nối. Trong phát triển di động, điều quan trọng là phải xử lý chính xác trạng thái của các thiết bị đã liên kết, đặc biệt khi thiết bị ngoại vi bị đặt lại hoặc thay thế phần mềm cơ sở. Khi khóa bonding trên Peripheral thay đổi, các khóa cũ trên Central phải được xóa và thực hiện ghép nối mới.

Quản lý trong iOS

iOS tự động quản lý các thiết bị đã liên kết thông qua ngăn xếp hệ thống Core Bluetooth. Nhà phát triển không có API trực tiếp để xem hoặc xóa từng thiết bị đã liên kết — việc quản lý được thực hiện thông qua cài đặt hệ thống (Settings > Bluetooth > thiết bị > Forget). Nếu cần xóa bonding theo chương trình, ứng dụng có thể chuyển hướng người dùng đến cài đặt Bluetooth hệ thống bằng UIApplication.openSettingsURLString.

Quản lý trong Android

Android cung cấp API trực tiếp để làm việc với các thiết bị đã liên kết thông qua lớp BluetoothAdapter. Phương thức getBondedDevices() trả về Set<BluetoothDevice> của tất cả các thiết bị đã ghép nối. Để xóa bonding, phương thức removeBond() được sử dụng thông qua phản xạ hoặc trên Android 12+ sử dụng API chính thức BluetoothDevice.removeBond().

kotlin
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
    Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}

Ví dụ thực tế triển khai Bonding

Triển khai bonding trên Android yêu cầu xử lý chính xác BroadcastReceiver cho các sự kiện BluetoothDevice.ACTION_BOND_STATE_CHANGED. Khi kết nối lần đầu với một thiết bị, hệ thống Android tự động bắt đầu bonding nếu thiết bị hỗ trợ khả năng này. Nhà phát triển phải xử lý ba trạng thái: BOND_NONE (chưa ghép nối), BOND_BONDING (đang ghép nối), BOND_BONDED (đã ghép nối).

kotlin
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", "Đã xóa liên kết")
        }
    }
}

Bắt đầu Bonding trên Android

Để bắt đầu bonding trên Android, phương thức createBond() phải được gọi trên đối tượng BluetoothDevice. Phương thức trả về giá trị boolean — true nếu quá trình ghép nối được bắt đầu thành công. Bắt đầu từ Android 12, createBond() yêu cầu quyền BLUETOOTH_CONNECT và có thể bị hệ thống từ chối nếu ứng dụng không có quyền truy cập Bluetooth nền.

kotlin
fun initiateBonding(device: BluetoothDevice) {
    if (device.bondState == BluetoothDevice.BOND_NONE) {
        val success = device.createBond()
        if (success) {
            Toast.makeText(context, "Bonding đã bắt đầu", Toast.LENGTH_SHORT)
        }
    }
}

Lỗi thường gặp khi làm việc với Bonding

Các nhà phát triển ứng dụng di động thường gặp phải các lỗi phổ biến khi làm việc với bonding thiết bị BLE. Xử lý không đúng các trạng thái bonding có thể dẫn đến lỗi kết nối, không thể ghép nối lại hoặc mất dữ liệu. Hãy xem xét các vấn đề phổ biến nhất và cách giải quyết chúng.

Đặt lại phần mềm cơ sở của Peripheral và stale bonding

Sau khi cập nhật phần mềm cơ sở của thiết bị BLE, các khóa bonding có thể bị đặt lại, nhưng điện thoại thông minh vẫn tiếp tục lưu trữ các khóa cũ (stale bonding). Khi cố gắng kết nối, Central cố gắng khôi phục phiên với LTK cũ, Peripheral từ chối khóa và kết nối thất bại. Giải pháp là xóa bonding trên điện thoại thông minh qua Settings > Bluetooth > Forget Device và thực hiện ghép nối mới.

Giới hạn số lượng thiết bị đã liên kết

Các chip BLE có giới hạn về số lượng bản ghi bonding được lưu trữ. Đối với các chip Nordic nRF5x phổ biến, giới hạn là 8-20 bản ghi tùy theo cấu hình. Khi vượt quá giới hạn, thiết bị ngừng chấp nhận ghép nối mới. Giải pháp là xóa các bản ghi bonding không sử dụng hoặc sử dụng vòng khóa ưu tiên có dọn dẹp.

Các vấn đề với Tính năng Riêng tư

Khi sử dụng Tính năng Riêng tư (địa chỉ MAC ngẫu nhiên), thiết bị định kỳ thay đổi địa chỉ của nó. Nếu Central không lưu IRK, nó không thể khớp địa chỉ ngẫu nhiên mới với một thiết bị đã biết. Giải pháp là triển khai đúng cách lưu trữ IRK và sử dụng nó để giải quyết RPA mỗi khi phát hiện thiết bị.

Câu hỏi thường gặp

Bonding trong BLE là gì?

Bonding trong Bluetooth Low Energy là quá trình lưu trữ các khóa mã hóa (LTK, IRK, CSRK) sau khi kết thúc phiên pairing, để tự động khôi phục kết nối bảo mật khi kết nối lại sau đó mà không cần nhập lại PIN hoặc xác nhận.

Bonding khác Pairing như thế nào?

Pairing là việc thương lượng tạm thời các khóa cho phiên hiện tại, sẽ bị xóa khi ngắt kết nối. Bonding bao gồm toàn bộ quá trình pairing cộng với lưu trữ khóa cho các kết nối trong tương lai. Bonding cần thiết cho các thiết bị tự động kết nối lại — tai nghe, đồng hồ, trình theo dõi thể dục.

Làm thế nào để xóa Bonding trên iPhone?

Trên iPhone, việc xóa bonding được thực hiện qua cài đặt hệ thống: Settings > Bluetooth > nhấn vào biểu tượng thông tin (i) bên cạnh thiết bị > chọn Forget This Device. Sau đó, các khóa mã hóa sẽ bị xóa và lần kết nối tiếp theo sẽ yêu cầu ghép nối mới.

Có bao nhiêu thiết bị có thể ở trong Bonding?

Số lượng thiết bị đã liên kết phụ thuộc vào dung lượng bộ nhớ không bay hơi của chip BLE. Điện thoại thông minh có thể lưu trữ hàng trăm bản ghi, trong khi các thiết bị ngoại vi BLE giá rẻ bị giới hạn ở 8-20 bản ghi. Khi vượt quá giới hạn, các bản ghi cũ sẽ bị ghi đè hoặc thiết bị ngừng chấp nhận ghép nối mới.

Stale bonding là gì?

Stale bonding là tình huống khóa mã hóa trên một thiết bị (thường là Peripheral) đã bị đặt lại (ví dụ, sau khi cập nhật phần mềm cơ sở), nhưng Central vẫn giữ các khóa cũ. Kết quả là kết nối không thể được thiết lập cho đến khi người dùng xóa stale bonding qua cài đặt Bluetooth và thực hiện ghép nối mới.

Tổng kết

  • Bonding là cơ chế BLE quan trọng để tự động khôi phục các kết nối đã mã hóa mà không cần nhập lại PIN.
  • Pairing và bonding khác nhau về lưu trữ khóa: trong pairing khóa chỉ tồn tại trong một phiên, trong bonding chúng được lưu vĩnh viễn.
  • Quá trình bonding bao gồm việc trao đổi và lưu trữ ba loại khóa: LTK (mã hóa), IRK (định danh), CSRK (chữ ký).
  • Phương thức xác thực Numeric Comparison cung cấp khả năng bảo vệ khỏi các cuộc tấn công MITM và được khuyến nghị cho các thiết bị có màn hình.
  • iOS quản lý bonding tự động qua Core Bluetooth, trong khi Android cung cấp API createBond() và removeBond().
  • Stale bonding sau khi cập nhật phần mềm cơ sở Peripheral là vấn đề phổ biến được giải quyết bằng cách xóa thiết bị khỏi danh sách Bluetooth.
  • Số lượng thiết bị đã liên kết trên chip BLE ngoại vi bị giới hạn ở 8-20 bản ghi tùy theo kiểu máy.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm