引言
在Android开发和安全分析中,获取应用的SHA1签名是一项常见且重要的任务。无论是用于验证应用签名、配置Google API,还是进行安全审计,都需要准确获取签名信息。本文将详细介绍通过ADB命令行工具获取应用SHA1签名的完整流程。
环境准备
在开始之前,请确保:
- 已安装ADB工具
- 已启用手机的USB调试模式
- 电脑与手机通过USB连接
完整步骤
步骤1:连接设备并查找目标应用
bash
# 查看已连接的设备
adb devices
# 查找目标应用的包名
adb shell pm list packages | grep 关键词
说明 :如果不知道包名,可以通过grep命令搜索应用的关键词。
例如:
步骤2:定位APK文件路径
bash
adb shell pm path 你的包名
示例输出:
package:/data/app/com.example.app-1/base.apk
步骤3:提取APK到电脑
bash
adb pull /data/app/包名路径/base.apk
实际示例:
bash
adb pull /data/app/com.example.app-1/base.apk ./target.apk
步骤4:计算SHA1签名
bash
# 方法1:使用apksigner(推荐)
apksigner verify -v --print-certs target.apk | grep -E "SHA-1"
# 方法2:使用keytool(需要提取签名证书)
unzip -p target.apk META-INF/*.RSA | keytool -printcert | grep SHA1
典型输出:
Signer #1 certificate SHA-1 digest: a1b2c3d4e5f6...
常见问题与解决方案
问题1:apksigner命令不存在
解决方案:
bash
# 使用完整路径(Android SDK Build Tools中)
~/Android/Sdk/build-tools/版本号/apksigner verify -v --print-certs target.apk
或查看这篇文章
问题2:需要root权限才能访问APK路径
解决方案A:使用无root方法
bash
# 使用ADB备份功能
adb backup -f backup.ab -apk 包名
# 然后从备份文件中提取APK
解决方案B:对于已安装应用商店的情况
bash
# 使用包管理器复制到可访问位置
adb shell pm path 包名 | cut -d: -f2 | xargs -I {} adb shell cp {} /sdcard/temp.apk
adb pull /sdcard/temp.apk
问题3:多个签名者的情况
当应用使用多个签名证书时,可以使用:
bash
apksigner verify -v --print-certs target.apk | grep -A5 "Signer"
这会显示所有签名者的完整信息。
自动化脚本示例
创建get_sha1.sh脚本:
bash
#!/bin/bash
if [ -z "$1" ]; then
echo "使用方法: $0 <包名>"
exit 1
fi
PACKAGE_NAME=$1
APK_PATH=$(adb shell pm path $PACKAGE_NAME | cut -d: -f2)
if [ -z "$APK_PATH" ]; then
echo "找不到包: $PACKAGE_NAME"
exit 1
fi
adb pull $APK_PATH temp.apk > /dev/null
echo "提取APK成功,正在计算SHA1..."
apksigner verify -v --print-certs temp.apk 2>/dev/null | grep -E "SHA-1" | head -1
rm -f temp.apk
应用场景
- Google API配置:Google Maps、Firebase等需要SHA1签名
- 应用验证:确认应用是否被重新签名
- 安全审计:分析应用的签名信息
- 持续集成:自动化构建和验证流程
注意事项
-
调试版与发布版:调试版和发布版的SHA1通常不同
-
多个变体:同一个应用可能有不同的构建变体(flavor)
-
签名证书有效期 :可以通过
apksigner查看完整的证书信息bashapksigner verify --verbose --print-certs <path_to_your_apk_file> -
V1/V2/V3签名:现代APK可能使用多种签名方案
总结
通过ADB获取应用的SHA1签名是一个简单但强大的技术。掌握这个方法不仅能帮助开发者配置各种服务,还能在安全分析和问题排查中发挥重要作用。建议将常用命令封装为脚本,提高工作效率。