Google Play 应用签名 - 密钥哈希不匹配

Posted

技术标签:

【中文标题】Google Play 应用签名 - 密钥哈希不匹配【英文标题】:Google Play App Signing - KeyHash Mismatch 【发布时间】:2017-12-01 13:48:56 【问题描述】:

我正在使用新的 Google Play 应用签名来签署我的应用程序,但密钥哈希不匹配。

我在我的应用程序中集成了 Facebook 登录,它说 keyhash 无效。 我的 APK 的 keyhash 版本与 Google Play App Signing 过程创建的 keyhash 版本不同。

编辑:我做的步骤:

1) 创建了一个 jks 密钥库文件。

2) 创建了一个使用 jks 文件签名的 apk 版本。

3) 在 Google Console Developer 中导入 APK,订阅 Google Play App Signing 修改签名密钥。

4) 上线后,我下载并打开应用程序,Facebook 初始化提示:Invalid Key hash

当我通过下面的代码检查应用程序中的 hashkey 时,hash key 与 Facebook 所说的无效 hashkey 不同:

  try 
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.package",
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) 
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        
     catch (PackageManager.NameNotFoundException e) 

     catch (NoSuchAlgorithmException e) 

    

即使我将 Facebook 所说的 hashkey 放在 Facebook 仪表板中,它也不起作用。 Google Play App Signing 似乎在签名过程中修改了 hashkey。 你有解决办法吗?

【问题讨论】:

您应该使用单独的密钥散列进行生产,这可以使用您的发布密钥库文件生成。 :) 事实上,我首先使用 .jks 文件通过 android studio 签署我的应用程序以进行生产。它创建了一个我在 Google Play 控制台中导入的 APK 版本。我没有看到我错过了什么。 我的意思是,您必须使用发布密钥库文件生成 facebook api 密钥,就像您获取调试证书的 api 密钥一样。 是的,这就是我所做的,但是生成的密钥哈希值在谷歌签名前后的 apk 之间是不同的。 你能提供你做的步骤吗?你可以在你的问题中发布它吗?我很难想象你面临的问题。 【参考方案1】:

您必须使用 Google 生成的 SHA-1 密钥。以下步骤将解决它。

1)。转到 Google 控制台 => 发布管理 => 应用签名 => 应用签名证书

2)。从那里复制 SHA-1 证书,因为它在 hexadecimal 中,并且由于 Facebook 在 base64 中需要它,所以使用 步骤 3 中显示的命令 p>

3).从第 2 步回显 SHA-1 密钥(十六进制) | xxd -r -p | openssl base64 此命令在 命令提示符 中不起作用,请使用 bash on windowsgit cli

4)。将 base64 密钥 粘贴到 Facebook 控制台 => 设置 => 基本 => 密钥哈希强>

【讨论】:

我可以确认步骤 3 中的命令在命令提示符 (cmd.exe) 中运行,只要您的环境 PATH 变量中有此路径:C:\Program Files\Git\binC:\Program Files\Git\usr\bin(您需要安装 git for windows) 每次发布​​app都需要按照上面的流程吗? @RiddhiShah 如果您的意思是每次发布应用程序的新版本,那么没有。 如今在 Google Play 上的正确路径是设置 -> 应用完整性【参考方案2】:

您可以使用下一个命令(可能在 Git Bash 上)将十六进制格式的 SHA-1 哈希(在 Play 控制台中找到)转换为 base64 哈希:

echo 33:4E:48:84:19:50:3A:1F:63:A6:0F:F6:A1:C2:31:E5:01:38:55:2E | xxd -r -p | openssl base64

输出:

M05IhBlQOh9jpg/2ocIx5QE4VS4=

这个哈希值可以在例如设置 Facebook 应用程序时使用。 Answer Source

【讨论】:

【参考方案3】:

我遇到了同样的问题,似乎正如您所说,Google Play 商店使用新密钥重新签署您的 apk,这是您必须提供给 Facebook 作为密钥哈希的内容(不是使用 keytool 生成的) .

这个答案https://***.com/a/44448437/2640599的后半部分很有用。

基本上,您需要向 Facebook 提供基于 Google 生成的 SHA-1 应用签名证书的哈希值,而不是使用 keytool 和您的本地密钥(它现在似乎只是用于上传到 Google)。

【讨论】:

这正是我面临的问题。非常感谢! 这是每次发布都必须做的事情吗? 我和威尔有同样的问题?我们需要一次又一次吗?【参考方案4】:

上面的大多数答案都是正确的,但不是运行 hash 命令,而是有一个很好的工具,所以我将使用@neeraj 的答案作为基本答案重新说明这些步骤:

第 3 步是唯一更改的项目

您必须使用 Google 生成的 SHA-1 密钥。以下步骤将解决它。

1)。转到 Google 控制台 => 发布管理 => 应用签名 => 应用签名证书。

2)。从那里复制 SHA-1 证书,因为它是十六进制的,而且由于 Facebook 需要它在 base64 中,所以请使用步骤 3 中显示的在线工具

3)。转到https://base64.guru/converter/encode/hex 将十六进制转换为base64

4)。将 base64 密钥粘贴到 Facebook 控制台 => 设置 => 基本 => 密钥哈希

【讨论】:

【参考方案5】:

我猜您可能正在使用为debug.keystore 生成的密钥哈希。

您必须遵循的步骤

1.为发布证书生成密钥哈希。

转到命令行并执行此命令。将<*..*> 中的占位符替换为适当的值。

keytool -exportcert -alias <*provide an alias here. I recommend to use the same alias that you use for google play app signing*> -keystore _<*your path to the jks certificate*> | openssl sha1 -binary | openssl base64

此命令将生成密钥哈希。

2.复制上述命令生成的密钥哈希,并将其粘贴到您的 Facebook 应用程序控制台中,如下所示。。

3. 使用您的 jks 签署 apk。下载并安装到您的手机上进行测试。

试试这个,让我知道。一切顺利。 :)

【讨论】:

是的,我在我的步骤中这样做了,但是当您使用新的 Google Play 应用签名developer.android.com/studio/publish/app-signing.html时,它似乎有点不同@

以上是关于Google Play 应用签名 - 密钥哈希不匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用上传密钥为您的 Flutter 应用签名(Google Play 的应用签名)

使用上传密钥而不是 Google Play 应用签名密钥测试游戏服务

unity google play 应用程序签名问题和密钥库

Google Play 应用签名证书和上传证书都在 Google Play 控制台中创建了相同的 SHA1 密钥

Google Play - 应用程序包的错误签名密钥[重复]

无法使用 Google Play 应用签名上传证书更新发布 APK(使用原始密钥库)