安卓Facebook SDK:生成发布密钥哈希

46

我正在开发一个应用程序,用户可以使用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 Developer dashboard中打印的密钥粘贴上去,但应用程序仍然给我报错。

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

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

12个回答

53

我找到了MAC的解决方案。

使用这个来获取YOUR_RELEASE_KEY_ALIAS:

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

获取发布密钥散列码的方法如下:

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

对我来说可以工作。


44

为了以便日后参考,如果您的应用程序已经在Play商店上,您可以执行以下操作:

  1. 进入 发布管理(Release Management)

  2. 发布管理(Release Management) 中选择 应用签名(App Signing)

  3. 您可以在十六进制格式下的 应用签名证书(App signing certificate) 中查看 SHA1 密钥。

  4. 复制十六进制格式的 SHA1 并将其转换为 base64 格式,您可以使用此链接http://tomeko.net/online_tools/hex_to_base64.php 进行转换,但不要包含十六进制中的 SHA1: 部分。

  5. 进入 Facebook 开发者控制台,在 设置(Settings) —> 基础(Basic) –>密钥哈希(Key Hashes) 中添加已转换为 base64 的密钥。


我已经将新转换的密钥哈希添加到设置->基本->密钥哈希中。但是仍然会出现相同的错误(仅在发布时)。有趣的是,错误中显示的无效密钥哈希甚至没有被我提及在设置->基本->密钥哈希中,我不知道它从哪里来。 - Shikhar
感谢提供可工作的链接。 :) 只想补充一下:按照 FB 文档中描述的通过命令提示符生成它时,情况是不同的。 - Rohit Sharma
我正在使用来自Google的签名密钥,无法使用其他方法。这种方法对我非常有效。 - Anky An

34

最简单的解决方案。

1) 对您的Apk进行签名。

2) 将设备连接到计算机并在实际设备上安装已签名的apk。

3) 当按下Facebook登录时,您将在logcat上收到一个错误,其中显示“无效的密钥散列。密钥散列“xxx”与任何存储的密钥都不匹配......”。

4) 复制logcat哈希密钥并将该密钥放入developers.facebook.com/apps/104...../settings/。


1
如此简单。 - Asesha George
挣扎了几个小时,这个简单的解决方案起作用了。非常感谢。 - Rinav
最简单和有用的答案。 - Walter Liu
不适用于Google Play签名。仅适用于Debug密钥。现在无用。 - user924
你好,这个解决方案对我有用,但是我很好奇为什么当我运行keytool -export cert xxxxx命令时会得到不同的密钥哈希值?谢谢。 - nathan1658
显示剩余7条评论

9
我们需要用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

2021年7月: 如果您的应用程序已经发布,可以在Google控制台中查找密钥。

  1. Google Play控制台 -> 左侧菜单发布 -> 设置 -> 应用程序完整性 -> 上传密钥证书 -> SHA-1证书指纹

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

  3. 在Facebook中添加密钥:添加开发和发布密钥哈希


非常感谢这个解决方案。终于可以使用Facebook登录了。在过去的8个小时里,我一直在为解决这个问题而疯狂努力。 - Weblurk
要获取开发密钥SHA,请点击Android Studio中右侧的Gradle选项,打开Gradle窗口。窗口左上角会出现一个小终端图标,点击它。这将打开一个命令窗口。输入gradle signingreport,然后你就可以在打开的控制台中看到它了。 - undefined

5

// 在你的第一个活动中添加此方法,并打开日志并搜索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);
    }
}

1
请避免仅提供代码答案,并添加几行描述性文本。 - Matthias Seifert

4
获取已发布apk的哈希密钥最简单的方法是: 使用以下命令获取已发布apk的SHA1密钥:
keytool -list -v -keystore keystore_path.jks -alias keystoreAlias

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

获取哈希密钥的链接

您将获得输出(base64):将其复制并在需要的地方使用。


2
  1. 首先打开命令提示符(Windows + R)

  2. 输入命令:cd C:\Program Files\Java\jre1.8.0_172\bin

  3. 这里下载openssl

  4. 在C:/驱动器中创建一个名为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="


1

Facebook SDK使用两个不同的密钥,一个是调试密钥,在开发阶段可以使用,另一个是发布密钥,一旦创建了签名应用程序包就会使用它。以下是有关如何创建调试和发布密钥的链接。

Developer.Facebook

此外,请查看this的stackoverflow帖子。

-1
这是我迄今为止发现的生成密钥哈希最简单的方法!
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) {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接