是否执行以下代码(sign.hashCode()
) 给我签名的 hashCode 或内存中对象的哈希值?
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(
"com.klxx.as", PackageManager.GET_SIGNATURES);
Signature[] signs = packageInfo.signatures;
Signature sign = signs[0];
Log.i("test", "hashCode : "+sign.hashCode());
} catch (Exception e) {
e.printStackTrace();
}
文档(here https://developer.android.com/reference/android/content/pm/Signature.html)仅表示以下内容,与任何其他对象一样。
该对象的哈希码值。
但我在多个网站上看到了上面的代码片段,声称它显示了 apk 的标志。此外,其他一些来源也使用签名字节来自行创建哈希值。
虽然其他答案在技术上是正确的,但在其他方面却是正确的危险的虚假:
Yes, Signature.hashCode()
被覆盖 http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/content/pm/Signature.java#216并且确实在签名字节上计算了一些弱的 32 位哈希值,这使其具有确定性。
But,您不应该使用此值作为任何类型的信任决策的基础,如果您首先检索签名,您通常希望这样做。这是因为很容易生成具有相同值的假签名hashCode()
:简单生成2^32
随机签名证书使您有很好的机会发现冲突,并且非常可行。
Instead,您应该使用加密安全哈希函数,例如 SHA-256 等将生成的哈希值转换为 Base64:
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(sign.toByteArray());
String hash = Base64.encodeToString(hashBytes, Base64.NO_WRAP);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)