获取运行中app的签名信息
对于keystore文件
keytool -list -v -keystore **.keystore
证书指纹:
MD5: D7:F***
SHA1: A8:9***
SHA256: 48:7***
通过代码可获取任意运行中的应用的证书指纹信息:(SHA1值)
public String getSHA1Signature(Context context, String packageName) {
try {
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
byte[] cert = info.signatures[0].toByteArray();
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(cert);
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < publicKey.length; i++) {
String appendString = Integer.toHexString(0xFF & publicKey[i])
.toUpperCase(Locale.US);
if (appendString.length() == 1)
hexString.append("0");
hexString.append(appendString);
hexString.append(":");
}
return hexString.toString();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
通过apk获取签名信息
使用解压工具解压 APK 文件,在 META-INF 文件夹拿到 CERT.RSA 文件。
keytool -printcert -file CERT.RSA
重新签名
- 解压apk文件
- 删除解压出来META-INF目录中的CERT和MANIFEST文件
- 删除文件夹后重新把解压出来的其它文件夹压缩为zip文件,然后直接把文件后缀改为apk
一定要选中要压缩的文件,然后压缩成.zip 文件,zip文件必须是根目录,即打开zip文件,就能看见压缩的文件内容,这非常重要。
- 为APK重新生成签名
将证书复制到与需要重新签名的apk文件相同的目录下
进入该目录下执行以下语句:
jarsigner -verbose -keystore cm7.keystore -signedjar app-1373-resigned.apk app-1373.apk androiddebug
命令解释:
- jarsigner是Java的签名工具,JDK自带
- verbose参数表示:显示出签名详细信息
- keystore表示使用当前目录中的android.keystore签名证书文件。
- signedjar app-release.apk app-dubug.apk 表示签名后生成的APK名称为app-release.apk ,未签名的APK Android软件名称为app-dubug.apk
- 最后一个字段是签名文件的别名