Android进阶之获取APK签名信息及MD5指纹

来源:互联网 发布:网络推广邀约话术 编辑:程序博客网 时间:2024/04/29 07:24

1 Android进阶之获取APK签名信息及MD5指纹

package com.guesslive.caixiangji.util;public class SignUtils {    private static final String ALGORITHM = "RSA";    private static final String SIGN_ALGORITHMS = "SHA1WithRSA";    private static final String DEFAULT_CHARSET = "UTF-8";    public static String sign(String content, String privateKey) {        try {            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(                    Base64.decode(privateKey));            KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);            PrivateKey priKey = keyf.generatePrivate(priPKCS8);            java.security.Signature signature = java.security.Signature                    .getInstance(SIGN_ALGORITHMS);            signature.initSign(priKey);            signature.update(content.getBytes(DEFAULT_CHARSET));            byte[] signed = signature.sign();            return Base64.encode(signed);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 获取APK的签名信息     */    private String showUninstallAPKSignatures(String apkPath) {        String PATH_PackageParser = "android.content.pm.PackageParser";        try {            // apk包的文件路径            // 这是一个Package 解释器, 是隐藏的            // 构造函数的参数只有一个, apk文件的路径            // PackageParser packageParser = new PackageParser(apkPath);            Class pkgParserCls = Class.forName(PATH_PackageParser);            Class[] typeArgs = new Class[1];            typeArgs[0] = String.class;            Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);            Object[] valueArgs = new Object[1];            valueArgs[0] = apkPath;            Object pkgParser = pkgParserCt.newInstance(valueArgs);//          MediaApplication.logD(DownloadApk.class, "pkgParser:" + pkgParser.toString());            // 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况            DisplayMetrics metrics = new DisplayMetrics();            metrics.setToDefaults();            // PackageParser.Package mPkgInfo = packageParser.parsePackage(new            // File(apkPath), apkPath,            // metrics, 0);            typeArgs = new Class[4];            typeArgs[0] = File.class;            typeArgs[1] = String.class;            typeArgs[2] = DisplayMetrics.class;            typeArgs[3] = Integer.TYPE;            Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",                    typeArgs);            valueArgs = new Object[4];            valueArgs[0] = new File(apkPath);            valueArgs[1] = apkPath;            valueArgs[2] = metrics;            valueArgs[3] = PackageManager.GET_SIGNATURES;            Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);            typeArgs = new Class[2];            typeArgs[0] = pkgParserPkg.getClass();            typeArgs[1] = Integer.TYPE;            Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",                    typeArgs);            valueArgs = new Object[2];            valueArgs[0] = pkgParserPkg;            valueArgs[1] = PackageManager.GET_SIGNATURES;            pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);            // 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开            Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");            Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);//          MediaApplication.logD(DownloadApk.class, "size:"+info.length);//          MediaApplication.logD(DownloadApk.class, info[0].toCharsString());            return info[0].toCharsString();        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 获取程序自身的签名     *     * @param context     * @return     */    private String getSign(Context context) {        PackageManager pm = context.getPackageManager();        List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);        Iterator<PackageInfo> iter = apps.iterator();        while (iter.hasNext()) {            PackageInfo packageinfo = iter.next();            String packageName = packageinfo.packageName;            if (packageName.equals(context.getPackageName())) {//              MediaApplication.logD(DownloadApk.class, packageinfo.signatures[0].toCharsString());                return packageinfo.signatures[0].toCharsString();            }        }        return null;    }    /**     * 获取指定已安装完整签名信息,包括MD5指纹     */    public void getSingInfo(Context context) {        try {            PackageInfo packageInfo = context.getPackageManager().getPackageInfo("com.sina,weibo", PackageManager.GET_SIGNATURES);            Signature[] signs = packageInfo.signatures;            Signature sign = signs[0];            parseSignature(sign.toByteArray());        } catch (Exception e) {            e.printStackTrace();        }    }    public void parseSignature(byte[] signature) {        try {            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");            X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));            String pubKey = cert.getPublicKey().toString();            String signNumber = cert.getSerialNumber().toString();        } catch (CertificateException e) {            e.printStackTrace();        }    }}
0 0