【发布时间】:2016-11-22 09:33:40
【问题描述】:
如何获取安装在 android 设备上的另一个应用程序的证书 sha256 哈希? 我正在使用How to get APK signing signature? 中提到的解决方案。但它给出的签名似乎不是证书哈希。
【问题讨论】:
标签: android hash certificate sha256
如何获取安装在 android 设备上的另一个应用程序的证书 sha256 哈希? 我正在使用How to get APK signing signature? 中提到的解决方案。但它给出的签名似乎不是证书哈希。
【问题讨论】:
标签: android hash certificate sha256
尽管有名称,但它是证书的公共部分。
我的 CWAC-Security 库有 a SignatureUtils class with a getSignatureHash() method 计算此信息的 SHA-256 哈希。结果与使用 Java 的 keytool 转储密钥库中的哈希值相同。
核心代码相当短:
public static String getSignatureHash(Context ctxt, String packageName)
throws NameNotFoundException, NoSuchAlgorithmException {
MessageDigest md=MessageDigest.getInstance("SHA-256");
Signature sig=
ctxt.getPackageManager()
.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0];
return(toHexStringWithColons(md.digest(sig.toByteArray())));
}
// based on https://stackoverflow.com/a/2197650/115145
public static String toHexStringWithColons(byte[] bytes) {
char[] hexArray=
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F' };
char[] hexChars=new char[(bytes.length * 3) - 1];
int v;
for (int j=0; j < bytes.length; j++) {
v=bytes[j] & 0xFF;
hexChars[j * 3]=hexArray[v / 16];
hexChars[j * 3 + 1]=hexArray[v % 16];
if (j < bytes.length - 1) {
hexChars[j * 3 + 2]=':';
}
}
return new String(hexChars);
}
【讨论】:
你可以试试这样的:
PackageManager packageManager = getPackageManager();
int flag = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = null;
try {
packageInfo = packageManager.getPackageInfo(packageName, flag);
byte[] certificates = packageInfo.signatures[0].toByteArray();
InputStream input = new ByteArrayInputStream(certificates);
CertificateFactory factory = CertificateFactory.getInstance("X509");
X509Certificate certificate = (X509Certificate) factory.generateCertificate(input);
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
byte[] publicKey = messageDigest.digest(certificate.getEncoded());
} catch (PackageManager.NameNotFoundException exception) {
exception.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e2) {
e2.printStackTrace();
}
【讨论】: