【问题标题】:Android Facebook SDK: generate release key hashAndroid Facebook SDK:生成发布密钥哈希
【发布时间】:2014-12-12 17:13:16
【问题描述】:

我正在构建一个用户可以使用 Facebook 登录的应用。

我创建了如下哈希键:

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

         } catch (NoSuchAlgorithmException e) {

         }

在调试模式下,一切正常。

当我导出项目以进行发布时,它给出了这个错误:

"Invalid key hash. The key hash ****************** does not match any stored key hashes"

我粘贴了打印在 Facebook 开发者仪表板中的密钥,但应用程序仍然给我这个错误。

我的活动的完整包是“com.app.package.views”,我尝试在仪表板中使用这个包(作为 Google Play 包名称),但没有任何改变。

我该如何解决?如何生成正确的发布密钥哈希?

【问题讨论】:

    标签: android facebook facebook-javascript-sdk


    【解决方案1】:

    您遵循了 facebook 为创建登录应用程序提供的步骤?

    您需要在开始发布密钥库时获得一个“生产密钥哈希”:

    从命令行:

    keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
    

    并在 facebook 应用页面选项中添加此键。

    更多信息:https://developers.facebook.com/docs/android/getting-started/

    【讨论】:

    • 是什么意思
    • 我认为它只是生成哈希键时使用的别名或名称
    • 你能告诉我我在哪里运行这个命令,因为当我运行它时它告诉我'keytool'不是内部或外部命令、可运行程序或批处理文件。
    • 我也做了同样的事情,用 apk-release 文件在应用程序上进行了测试。但是上传到play store后就不行了?!
    • 这里 是您在使用发布密钥库文件和 提交应用程序时创建的别名的名称,是您在播放时上传应用程序的发布密钥库的路径商店。
    【解决方案2】:

    我找到了解决办法。对于 MAC

    使用这个获取 YOUR_RELEASE_KEY_ALIAS:

    keytool -list -keystore /Users/***/Documents/keystore/***.jks
    

    还有这个来获取你的发布keyhash:

    keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore /Users/***/Documents/keystore/***.jks | openssl sha1 -binary | openssl base64
    

    它对我有用。

    【讨论】:

    • 这就像一个魅力!很惊讶没有更多的支持。
    【解决方案3】:

    为了将来参考,如果您的应用已经在 Play 商店中,您可以这样做:

    1. 转到Release Management

    2. Release Management中选择App Signing

    3. 您可以看到十六进制格式的 SHA1 密钥App signing certificate

    4. 以十六进制格式复制 SHA1 并将其转换为 base64 格式,您可以使用此链接 http://tomeko.net/online_tools/hex_to_base64.php 来执行此操作,而无需十六进制的 SHA1: 部分。

    5. 转到 Facebook 开发者控制台并在 settings —&gt; basic –&gt; key hashes 中添加密钥(转换为 base 64 后)。

    【讨论】:

    • 我已将新转换的密钥哈希添加到设置 -> 基本 -> 密钥哈希。但我仍然遇到同样的错误(仅在发布时)。有趣的部分是错误中显示的无效密钥哈希,我在设置中甚至没有提到 -> 基本 -> 密钥哈希,我不知道它来自哪里
    • 感谢您的工作链接。 :) 只是想补充一下:当我通过命令提示符生成它时,它是不同的,如 FB 文档中所述。
    • 我正在使用 Google 的签名密钥,无法使用其他方法。这种方法对我来说就像一个魅力。
    【解决方案4】:

    最简单的解决方案。

    1) 签署您的 Apk。

    2) 将您的设备连接到机器并在真实设备上安装签名的 apk。

    3) 按下 facebook 登录时,您会在 logcat 上收到一条错误消息“无效的密钥哈希。密钥哈希“xxx”与任何存储的密钥不匹配。...”。

    4)复制logcat Hash Key,并将这个key放到developers.facebook.com/apps/104...../settings/

    【讨论】:

    • 这是一个简单的解决方案。
    • 太简单了。
    • 挣扎了几个小时,这个简单的解决方案奏效了。非常感谢
    • 嗨,如果我们想在不同的设备上运行该应用程序,我们如何将哈希密钥提供给 Facebook 开发人员包含的应用程序。是否需要添加不同的hash key才能在不同的设备上运行。
    • @Deepak 此方法将检索应用程序的密钥,对于 facebook 登录,您必须在 Facebook 上发布您的应用程序。顺便说一句,谢谢,有史以来最好的解决方案
    【解决方案5】:

    我们需要将openssl这个词替换为openssl结构中一个文件的路径。

    所以,我的 CMD 命令是:

    C:\Program Files\Java\jre1.8.0_45\bin>keytool -exportcert -alias Informatheus -keystore C:\Users\Atendimento\Dropbox\AndroidKeystore\Keystore | C:\Users\Atendimento\Desktop\openssl\bin\openssl sha1 -binary | C:\Users\Atendimento\Desktop\openssl\bin\openssl base64
    

    成功了。

    【讨论】:

      【解决方案6】:

      //将此方法添加到您的第一个活动并打开日志并搜索Base64标签这是Hashkey我呼救它帮助

      public void getHashkey(){
          try {
              PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_SIGNATURES);
              for (Signature signature : info.signatures) {
                  MessageDigest md = MessageDigest.getInstance("SHA");
                  md.update(signature.toByteArray());
      
                  Log.i("Base64", Base64.encodeToString(md.digest(),Base64.NO_WRAP));
              }
          } catch (PackageManager.NameNotFoundException e) {
              Log.d("Name not found", e.getMessage(), e);
      
          } catch (NoSuchAlgorithmException e) {
              Log.d("Error", e.getMessage(), e);
          }
      }
      

      【讨论】:

      • 请避免仅使用代码回答并添加几行描述性文字
      【解决方案7】:

      获取散列键释放apk的最简单方法是: 使用以下命令获取已发布 apk 的 SHA1 密钥:

      keytool -list -v -keystore keystore_path.jks -alias keystoreAlias
      

      然后您将获得 SHA1 密钥。复制该密钥并使用以下站点生成哈希密钥:

      Link to get hash key

      你会得到输出(base64):复制它并在你想要的地方使用..

      【讨论】:

        【解决方案8】:
        1. 首先打开命令提示符(Windows + R)

        2. cd C:\Program Files\Java\jre1.8.0_172\bin

        3. HERE下载openssl

        4. 在 C:/drive 中创建一个名为 OpenSSL 的文件夹

        5. 将下载的 zip 文件导出到 OpenSSL 文件夹中

        6. 生成命令为:-

          keytool -exportcert -alias YOUR_ALIAS -keystore "YOUR_KEYSTORE_PATH" | "C:\OpenSSL\bin\openssl" sha1 -binary | "C:\OpenSSL\bin\openssl" base64

        7. 在命令提示符下粘贴命令并回车

        8. 输入密码

        9. 在这里你可以看到关键:- "1skdhyjsgd56whdjddV+vCLE="

        【讨论】:

          【解决方案9】:

          2021 年 7 月: 如果您的应用已发布,请在 Google 控制台中查找密钥

          1. Google Play Consolez -> 左侧菜单 Release -> Setup -> App Integrity -> Upload key certificate -> SHA-1 certificate fingerprint

          2. 将 HEX 转换为 base64: https://base64.guru/converter/encode/hex

          3. 在 Facebook 中添加密钥:Add your development and release key hashes

          【讨论】:

          • 非常感谢这个解决方案。终于可以用脸书登录了。在过去的 8 个小时里,我一直在努力解决这个问题。
          【解决方案10】:

          Facebook SDK 使用两个不同的密钥,一个是您可以在开发阶段使用的调试密钥,另一个是发布密钥,在您创建签名的应用程序包后使用。 这是一个关于如何创建调试和释放密钥的链接。

          Developer.Facebook

          还可以查看this SO 帖子。

          【讨论】:

            【解决方案11】:

            这是迄今为止我发现的最简单的生成密钥哈希的方法!

            try
            {
              PackageInfo info = getPackageManager().getPackageInfo(
                  "Your Package Name",
                  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) {
            
            }
            

            【讨论】:

              【解决方案12】:

              您必须生成两个密钥哈希。第一次使用上面的命令。

              一旦您的应用进入 Play 商店,请转到

              Configuration -> app integrity 
              

              并获取 google 生成的 SHA1 并转到此站点:

              www.fbkeyhash.com 
              

              粘贴 SHA1 并生成第二个 Key Hash。

              它们都需要保存在 Facebook 控制台中,您的 APK 的实时和调试版本才能正常工作。

              【讨论】:

                【解决方案13】:
                keytool -exportcert -alias aliasName -keystore C:\my_release_keystroke_info.jks | openssl sha1 -binary | openssl base64
                

                【讨论】:

                • 您能否解释一下它的作用和作用?
                • 这似乎只是对现有答案的重复 - From Review
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-06-28
                相关资源
                最近更新 更多