有没有办法获取当前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中运行? (每个人都可以访问公钥,因此它不适合检查,但私钥只有原始开发人员知道,可以保护它(以某种方式)并检查包证明。)
答案 0 :(得分:1)
私钥仅用于签署APK,从不(理论上)离开签名地点。因此无法从APK中恢复它。
更新:不,代码本身无法检查自己图像的有效性。如果图像已被更改,则删除检查也很简单。