【问题标题】:Android app Key Hash doesn't match any stored key hashesAndroid 应用程序密钥哈希与任何存储的密钥哈希不匹配
【发布时间】:2013-10-21 01:39:55
【问题描述】:

我在 Play Store 上有一个生产应用程序,它使用 Facebook SDK 登录。 当我从 Eclipse 调试应用程序时没有问题,但是当它投入生产时,它在 Facebook 向我询问权限后给了我以下错误。 我在 developer.facebook.com 上的应用页面上添加了使用 keytool 生成的密钥哈希:

keytool -exportcert -alias diego -keystore "C:\Users\Diego\Desktop\CeluChat.KeyStore" | "C:\openssl\bin\openssl.exe" sha1 -binary | "C:\openssl\bin\openssl.exe" base64

CeluChat.KeyStore 是我导出签名应用程序时使用的密钥库,当 keytool 提示我输入密码时,我在导出时输入了相同的密码。

但是在生产(从 Play 商店下载)给我的错误是:

10-20 22:21:10.752: W/fb4a(:):BlueServiceQueue(5872): com.facebook.http.protocol.ApiException:密钥哈希 VQ3XhZb5_tBH9oGe2WW32DDdNS0 不匹配任何存储的密钥哈希。

异常中的 Key Hash 与 keytool 生成的 Key Hash 不同。无论如何,我在 Facebook 上添加了 Key Hash,但它仍然无法正常工作。

【问题讨论】:

  • Facebook今天出现全球性问题,稍后查看
  • 当您为 Play 商店提交 apk 时,通常会使用与开发时不同的密钥库,这会为您提供不同的密钥哈希。您需要将两个密钥哈希都放入您的设置中。您确定错误中给出的值也不起作用吗?您可以发布您的应用设置的屏幕截图吗?
  • 我使用 keytool 生成的密钥哈希是使用 relase 密钥,而不是调试,所以问题不在于那个。还是谢谢
  • 如果你是从日志中复制密钥哈希并使用它,注意在日志中它最后没有打印一个=,你必须在日志中打印的内容后缀一个=并且然后在 Facebook 密钥哈希中使用它。

标签: android facebook-android-sdk


【解决方案1】:

请按照以下方法生成哈希密钥这是@lucianbase 在此页面https://github.com/AntonioCuevaUrraco/nativescript-facebook-login/issues/14 建议的@

使用 android studio 或 cmd 工具为您的应用生成 SHA1 密钥。 复制它 像这样 CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84 并打开 http://tomeko.net/online_tools/hex_to_base64.php 将您的 SHA1 值转换为 base64。 这就是 Facebook 的要求 获取生成的哈希“********************=”并将密钥哈希复制到 facebook 应用程序。

【讨论】:

  • 这就是为我做的。谢谢你。其他的都没有工作。
  • 这适用于我使用存储在 Google 中的应用签名证书的 SHA1,谢谢!对于那些在 Play 商店发布但在本地没有问题的人:您基本上必须使用您在生产环境中签署应用程序时使用的密钥生成密钥哈希 - 这通常由 Google 处理。
【解决方案2】:

我在运行我的应用程序时使用它来显示密钥。就我而言,我从 keytool 命令中获取了不正确的密钥哈希。请注意,如果您(故意)输入错误的密码,则会生成错误的密钥,而不是收到错误。使用它来获取正确的哈希并查看它是否与错误日志中的匹配

try {
        PackageInfo info =     getPackageManager().getPackageInfo("com.package.mypackage",     PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            String sign=Base64.encodeToString(md.digest(), Base64.DEFAULT);
            Log.e("MY KEY HASH:", sign);
            Toast.makeText(getApplicationContext(),sign,     Toast.LENGTH_LONG).show();
        }
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}

另外,如果由于某种原因上述方法不起作用。尝试使用此 APK 生成正确的密钥哈希。请记住,您必须使用您尝试检索(调试或发布)的任何证书对其进行签名。将它安装在您的测试设备上,然后运行它。

http://www.easyfacebookandroidsdk.com/download/keyhash.zip

【讨论】:

  • 我使用该代码并发现密钥哈希与 facebook 在异常中给出的相同,但将“_”替换为“/”并在末尾添加“=”。谢谢
  • 它并没有取代我的任何东西,但也错过了最后的“=”。
  • @DiegoSuárez 如何用“/”替换“_”我刚刚更改了它,但它没有作为 Keyhash 保存在那里。请告诉我方法。
  • 这对我有用。官方文档中带有 keytool 和 openssl 的命令返回差异哈希。 :((
【解决方案3】:

好吧,如果您使用 Windows,请在 cmd 中使用此命令。

移动到 C:\Program Files\Java\jdk1.8.0_25\bin

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | "C:\openssl\bin\openssl.exe" sha1 -binary | "C:\openssl\bin\openssl.exe" base64

在windows上生成hash key需要使用openssl-0.9.8e_X64.zip,不能使用openssl-0.9.8k_X64.zip

这就是解决方案。

【讨论】:

  • 工作..帮了我很多
【解决方案4】:

实际上最好和最简单的方法是这样的。如果您在手机屏幕上看到该问题。你应该看到 android studio LOGCAT 的问题。会喜欢这样的

01-26 14:58:22.885 14851-19534/? W/fb4a.BlueServiceQueue: Exception during service
                                                          X.1xO: [code] 404 [message]: Key hash 961x8mIbWmA7TRRpbk...= does not match any stored key hashes. (404) [extra]: null
                                                              at X.0fG.D(:240135)
                                                              at X.0k8.F(:255078)
                                                              at X.3gX.EUB(:738232)
                                                              at X.0fo.handleResponse(:242693)
                                                              at X.0k5.run(:254998)
                                                              at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
                                                              at X.0NH.run(:187661)
                                                              at X.0JQ.run(:49671)
                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                              at X.0NM.run(:187873)
                                                              at java.lang.Thread.run(Thread.java:761)

从 logcat 复制这个哈希键,我已经将它设为私有 (...) 并将其粘贴到您的 facebook 开发人员页面。它将立即解决您的问题。还要确保您发布的 APK 的哈希键与从 google play 下载的原始哈希键不同。

【讨论】:

  • 最佳解决方案。谢谢。
【解决方案5】:

我刚刚发现示例应用程序密钥输入页面的一个错误:如果您从应用程序中粘贴哈希密钥而不按 Enter,然后单击“保存更改”按钮,新输入的代码将消失但页面将显示“得救了!”响应消息。这不是真的:它没有保存。您必须在粘贴哈希键后按 Enter 键,然后点击“保存更改”。

我保存了一个包含尾随 = 字符的键。那行得通。

【讨论】:

  • 是的。我遇到了这个问题。它创建一个框以将其与其他键分开。他们应该实现一些脚本来自动转换。没有人会在单行框中按回车键。谢谢:)
  • 我遇到了一个有趣的情况,我的应用在 Google Play 上线后遇到了这个问题,当 facebook 对话框显示有关密钥哈希的错误时,它无法复制到剪贴板,所以我必须 TYPE手动。我的眼睛被 I(i 大写)和 l(L 小写)欺骗了。我花了 3 个小时才找到
【解决方案6】:

Facebook 使用 _ 替换 +,- 和 / 的一些方法

所以只需尝试将 _ 替换为 +、- 和 / 并添加该哈希键。

希望它应该工作。

【讨论】:

  • 要找到您需要的确切值,请运行以下命令(它将需要您的密钥库密码): keytool -exportcert -alias -keystore | openssl sha1 -二进制 | openssl base64
  • 哈希键应该包含'='?
  • 我的钥匙里没有这些符号,所以没有什么可以替换的。 = 在最后,它与日志所说的键完全相同,但没有任何作用
  • 我需要在我的仓促键上替换“_”而不是“/”。但我有点困惑我应该在哪里更换。我在我的 Facebook 应用程序上使用以下密钥。 gtKHgB36QgyFMUrCFDtAFdKrc/8=
  • 这是一个糟糕的方法,因为它只是被击中和试用,它可能会有所不同。添加尾随“=”现在似乎也不起作用。
【解决方案7】:

这是一个很好的问题。有两种方法可以解决。我们通常会在集成 Facebook SDK for android 时,继续按照the Developer site of facebook 的说明进行操作。

但是,一旦应用在 Play 商店中发布,我们往往会忘记一个仍在等待中的程序。我们以同样的错误结束:

05-13 14:45:43.882: W/fb4a(:<default>):BlueServiceQueue(25454): Exception during service
05-13 14:45:43.882: W/fb4a(:<default>):BlueServiceQueue(25454): com.facebook.http.protocol.ApiException: Key hash XXXXXXXXXXXXXX does not match any stored key hashes.

刚刚得到了一份清单:

1) 在开发应用程序时使用调试密钥

Facebook 开发者网站对此很有帮助。只需将the Getting started page 中的代码复制粘贴到您的命令提示符中即可。即:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

它的密码是android,你会得到它后面的调试密钥。

2) 签署应用程序后生成调试密钥

应用程序准备好上传到 Google Play 商店后,我们需要使用密钥对其进行签名,密钥的值是从密钥商店生成的。 Satheesh in his answer 很好地解释了这一点。使用:

keytool -exportcert -alias <Alias Name here> -keystore <Path to keystore> | openssl sha1 -binary | openssl base64

它为您提供与调试密钥不同的密钥。

【讨论】:

    【解决方案8】:

    简单把返回的错误信息hash key:

    10-20 22:21:10.752: W/fb4a(:):BlueServiceQueue(5872): com.facebook.http.protocol.ApiException: Key hash VQ3XhZb5_tBH9oGe2WW32DDdNS0 does not match any stored key hashes.
    

    VQ3XhZb5_tBH9oGe2WW32DDdNS0

    在 Facebook 开发人员上,您的应用的密钥哈希值。

    希望对您有所帮助。

    【讨论】:

    • 问题解决了。看看答案。并参考您的答案,再次阅读问题的最后一段。还是谢谢
    • 请注意,在您的应用密钥哈希定义中使用之前,您可能需要在日志中看到的密钥哈希后添加一个“=”。
    • 你拯救了我的一天兄弟...谢谢。
    • 不同手机的哈希键不同吗?
    【解决方案9】:

    在尝试了以上所有之后,我尝试了这个..并且工作了!!!

    1. 复制的密钥哈希与 Facebook 在异常中给出的相同,
    2. "_" 替换为"/" 并在末尾添加"="
    3. 将其添加到 Facebook
    4. 还要再次检查包名称和活动名称。 这对我有用!!。

    【讨论】:

      【解决方案10】:

      只需替换 https://developers.facebook.com/app 应用程序中的错误键哈希...!

      100% 肯定会奏效。

      -苏尼尔

      【讨论】:

        【解决方案11】:

        对于已发布的版本,使用此行生成哈希键:

        keytool -exportcert -alias foodtimeph -keystore /Users/eliedanhash/Downloads/ph/foodtimeph.keystore.jks | openssl sha1 -binary | openssl base64
        

        【讨论】:

          【解决方案12】:

          如果您在 google 应用商店中有您的应用,只需转到 => => 并复制您的 SHA-1 密钥。然后访问该网站并在顶部文本栏中复制您的 SHA-1 密钥link

          将密钥哈希(输出 base64)复制到您的 facebook 密钥哈希字段。现在一切都应该正常了。 :D

          【讨论】:

            【解决方案13】:
            import android.content.pm.PackageManager
            import android.util.Base64
            import android.util.Log
            import java.security.MessageDigest
            import java.security.NoSuchAlgorithmException       
            
            
              try {
                    val info = packageManager.getPackageInfo("your package 
                name", 
                       PackageManager.GET_SIGNATURES)
                    for (signature in info.signatures) {
                        val md = MessageDigest.getInstance("SHA")
                        md.update(signature.toByteArray())
                        Log.e("KeyHash:", Base64.encodeToString(md.digest(), 
                                   Base64.DEFAULT))
                    }
                } catch (e: PackageManager.NameNotFoundException) {
                    Log.e("","")
                } catch (e: NoSuchAlgorithmException) {
                    Log.e("","")
            
                }
            

            我搜索了很多不起作用,最后我找到了这个,kotlin 版本 Facebook 登录问题

            【讨论】:

              【解决方案14】:

              启用单点登录 通过在下方将 Single Sign On 设置为 Yes,为您的应用启用单点登录。请检查点号。 9 上https://developers.facebook.com/docs/facebook-login/android

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-08-10
                • 1970-01-01
                • 2013-12-16
                • 1970-01-01
                相关资源
                最近更新 更多