从内部应用程序获取私钥

时间:2013-12-05 09:30:24

标签: android certificate x509certificate private-key

有没有办法获取当前APK签名的私钥?

该操作是完全安全的,因为对app的任何修改(注入)都需要新的签名和新密钥对。因此,如果正在运行的代码可以访问私钥(开发人员知道这一点),那么它只能被原始代码访问而不是恶意代码。

X509Certificate允许访问PublicKey,但我需要访问PrivateKey。

public static X509Certificate GetCertificate(Context context) {

    PackageManager pm = context.getPackageManager();
    String packageName = context.getPackageName();
    PackageInfo packageInfo = null;
    try {
        packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    Signature[] signatures = packageInfo.signatures;

    byte[] cert = signatures[0].toByteArray();

    InputStream input = new ByteArrayInputStream(cert);


    CertificateFactory cf = null;
    try {
        cf = CertificateFactory.getInstance("X509");
    } catch(CertificateException e) {
        e.printStackTrace();
    }
    X509Certificate c = null;

    try {
        c  = (X509Certificate) cf.generateCertificate(input);
    } catch(CertificateException e) {

    }

    return c;
}

修改 一个附带问题可能是:

有没有办法确保当前运行的代码在原始证书的APK中运行? (每个人都可以访问公钥,因此它不适合检查,但私钥只有原始开发人员知道,可以保护它(以某种方式)并检查包证明。)

1 个答案:

答案 0 :(得分:1)

私钥仅用于签署APK,从不(理论上)离开签名地点。因此无法从APK中恢复它。

更新:不,代码本身无法检查自己图像的有效性。如果图像已被更改,则删除检查也很简单。