我们有一些使用相同网络服务的应用,我们需要一种方法来唯一标识哪个应用正在调用网络服务。
我最后做的是发送应用程序的哈希签名以及其他参数。获取签名的代码类似于这个https://stackoverflow.com/a/25524657/17648 .
然后我有一个表,其中存储了所有哈希值,稍后我可以使用它来与对 Web 服务的调用进行比较,并找出哪个应用程序调用了哪个方法。
通过这样做,我不需要在调用 Web 服务时创建 switch 语句。
现在一切正常,但我只想确保散列签名对于我们发布的任何版本的 apk 都是相同的,并且对于安装它的任何手机/平板电脑也是相同的。
最佳答案
该答案中的代码实际上是从您的 keystore 中散列公钥,因为这确实是 signatures
字段中的内容。如果您使用 SHA-256 哈希算法,您将获得与通过 Java 7+ 的 keytool
命令转储 keystore 的哈希值相同的值。
这会导致两个潜在的问题:
对于使用相同签名 keystore 签名的任何应用程序,您应该获得相同的值。要区分应用程序,您需要使用不同的签名 keystore 。无论如何,你可能正在这样做。
Signature
的byte[]
的确切格式在技术上没有记录。他们有可能在未来改变现状。因此,您以后可能需要版本相关的逻辑。
恕我直言,您的算法并没有比使用应用程序 ID 使用 getPackageName()
好多少。
关于android - APK 哈希签名是否会更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39282484/