Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Quy trình ghép nối nhanh
Cách thực hiện
Thay vì gọi ngay bất kỳ quy trình liên kết BR/EDR hoặc BLE thông thường nào, trước tiên, Trình tìm kiếm sẽ bật Thông báo về đặc điểm Ghép nối dựa trên khoá, sau đó ghi dữ liệu vào Bảng 1.1 vào đó.
Khi xử lý yêu cầu ghi từ Trình tìm kiếm ghép nối nhanh, Trình cung cấp ghép nối nhanh sẽ thực hiện những việc sau:
Nếu trường Khoá công khai (không bắt buộc) có:
Nếu thiết bị không ở chế độ ghép nối, hãy bỏ qua thao tác ghi và thoát.
Nếu không thì:
Sử dụng Khoá công khai đã nhận (điểm 64 byte trên đường cong elip secp256r1), Khoá riêng tư chống lừa đảo cài đặt sẵn – cũng như secp256r1 và thuật toán Elliptic-Curve Diffie-Hellman để tạo khoá AES 256 bit.
Sử dụng SHA-256 để băm khoá AES 256 bit.
Lấy 128 bit đầu tiên của kết quả. Đây là Khoá AES chống giả mạo, được dùng trong bước tiếp theo.
Hãy thử giải mã giá trị bằng AES-128. Vì giá trị là một khối AES 16 byte, nên không cần chế độ mật mã IV hoặc nhiều khối.
Nên sử dụng phím nào:
Nếu Khoá AES chống giả mạo đã được tạo ở bước 1, hãy dùng khoá đó.
Nếu không, hãy thử từng khoá trong Danh sách khoá tài khoản đã tồn tại.
Nếu một khoá giải mã thành công giá trị, hãy giải mã và tiếp tục chuyển sang bước tiếp theo.
Giá trị được giải mã thành công nếu đầu ra khớp với định dạng trong Bảng 1.2.1 hoặc Bảng 1.2.2 – (nghĩa là nếu dữ liệu chứa địa chỉ BLE hiện tại của Nhà cung cấp ghép nối nhanh hoặc địa chỉ công khai của Nhà cung cấp ghép nối nhanh).
LƯU Ý: Có đính kèm muối ở cuối gói. Khi có thể, bạn nên theo dõi các dữ liệu ngẫu nhiên này. Nếu Nhà cung cấp nhận được yêu cầu chứa dữ liệu ngẫu nhiên đã sử dụng, thì yêu cầu đó sẽ bị bỏ qua để ngăn các cuộc tấn công phát lại.
Thay vì theo dõi dữ liệu ngẫu nhiên, nếu lượt ghi bao gồm địa chỉ riêng tư của Nhà cung cấp, thì có một cách khác để ngăn các cuộc tấn công phát lại là chuyển tiếp thời gian của lượt xoay địa chỉ riêng tư có thể giải quyết tiếp theo để quá trình xoay xảy ra trước khi lượt ghi Ghép nối dựa trên khoá tiếp theo được chấp nhận.
Nếu không có khoá nào có thể giải mã thành công giá trị, hãy bỏ qua thao tác ghi và thoát.
Tính toán các lỗi này. Khi số lượng lỗi đạt đến 10, không thực hiện được tất cả các yêu cầu mới ngay lập tức. Đặt lại số lỗi sau 5 phút, sau khi bật nguồn hoặc sau khi thành công.
Nếu không, hãy lưu khoá thành công dưới dạng K. Hãy đánh dấu K này là có thể sử dụng để giải mã các lượt ghi Khoá truy cập và Tên được cá nhân hoá nhận được trên đường liên kết LE này, nhưng không thể sử dụng cho các lượt ghi khác cũng như các lượt ghi trên bất kỳ đường liên kết nào khác. Bắt đầu bộ tính giờ để loại bỏ K sau 10 giây nếu chưa bắt đầu quá trình ghép nối. Đồng thời huỷ K nếu đường liên kết LE này ngắt kết nối.
Tạo Phản hồi thô 16 byte như trong Bảng 1.3, bằng cách nối loại và địa chỉ BR/EDR của Nhà cung cấp, sau đó điền phần còn lại của gói bằng một khối byte ngẫu nhiên (tức là dữ liệu ngẫu nhiên).
Mã hoá Phản hồi thô bằng K để tạo Phản hồi đã mã hoá 16 byte được minh hoạ trong Bảng 1.4. Gửi nội dung này thông qua thông báo về đặc điểm Ghép nối dựa trên khoá.
Đọc cờ yêu cầu:
Nếu byte Yêu cầu gắn cờ có bit 2 được đặt thành 1, hãy thông báo cho đặc điểm Dữ liệu bổ sung kèm theo tên được cá nhân hoá.
Nếu byte Yêu cầu cờ có bit 1 được đặt thành 1:
Điều này cho biết Trình tìm kiếm đang yêu cầu Nhà cung cấp bắt đầu liên kết với địa chỉ BR/EDR của Trình tìm kiếm, hiện ở dạng byte 8-13.
Gửi yêu cầu ghép nối đến địa chỉ ở Brazil/EDR của Người tìm kiếm. Yêu cầu ghép nối phải như mô tả dưới đây (bước "Trong quá trình ghép nối").
Lý do cần thiết: Yêu cầu Nhà cung cấp bắt đầu khắc phục một sự cố trên một số thiết bị.
Nếu byte Yêu cầu cờ có bit 1 được đặt thành 0:
Chờ tối đa 10 giây để nhận yêu cầu ghép nối. Nếu không nhận được mã, hãy thoát.
Xin lưu ý rằng đây có thể là yêu cầu ở Brazil/EDR từ một địa chỉ khác (địa chỉ công khai của Người tìm kiếm, thay vì địa chỉ riêng tư có thể phân giải được).
Trong quá trình ghép nối, chúng tôi sẽ xác minh lại để đảm bảo rằng thiết bị yêu cầu thuộc K.
Trong khi ghép nối:
Khi nhận được gói yêu cầu ghép nối/gói phản hồi từ Trình tìm kiếm: Nếu Khả năng của thiết bị trong yêu cầu là NoInput/NoOutput, hãy kết thúc quá trình ghép nối để tránh sử dụng phương thức ghép nối Just Works.
Đối với gói phản hồi/yêu cầu ghép nối do Nhà cung cấp gửi: Đặt trường Khả năng của thiết bị thành Display/YesNo và đặt Yêu cầu xác thực thành Yêu cầu bảo vệ MITM (Yêu cầu bảo vệ MITM). Thao tác này sẽ kích hoạt phương thức ghép nối So sánh số (còn gọi là Xác nhận khoá truy cập trên Android).
Chúng tôi dựa vào điều này để xác nhận rằng thiết bị yêu cầu thực tế là Trình tìm kiếm ghép nối nhanh và không có sự trung gian. Hãy xem ví dụ.
Lý do cần thiết: Phương thức ghép nối Ngoài băng tần sẽ phù hợp hơn, nhưng nền tảng này không hiển thị phương thức này trên mọi phiên bản Android mong muốn.
Khi cần xác nhận khoá truy cập, hãy chờ tối đa 10 giây để ghi vào đặc điểm Khoá truy cập.
Thông thường, với phương pháp ghép nối này, người dùng sẽ xác nhận rằng các khoá truy cập hiển thị trên màn hình của mỗi thiết bị là giống nhau. Thay vào đó, chỉ trong quá trình ghép nối này, chúng tôi sẽ chuyển các dữ liệu đó qua BLE và được mã hoá bằng khoá được chia sẻ trước đáng tin cậy.
Lưu ý rằng bạn không nên áp dụng phương pháp này cho các thiết bị có màn hình hoặc bàn phím, vì phương pháp này sẽ ảnh hưởng đôi chút đến khả năng bảo vệ MITM.
Tính năng Ghép nối nhanh hiện chưa hỗ trợ các loại thiết bị đó vì lý do này.
Nếu bộ tính giờ 10 giây hết hạn mà không ghi khoá truy cập, hãy huỷ K.
Khi một giá trị được ghi vào đặc điểm Khoá truy cập, đó là Khối khoá truy cập đã mã hoá. Giải mã tệp đó bằng K để tạo ra một Khối khoá truy cập thô, có định dạng hiển thị trong Characteristic: Passkey>Bảng 2.2 – (loại = Khoá truy cập của người tìm kiếm).
Nếu giải mã không thành công, hãy bỏ qua yêu cầu ghi và loại bỏ K.
Nếu không, Khoá truy cập thô chứa một khoá truy cập gồm 6 chữ số PSeeker. Đây là khoá truy cập mà Trình tìm kiếm dự kiến.
So sánh PSeeker với khoá truy cập mà chúng ta dự kiến, PProvider.
Nếu các giá trị bằng nhau, hãy trả lời "có" cho phần xác nhận.
Nếu không, hãy trả lời "không" cho thông báo xác nhận, khiến quá trình ghép nối không thành công.
Bất kể việc ghép nối không thành công, hãy tạo một Khối khoá truy cập thô khác, có định dạng hiển thị trong Characteristic: Passkey>Bảng 2.2, chứa khoá truy cập dự kiến của chúng ta, PProvider.
Đảm bảo khối có đúng loại (Khoá truy cập của nhà cung cấp; xem bảng).
LƯU Ý: Không sử dụng lại dữ liệu ngẫu nhiên từ Khối khoá truy cập nhận được từ Trình tìm kiếm. Tạo một giá trị ngẫu nhiên mới.
Hãy mã hoá Khối khoá truy cập thô bằng K, rồi gửi kết quả Khối khoá truy cập đã mã hoá thông qua thông báo về đặc tính Khoá truy cập.
Nếu Trình tìm kiếm nhận được và giải mã đúng khoá truy cập P, thì Trình tìm kiếm cũng sẽ trả lời "có" cho xác nhận và quá trình ghép nối sẽ thành công.
Nếu việc ghép nối thành công, hãy đánh dấu K là có thể sử dụng để giải mã Khoá tài khoản được ghi trên đường liên kết LE này, nhưng không được áp dụng cho mọi lượt ghi Khoá truy cập tiếp theo cũng như mọi lượt ghi trên bất kỳ đường liên kết nào khác. Bắt đầu bộ tính giờ để loại bỏ K sau 10 giây. Ngoài ra, hãy loại bỏ K sau mọi nỗ lực ghi Khoá tài khoản và theo bước 4, nếu đường liên kết LE ngắt kết nối.
Nếu quá trình ghép nối không thành công, hãy loại bỏ K.
Chuyển trường chức năng của thiết bị về chức năng I/O mặc định và Yêu cầu xác thực thành mặc định để các ghép nối mới tiếp tục như dự kiến.
Lưu ý rằng đối với những Nhà cung cấp không yêu cầu liên kết, Trình tìm kiếm sẽ không gửi yêu cầu ghép nối đến Nhà cung cấp, tức là bước 8 – bước 17 sẽ bị bỏ qua. Ngoài ra, "K" được dùng trong Đặc điểm chính của tài khoản.
Ví dụ
Ví dụ 1: Nỗ lực ghép nối thành công
(không có xen kẽ).Ví dụ 2: Nỗ lực ghép nối không thành công, với sự can thiệp trung gian.
[null,null,["Cập nhật lần gần đây nhất: 2025-08-13 UTC."],[[["\u003cp\u003eFast Pair utilizes BLE for initial key exchange and then triggers BR/EDR pairing for secure connection.\u003c/p\u003e\n"],["\u003cp\u003eThe Provider verifies the Seeker's authenticity using encryption, a shared secret, and a numeric comparison pairing method.\u003c/p\u003e\n"],["\u003cp\u003eAccount Keys are exchanged securely after successful pairing to enable seamless future connections.\u003c/p\u003e\n"],["\u003cp\u003eThe process includes anti-spoofing measures like public key cryptography and salt tracking to enhance security.\u003c/p\u003e\n"],["\u003cp\u003eThe Provider initiates the BR/EDR pairing to address compatibility issues with certain devices.\u003c/p\u003e\n"]]],[],null,["Fast Pair Procedure\n-------------------\n\n### Procedure\n\n| **Note:** Google recommends implementing the [Cryptographic Test Cases](/nearby/fast-pair/specifications/appendix/cryptotestcases \"Link to the Cryptographic Test Cases.\") to ease verification of these requirements.\n\nInstead of immediately invoking any of the normal BR/EDR or BLE bonding\nprocedures, the Seeker first enables Notifications on the Key-based Pairing\ncharacteristic, and then writes the data in [Table 1.1](/nearby/fast-pair/specifications/characteristics#table1.1 \"table 1.1\") to it.\n\nWhen handling a write request from a Fast Pair Seeker, the Fast Pair Provider\nshall do the following:\n\n1. If the optional Public Key field **is present** :\n 1. If the device is not in pairing mode, ignore the write and exit.\n 2. Otherwise:\n 1. Use the received Public Key (a 64-byte point on the secp256r1 elliptic curve), the pre-installed [Anti-Spoofing Private Key](/nearby/fast-pair/specifications/configuration#antispoofing \"Anti-Spoofing\") - also secp256r1, and the Elliptic-Curve Diffie-Hellman algorithm to generate a 256-bit AES key.\n 2. Use SHA-256 to hash the 256-bit AES key.\n 3. Take the first 128 bits of the result. This is the Anti-Spoofing AES Key, used in the next step.\n2. Using AES-128, attempt to decrypt the value. Since the value is a single\n 16-byte AES block, no IV or multi-block cipher mode is necessary.\n\n 1. Which key to use:\n 1. If an Anti-Spoofing AES Key was generated in step 1, use that key.\n 2. Otherwise, try each key in the persisted Account Key List.\n 2. If a key successfully decrypts the value, break, and continue to the next step.\n 3. The value is decrypted successfully if the output matches the format in\n [Table 1.2.1](/nearby/fast-pair/specifications/characteristics#table1.2.1 \"table 1.2.1\") or [Table 1.2.2](/nearby/fast-pair/specifications/characteristics#table1.2.2 \"table 1.2.2\") - (that is, if it\n contains either the Fast Pair Provider's current BLE address, or the Fast\n Pair Provider's public address).\n\n NOTE: At the end of the packet there is a salt attached. When\n possible, these salts should be tracked, and if the Provider receives a\n request containing an already used salt, the request should be ignored to\n prevent replay attacks.\n 4. As an alternative to tracking salts, if the write includes the Provider's\n private address, another way to prevent replay attacks is to bring\n forward the time of the next resolvable private address rotation so that\n the rotation occurs before the next Key-based Pairing write will be\n accepted.\n\n3. If no key could successfully decrypt the value, ignore the write and exit.\n\n 1. Keep a count of these failures. **When the failure count hits 10, fail\n all new requests immediately. Reset the failure count after 5 minutes,\n after power on, or after a success.**\n4. Otherwise, save the successful key as *K* . Mark this *K* as usable for\n decrypting Passkey and Personalized name writes received on this LE link, but\n not other writes nor any writes on any other link. Start a timer to discard\n *K* after 10 seconds if pairing has not been started. Also discard *K* if\n this LE link disconnects.\n\n5. Produce the 16-byte Raw Response shown in [Table 1.3](/nearby/fast-pair/specifications/characteristics#table1.3 \"table 1.3\"), by\n concatenating the type and the Provider's BR/EDR address, and then filling\n the remainder of the packet with a block of random bytes (that is, a salt).\n\n6. Encrypt the Raw Response with K to produce the 16-byte Encrypted Response\n shown in [Table 1.4](/nearby/fast-pair/specifications/characteristics#table1.4 \"table 1.4\"). Send this via a notify on the Key-based Pairing\n characteristic.\n\n7. Read the request flag:\n\n 1. **If the Request's Flags byte has bit 2 set to 1** , notify [Additional Data characteristic](/nearby/fast-pair/specifications/characteristics#AdditionalData \"Characteristic - Additional Data\") with personalized name.\n 2. **If the Request's Flags byte has bit 1 set to 1:**\n 1. This indicates that the Seeker is requesting the Provider to initiate bonding to the Seeker's BR/EDR address, which is present in bytes 8-13.\n 2. Send a pairing request to the Seeker's BR/EDR address. The pairing request must be as described below (\"During pairing\" step).\n 3. Reason this is needed: Having the Provider initiate works around an issue on some devices.\n 3. **If the Request's Flags byte has bit 1 set to 0:**\n 1. Wait up to 10 seconds for a pairing request. If none is received, exit.\n 2. Note that this might be a BR/EDR request, from a different address (the Seeker's public address, instead of its resolvable private address). We will re-verify during pairing that the requesting device is in possession of *K*.\n8. During pairing:\n\n 1. When a **pairing request/response packet** is received from the Seeker: If the Device Capabilities in the request are NoInput/NoOutput, end pairing, to avoid using the Just Works pairing method.\n 2. For the pairing request/response packet sent by the Provider: Set the Device Capabilities field to **Display/YesNo** and set Authentication Requirements to **MITM Protection Required** . This triggers the Numeric Comparison pairing method (also known as [Passkey Confirmation](https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#PAIRING_VARIANT_PASSKEY_CONFIRMATION) on Android). We rely on this to confirm that the requesting device is in fact the Fast Pair Seeker, and that there is no man-in-the-middle. See [examples](#ProcedureExamples).\n 3. Reason this is needed: The Out-of-Band pairing method would be a better fit, but the platform does not expose it on all desired versions of Android.\n9. When **confirmation of the passkey is needed** , wait up to 10 seconds for a\n write to the [Passkey characteristic](/nearby/fast-pair/specifications/characteristics#Passkey \"passkey\").\n\n 1. Normally, with this pairing method, the user would confirm that the passkeys displayed on each device's screen are identical. Instead, only for this pairing, we transfer them over BLE, encrypted with the trusted pre-shared key.\n 2. Note that this approach should not be taken for devices that have a screen or a keyboard as it makes a slight compromise on MITM protection. Fast Pair currently does not support those device types yet because of this.\n 3. If the 10 second timer expires without a passkey being written, then discard *K*.\n10. When a **value is written to the Passkey characteristic** , this is the\n Encrypted Passkey Block. Decrypt it with K to yield a Raw Passkey Block, with\n format shown in [Characteristic: Passkey](/nearby/fast-pair/specifications/characteristics#Passkey \"passkey\") *\\\u003e* [Table 2.2](/nearby/fast-pair/specifications/characteristics#table2.2 \"table 2.2\") - (type =\n Seeker's Passkey).\n\n11. If decryption fails, ignore the write and discard *K*.\n\n12. Otherwise, the Raw Passkey Block contains a 6-digit passkey\n *P~Seeker~*, which is the passkey that the Seeker expects.\n\n13. Compare *P~Seeker~* with our own expected passkey,\n *P~Provider~*.\n\n 1. If the values are equal, reply \"yes\" to the confirmation.\n 2. Otherwise, reply \"no\" to the confirmation, causing pairing to fail.\n14. Regardless of whether pairing failed, produce another Raw Passkey Block, with\n format shown in [Characteristic: Passkey](/nearby/fast-pair/specifications/characteristics#Passkey \"passkey\") *\\\u003e* [Table 2.2](/nearby/fast-pair/specifications/characteristics#table2.2 \"table 2.2\"),\n containing our own expected passkey, *P~Provider~*.\n\n 1. Ensure the block has the correct type (Provider's Passkey; see table). NOTE: Do not reuse the salt from the Passkey Block received from the Seeker. Generate a new random value.\n15. Encrypt the Raw Passkey Block with *K*, and send the resulting Encrypted\n Passkey Block via a notify on the Passkey characteristic.\n\n16. If the Seeker receives and decrypts the correct passkey *P*, the Seeker will\n also reply \"yes\" to the confirmation, and pairing will succeed.\n\n 1. If the pairing succeeds, then mark *K* as usable for decrypting Account Key writes on this LE link, but not for any subsequent Passkey writes nor any writes on any other link. Start a timer to discard *K* after 10 seconds. Also discard *K* following any attempt to write an Account Key and, as per step 4, if the LE link disconnects.\n 2. If the pairing fails, discard *K*.\n17. Switch the device capabilities field back to default I/O capabilities and\n Authentication Requirements to default so that new\n pairings continue as expected.\n\nNote that for Providers that don't require bonding, the Seeker does not send a\npairing request to the Provider, that is step 8 - step 17 are skipped. Also,\n\"K\" is used in [Account Key characteristic](/nearby/fast-pair/specifications/characteristics#AccountKey \"Account Key\").\n\n##### Examples\n\n***Example 1:** Successful pairing attempt\n(no man-in-the-middle).* ***Example 2:** Failed pairing attempt, with a\nman-in-the-middle.*"]]