Signature.hashCode 指的是正确的 hashCode 吗?

2024-01-01

是否执行以下代码(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(使用前将#替换为@)

Signature.hashCode 指的是正确的 hashCode 吗? 的相关文章

随机推荐