安卓获取应用签名
通过apk文件直接查看
keytool -printcert -jarfile yyb.apk
通过RSA文件查看
将apk后缀名改为zip,解压
进入META-INF文件夹,找到后缀名为RSA的文件
通过命令
keytool -printcert -file ANDROID.RSA
直接获取到签名信息
但是上面两种都没有获取到MD5的签名
下面是最有效的方式
通过Android Studio Task查看
打开Android Studio边栏的Gradle
找到Task,按理说会直接有,可能是Flutter项目的设置,这里默认是没有build task的,所以得去设置里面配置一下
配置好了再Gradle Sync之后就会出现Task列表
找到signingReport双击直接生成签名(包括debug,profile,release)的MD5,SHA1,SHA-256
用jks加密文件获取
jks作为加密文件可以直接拿到签名信息
keytool -list -v -keystore upload-keystore.jks
接下来输入密钥就可以获取到签名
在代码中获取
定义一个getSignInfo方法
public static ArrayList<String> getSignInfo(Context context, String type) {
if (context == null || type == null) {
return null;
}
String packageName = context.getPackageName();
if (packageName == null) {
return null;
}
if (mSignMap.get(type) != null) {
return mSignMap.get(type);
}
ArrayList<String> mList = new ArrayList<String>();
try {
Signature[] signs = getSignatures(context, packageName);
assert signs != null;
for (Signature sig : signs) {
String tmp = "error!";
switch (type) {
case MD5:
tmp = getSignatureByteString(sig, MD5);
break;
case SHA1:
tmp = getSignatureByteString(sig, SHA1);
break;
case SHA256:
tmp = getSignatureByteString(sig, SHA256);
break;
}
mList.add(tmp);
}
} catch (Exception e) {
System.out.println(e);
}
mSignMap.put(type, mList);
return mList;
}
核心代码就是
private static Signature[] getSignatures(Context context, String packageName) {
PackageInfo packageInfo = null;
try {
packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
return packageInfo.signatures;
} catch (Exception e) {
System.out.println(e);
}
return null;
}
直接获取包信息里面的签名
packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
return packageInfo.signatures;
把签名的byte[]信息转换成 95:F4:D4:FG 这样的字符串形式
private static String getSignatureByteString(Signature sig, String type) {
byte[] hexBytes = sig.toByteArray();
String fingerprint = "error!";
try {
MessageDigest digest = MessageDigest.getInstance(type);
byte[] digestBytes = digest.digest(hexBytes);
StringBuilder sb = new StringBuilder();
for (byte digestByte : digestBytes) {
sb.append(((Integer.toHexString((digestByte & 0xFF) | 0x100)).substring(1, 3)).toUpperCase());
sb.append(":");
}
fingerprint = sb.substring(0, sb.length() - 1);
} catch (Exception e) {
System.out.println(e);
}
return fingerprint;
}
运行时调用此方法可以获取到包括SHA1、MD5等签名信息,把对应的类型传进去就行了
通过工具获取
微信以前提供了apk,安装后输入包名就可以直接拿到签名