android签名

签名相关

Posted by chchaooo on February 24, 2019

获取运行中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

重新签名

  1. 解压apk文件
  2. 删除解压出来META-INF目录中的CERT和MANIFEST文件
  3. 删除文件夹后重新把解压出来的其它文件夹压缩为zip文件,然后直接把文件后缀改为apk

    一定要选中要压缩的文件,然后压缩成.zip 文件,zip文件必须是根目录,即打开zip文件,就能看见压缩的文件内容,这非常重要。

  4. 为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
    • 最后一个字段是签名文件的别名