我怎样才能找到蓝牙链接密钥在 Windows 7 中配对设备?这是依赖于我正在使用的蓝牙堆栈(东芝)的东西吗,或者在 Windows 7 中是否有一个通用的地方来存储这些?
注意:我说的不是用户在配对过程中通常输入的六位数代码——那是没有价值的,因为它在配对过程后会被丢弃。我指的是设备在配对过程中交换的 128 位链接密钥,此后用于加密所有蓝牙流量。
背景:
我在笔记本电脑上双启动 Windows 7 / Ubuntu,我想将手机与这两个操作系统配对。由于双启动计算机只有一个蓝牙适配器,因此只有一个蓝牙地址,我无法与手机进行两次配对,因为在第二次配对(Windows)时,手机只会将之前的配对(Linux)替换为相同的蓝牙地址。
Ubuntu 论坛上的一个帖子指出我要做的事情 - 首先在 Linux 上配对,然后在 Windows 上配对,然后用 Windows 协商的链接密钥替换 Linux 端的链接密钥。
我可以从中找到 Linux 端配对密钥/var/lib/Bluetooth/[BD_ADDR]/linkkeys
- 那里没有问题。
但是,在 Windows 端我找不到该项。根据论坛帖子,在 Windows 端该项应该在,SYSTEM\ControlSet002\services\BTHPORT\Parameters\Keys\[BD_ADDR]
但该注册表项做存在,但它没有子项。(并且 ControlSet001 中的类似注册表路径也没有任何子项。)
我被要求做的一件事就是捕捉与Sysinternals 进程监视器。我这样做了,但我无法从捕获的事件中找到任何有用的信息,即使将数据导出到巨大的 XML 并使用 BD_ADDR(带或不带冒号)对其进行 grepping 也没有用。
那么我怎样才能找到链接密钥在 Windows 7 中配对设备?
一些参考信息:维基百科:蓝牙,现在的安全:蓝牙安全
答案1
您应使用的注册表项是:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys
。
在我的计算机上,它拒绝让我访问此密钥。我必须将所有者更改为管理员,然后才能看到子密钥。
如果您使用的是东芝蓝牙堆栈,其密钥将存储在其他地方。您可以找到它的位置,也可以直接返回到 Microsoft 堆栈。在后一种情况下,蓝牙密钥将存储在注册表中,如上所示。
这线描述过程:
- 卸载东芝蓝牙(添加/删除程序),
- 重启,
- Windows 现在应该检测到“新的”蓝牙设备并为其安装自己的驱动程序。
注意:首先创建一个系统还原点,并确保您拥有用于恢复的东芝驱动程序的安装介质(以防万一)。在欢呼胜利之前,请先测试配对手机的功能。
答案2
管理员看不到这些密钥,您应该以系统帐户身份打开注册表:
这是适用于带有 ThinkPad 蓝牙 4.0 适配器的 ThinkPad 上的 Windows 7,但可能适用于其他 Windows 系统
下载 PsExec: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
将其解压到c:\portable\pstools\打开cmd单击开始,输入cmd,按回车键,在黑白窗口内输入:
c:\portable\pstools\psexec -s -i regedit
regedit 打开后,导航至:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\
您会在那里找到所有蓝牙适配器的 MAC 地址,并且在每个适配器下,是所有配对设备的 MAC 地址及其链接密钥。
找出适配器的 MAC 地址:
bluetooth settings> Hardware > ThinkPad Bluetooth 4.0 > Properties > Advanced > Address
确定你的设备(键盘/鼠标)的 MAC 地址:
Control Panel > Hardware and Sound > Devices and Printers > right click your device > Properties > Bluetooth > Unique Identifier
答案3
我遇到了完全相同的问题,所以我找到了这篇文章,现在想分享我的经验。如果你有安卓智能手机,那么这项任务实际上可能要容易得多,因为配对链接密钥应该存在于你的两个设备上。
最有用的工具是 Android SDK 中的 ADB。
假设手机有 XX^6 地址,PC -- YY^6
$ adb shell
~ # find|grep linkkeys
~ # ./data/misc/bluetoothd/XX:XX:XX:XX:XX:XX/linkkeys
~ # cat ./data/misc/bluetoothd/XX:XX:XX:XX:XX:XX/linkkeys
YY:YY:YY:YY:YY:YY 393FCA48F0DB57AA4D59F423E4EA60D5 5 -1
~ #
因此,您可以从该文件中选择密钥并将其放入您电脑上的类似文件中:
pc $ sudo -s
pc # cat /var/lib/bluetooth/YY:YY:YY:YY:YY:YY/linkkeys
XX:XX:XX:XX:XX:XX 393FCA48F0DB57AA4D59F423E4EA60D5 5 0
这种方式似乎是最容易的,因为 linux 和 android 通常使用相同的 bluez 蓝牙堆栈。
不过,如果您个人不喜欢这种技术,那么还有另一种方法可以从 Windows 注册表中获取密钥,前提是使用标准的 Windows 驱动程序。我确实收到了该安全消息对话框,因此我使用了“chntpw”原生 Linux 实用程序,它允许重置密码或编辑 Windows 注册表文件。所需的文件是“windows\system32\config\SYSTEM”。
下面是:
$ chntpw -e SYSTEM
blah-blah-blah
> cd ControlSet001\services\BTHPORT\Parameters\Keys\yyyyyyyyyyyy
(...)\BTHPORT\Parameters\Keys\5cac4c10c4f1> ls
Node has 0 subkeys and 1 values
size type value name [value if type DWORD]
16 REG_BINARY <xxxxxxxxxxxx>
(...)\BTHPORT\Parameters\Keys\5cac4c10c4f1> hex xxxxxxxxxxxx
Value <xxxxxxxxxxxx> of type REG_BINARY, data length 16 [0x10]
:00000 39 3F CA 48 F0 DB 57 AA 4D 59 F4 23 E4 EA 60 D5 9?.H..W.MY.#..`.
如您所见,这与上面的文件中的数字完全相同。希望它能帮助后代。
答案4
PsExec.exe -s -i regedit /E %cd%\btkeys_export.txt “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys”