安卓获取应用签名

通过apk文件直接查看

keytool -printcert -jarfile yyb.apk

WX20230214-091554_2x

通过RSA文件查看

将apk后缀名改为zip,解压

进入META-INF文件夹,找到后缀名为RSA的文件

WX20230214-091650_2x

通过命令

keytool -printcert -file ANDROID.RSA

直接获取到签名信息

WX20230214-091802_2x

但是上面两种都没有获取到MD5的签名

下面是最有效的方式

通过Android Studio Task查看

打开Android Studio边栏的Gradle

找到Task,按理说会直接有,可能是Flutter项目的设置,这里默认是没有build task的,所以得去设置里面配置一下

WX20230214-092138_2x

配置好了再Gradle Sync之后就会出现Task列表

WX20230214-093035_2x

找到signingReport双击直接生成签名(包括debug,profile,release)的MD5,SHA1,SHA-256

WX20230214-093436_2x

用jks加密文件获取

jks作为加密文件可以直接拿到签名信息

keytool -list -v -keystore upload-keystore.jks

接下来输入密钥就可以获取到签名

cdeb31af1c407ce0c5de9024c2184101

在代码中获取

定义一个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,安装后输入包名就可以直接拿到签名

点击下载

posted @ 2023-02-14 10:26  R1cardo  阅读(867)  评论(0编辑  收藏  举报