安卓系统信任文件(公钥)

USB

与IOS中LockDown文件类似,安卓系统从4.2以后也有相似的安全机制,手机连接电脑后会弹出提示框,询问是否启用调试模式,如果勾选“一律允许使用这台计算机进行调试”,则信任此计算机,以后不需要允许可以直接连接。

安卓使用的是公钥认证机制,安装驱动(Win7)后会在C:\Users\用户名\.android目录会自动生成一个私钥(adbkey)和公钥(adbkey.pub)。

adbkey

手机上授权主机公钥保存在/data/misc/adb/adb_keys目录。

手机连上后,主机上的adb daemon会向手机发送主机的公钥,手机查询/data/misc/adb/adb_keys目录中是否有该公钥存在,如果有则连接成功,如果没有就弹框,询问是否允许,如果允许就连接,如果永久允许就把公钥写入/data/misc/adb/adb_keys目录。

所以说:只要把目标主机上的adbkey和adbkey.pub文件拿到,覆盖到自己的电脑,信任目标主机的手机就都能连接了。

 

参考资料:浅淡ADB的公私钥认证机制  以下为参考内容全文

2012年8月开始,adb增加了公私钥认证机制,只允许授权主机使用USB调试接口。

当手机接入未授权主机时,主机上的adb daemon向手机发送主机公钥。手机上弹出信
息框,询问是否允许(或永久允许)主机使用USB调试接口。如果选择永久允许,主机公
钥将被保存到手机中。有可能在手机ROM发布阶段已经内置了一些主机公钥,当心!

主机端公私钥对如果不存在,在adb daemon启动时会自动生成,对于Win 7,保存在:

%USERPROFILE%\.android\adbkey       // 私钥
%USERPROFILE%\.android\adbkey.pub   // 公钥

在Windows上主机公钥总是以"unknown@unknown"结尾。

另有说法,主机端公私钥对保存在%ANDROID_SDK_HOME%或%ADB_VENDOR_KEYS%目录下,
我没碰上这种情形。

手机端厂商公钥保存在/adb_keys中,来自授权主机的主机公钥保存在:

/data/misc/adb/adb_keys

ADB协议如下:

主机连接手机。手机向主机发送AUTH TOKEN报文,包含源自/dev/urandom的20字节的
随机token。主机用自己的私钥对该随机token进行签名(SHA1+RSA),放在发往手机的
SIGNATURE报文中。手机检查签名,如果正确,响应以CONNECT报文,否则向主机发送
新的AUTH TOKEN报文,提供新的随机token。主机可以尝试另一组公私钥对。如果主机
已经尝试完所有公私钥对,则向手机发送AUTH RSAPUBLICKEY报文,包含一个主机公钥。
手机端的adbd将主机公钥发往framework,后者弹出信息框,询问是否允许(或永久允
许)主机使用USB调试接口,该信息框中一般会显示主机公钥的指纹(MD5),而不是主机
公钥本身。

可用如下命令生成主机公钥指纹:

$ awk "{print $1}" < adbkey.pub | openssl base64 -A -d -a | openssl md5 -c | awk "{print $2}" | tr "[:lower:]" "[:upper:]"
23:B2:47:E1:08:DE:5A:3B:58:5A:A5:A6:FA:98:E0:50
--------------------------------------------------------------------------
/*
* /system/build.prop
*/
ro.adb.secure=1

这是缺省设置,表示启用adb公私钥认证机制,没有GUI界面调整这个设置。为0表示
禁用。
--------------------------------------------------------------------------
对于原始需求,设法删除保存在/data/misc/adb/adb_keys中的主机公钥即可。注意,
该文件中可能有多个主机公钥,只需删除你想删除的那一个即可。该文件权限如下:

$ ls -l /data/misc/adb/adb_keys
-rw-r----- system   shell

如果有root权限,简单粗暴的办法是:

# cat /dev/null > /data/misc/adb/adb_keys

重启手机使之生效。理论上重启手机端adbd会重读/data/misc/adb/adb_keys:

stop adbd
start adbd

但这组操作不能在"adb shell"里进行,因为"adb shell"依赖adbd。如果你有其他
shell,可以一试。

据说Android 4.3的开发者选项里增加了"Revoke USB debugging authorizations",
它会清空/data/misc/adb/adb_keys,而不是删除单条主机公钥。