28

我正在使用 android studio 开发一个使用 facebook sdk 的应用程序。

当我使用以下命令时

C:\Program Files\Java\jdk1.7.0_21\bin>keytool -exportcert -alias androiddebugkey
 -keystore "C:\Users\ninad\.android\debug.keystore" | "D:\OpenSSL\bin\openssl" s
ha1 -binary |"D:\OpenSSL\bin\openssl" base64

它返回y5EquINHD6DvwVJFyJTuUEY3NSU=

使用此哈希键时,facebook 显示错误

无效的 android_key 参数。密钥c33Tm0FL_-kxyaPZq1JBLDh767U与任何允许的密钥都不匹配。

使用eclipse和android studio时facebook需要的哈希键是否不同?其中哪一个是我正确的哈希键?

我将哈希键都添加到我在 facebook 中的应用程序中。应用程序仍然显示无效的 android_key 参数。

4

10 回答 10

75

你为什么不试试这个代码并检查你正在使用的哈希键。来自 facebook 文档:

除了仔细检查您的密钥哈希生成步骤之外,还有另一个选项可以确保您使用正确的密钥哈希。它涉及更改其中一个示例应用程序中的代码以打印发送到 Facebook 的签名。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Add code to print out the key hash
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "your.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 (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }
}
于 2013-06-11T18:45:54.243 回答
7

这是创建 facebook 哈希键的链接:

public class FacebookHashKeyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_facebook_hash_key);
        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 (NameNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

代码取自这里

于 2013-10-19T05:21:35.467 回答
6

只需在 oncreate 方法中运行它

private void printHashKey() {

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "-----------PUT 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) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

}
于 2017-01-25T12:18:27.697 回答
0

假设您确实从 openssl 输出复制粘贴到 facebook 应用程序设置,这样就不会混淆外观相似的字符 O0 或 1l| 或 G6...

我最近在 Play Store 上放了一个诊断程序,它显示了为您手机上的任何应用程序安装的密钥哈希。搜索“GetKeyHash”。它向您显示设备上的所有应用程序,按上次更新时间排序,您可以展开其中任何一个以查看密钥哈希、包名称和有效的活动名称。正确的 GetKeyHash 应用程序不会请求或使用任何特殊权限,Android 应该在您安装时这样说。

要在模拟器上运行,也可以在http://rightparen.com/android/GetKeyHash.apk获得。

请注意,如果您在 IDE 中构建应用程序的调试版本,则密钥哈希将与您发送到 Play 商店的零售版本不同。您可以在 Facebook 开发者控制台中为应用程序添加多个密钥哈希,以允许调试密钥以及零售密钥。

如果这产生相同的结果,则可能存在错误。作为仅调试密钥的潜在解决方法,您可以备份 ~/.android/debug.keystore 并删除该文件。下次构建时,android系统会生成一个新的key,可能不会触发bug。此时,您需要从您的设备上卸载该应用程序,否则您将在安装时收到有关需要使用相同证书签名的 apk 的错误消息。然后,您可以使用上述 GetKeyHash 或任何标准方法来获取新的密钥哈希并将其添加到您在 facebook 上的应用程序中。

于 2013-06-11T23:04:03.173 回答
0

您可以列出该文件中的当前别名。然后您可以使用正确的名称来获取哈希...。将密码留空,只需按回车键...

keytool -list -keystore keystorefile

*****************  WARNING WARNING WARNING  *****************
* La integridad de la información almacenada en el almacén de claves  *
* NO se ha comprobado.  Para comprobar dicha integridad, *
* debe proporcionar la contraseña del almacén de claves.                  *
*****************  WARNING WARNING WARNING  *****************

Tipo de Almacén de Claves: JKS
Proveedor de Almacén de Claves: SUN

Su almacén de claves contiene 1 entrada

androiddebugkey, Sep 22, 2016, PrivateKeyEntry, 
Huella Digital de Certificado (SHA1): 3B:8F:DB:46:A0:B7:2E:37:E1:78:41:10:BD:D0:8A:FF:63:E0:94:22

如您所见.. 有 1 个带名称的键androiddebugkey...可能在您的情况下,您有那个... o 运行时没有写具体的:

{C:\Program Files\Java\jdk1.7.0_21\bin>keytool -exportcert -alias androiddebugkey
 -keystore "C:\Users\ninad\.android\debug.keystore" | "D:\OpenSSL\bin\openssl" s
ha1 -binary |"D:\OpenSSL\bin\openssl" base64
}

它将返回任何它想要的东西......在这种情况下。

y5EquINHD6DvwVJFyJTuUEY3NSU=
于 2016-10-05T19:20:08.027 回答
0

我个人喜欢在应用程序build.gradle文件中生成我的哈希。

build.gradle函数将在 Windows 上生成哈希(更改C:\\OpenSSL-Win64\\bin\\openssl为您的 OpenSSL 二进制位置):

def getFacebookHash = { ->
    try {
        def stdOut = new ByteArrayOutputStream()
        def stdIn = new ByteArrayInputStream()
        exec {

            commandLine "keytool", "-exportcert", "-alias", KEY_ALIAS, "-keystore", STORE_FILE, "-storepass", STORE_PASSWORD
            standardOutput = stdOut
        }
        stdIn = new ByteArrayInputStream(stdOut.toByteArray())
        stdOut = new ByteArrayOutputStream()
        exec {
            standardInput = stdIn
            commandLine "C:\\OpenSSL-Win64\\bin\\openssl", "sha1", "-binary"
            standardOutput = stdOut
        }
        stdIn = new ByteArrayInputStream(stdOut.toByteArray())
        stdOut = new ByteArrayOutputStream()
        exec {
            standardInput = stdIn
            commandLine "C:\\OpenSSL-Win64\\bin\\openssl", "base64"
            standardOutput = stdOut
        }
        def hashString = stdOut.toString().trim()
        return hashString
    }
    catch (error) {
        return error.toString();
    }
}

然后,您可以在 Gradle 脚本中的任何位置打印结果。

println "Facebook Release Key Hash: " + getFacebookHash()

我将必要的详细信息保存在gradle.properties

STORE_FILE=C:/Keystore.jks
STORE_PASSWORD=password
KEY_ALIAS=keystoreAlias
KEY_PASSWORD=password
于 2017-04-25T15:07:21.403 回答
0

将此行添加到mainActivity.java

  @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 try {
 PackageInfo info = getPackageManager().getPackageInfo("**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) {
 Log.e("KeyHash:", e.toString());
 } catch (NoSuchAlgorithmException e) {
 Log.e("KeyHash:", e.toString());
 }

 }
于 2021-02-17T07:20:47.253 回答
0
  1. 生成sha1,并复制它
  2. 去这个网站http://tomeko.net/online_tools/hex_to_base64.php
  3. 复制输出(base64)

在此处输入图像描述

于 2021-04-05T07:38:58.443 回答
0

为android项目生成sha1密钥

转到 JDK bin 目录然后打开 cmd

C:\Program Files\Java\jdk-9.0.1\bin>keytool -exportcert -alias androiddebugkey -keystore "C:\Users\pcUser\.android\debug.keystore" | "C:\Users\pcUser\Desktop\openssl-0.9.8d_X64\bin\openssl" sha1 -binary | "C:\Users\pcUser\Desktop\openssl-0.9.8d_X64\bin\openssl" base64

下载 OpenSSL(如果需要)

https://code.google.com/archive/p/openssl-for-windows/downloads

于 2021-05-19T06:46:55.383 回答
-2

对于调试,如果使用 Eclipse,您将需要使用 Android 调试密钥生成此密钥哈希。当您准备好发布您的应用程序时,您需要为您的签名密钥生成一个密钥哈希,并在您的签名应用程序运行之前在 Facebook 中更新此值。

看看下面的链接

Android Facebook SDK:如何生成非调试哈希键?

每次更换电脑时,是否需要在 Facebook 应用设置中添加新的密钥哈希?

于 2013-06-13T11:27:04.550 回答