如何创建Android Facebook密钥哈希?

247

我完全不理解这个过程。我已经能够导航到Java SDK中包含keytool的文件夹。但是我一直收到“openssl未被识别为内部或外部命令”的错误信息。问题在于,即使我能让它工作,接下来我该做什么?使用什么工具?


2
如果您正在使用最新的Facebook SDK,并且已经完美地放置了您的Facebook API,那么当您在Facebook上登录时,单击“登录”按钮,然后在您的Logcat中将打印哈希密钥。 - Mehul Ranpara
要在本地计算机上生成密钥哈希,请使用Java的keytool实用程序(应该在控制台的路径上)针对Android调试密钥库运行。默认情况下,此文件位于您的主目录 .android 文件夹中。在OS X上运行: keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64在Windows上,请使用:keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64 - Rakesh
为什么有人想要创建调试密钥? - Anders Lindén
我已经生成了密钥哈希,但不知道在哪里放置该密钥,请指导一下?我在Ubuntu上运行Android Studio。 - Apurva
30个回答

302

以下是你需要做的-

此处下载OpenSSL。

解压缩后,在C:/中创建一个名为OpenSSL的文件夹,将解压缩后的代码复制到此处。

检测debug.keystore文件路径。如果没找到,请在C:/中搜索并在下一步命令中使用该路径。

检测keytool.exe路径并进入该目录,然后在命令提示符中运行以下命令(需写成1行)-

$ keytool -exportcert -alias androiddebugkey -keystore "C:\Documents and Settings\Administrator.android\debug.keystore" | "C:\OpenSSL\bin\openssl" sha1 -binary |"C:\OpenSSL\bin\openssl" base64

它会要求输入密码,请输入android,这样就可以获得一个key-hash。


9
@Max,默认密码是android - jamapag
2
密钥哈希与任何存储的密钥哈希不匹配,安卓系统无法正常工作。 - Boldijar Paul
我已经生成了密钥哈希,但不知道在哪里放置该密钥,请指导一下?我在Ubuntu上运行Android Studio。 - Apurva
2
首先,通过进入“Build--> Build Apk”从你的工作室创建一个密钥库。提供名称和密码等信息,并将其存储为.jks文件,保存在易于访问的文件夹中。现在复制该路径并替换上述答案中的路径以生成密钥。 - buggydroid
3
它向我显示错误:"... 表达式只允许作为管道的第一个元素。 位于行:1字符:184 ... 表达式或语句中的未预期标记“sha1”。 ... 表达式只允许作为管道的第一个元素。 ... 表达式或语句中的未预期标记“base64”。
  • CategoryInfo:ParserError:(:) [],ParentContainsErrorRecordException
  • FullyQualifiedErrorId:ExpressionsMustBeFirstInPipeline"
- android developer
显示剩余13条评论

231

适用于 Linux 和 Mac

打开终端:

对于调试构建

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

您可以在“.android”文件夹中找到debug.keystore。将其复制并粘贴到桌面上,然后运行上述命令。

对于发布版本

keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64

注意:请确保在这两种情况下都要求输入密码。如果不要求输入密码,则说明命令中有问题。 debug.keystore 的密码是 "android",而对于发布版本,您必须输入在创建密钥库时设置的密码。


4
请明确,密码为空。只需在提示时按<enter>键即可。 - Tom Redman
我已经生成了密钥哈希,但不知道在哪里放置该密钥,你能指导我吗?我正在Ubuntu上运行Android Studio。 - Apurva
2
这个注释:“注意:确保在两种情况下都要求输入密码。如果没有要求输入密码,则表示命令存在问题。”对于解决问题至关重要。 - Bleno Silva
2
即使要求输入密码也不意味着一切都没问题(密码错误,密钥别名错误)。首先单独运行 keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> 命令,以查看是否一切正常。此外,当使用管道时,keytool 处于非交互模式,并在您输入密码时以明文显示密码。因此,最好编写一个小脚本来分别运行这些命令。 - Pierre
我这里遇到了一个奇怪的情况,即在Debug和Release模式下生成的哈希值是相同的。我使用androiddebugkey和我的唯一发布别名来生成代码,但两个结果哈希都是相同的..... 有人知道如何解决吗? - Joshua Ooi
显示剩余3条评论

129

请尝试这个:

public static void printHashKey(Context pContext) {
        try {
            PackageInfo info = pContext.getPackageManager().getPackageInfo(pContext.getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String hashKey = new String(Base64.encode(md.digest(), 0));
                Log.i(TAG, "printHashKey() Hash Key: " + hashKey);
            }
        } catch (NoSuchAlgorithmException e) {
            Log.e(TAG, "printHashKey()", e);
        } catch (Exception e) {
            Log.e(TAG, "printHashKey()", e);
        }
    }

我已经生成了密钥哈希,但不知道在哪里放置该密钥,请你指导一下吗?我在Ubuntu上运行Android Studio。 - Apurva
1
这是正确的方式。 - Tintinabulator Zea
1
这将起作用,如果你调用pContext.getPackageInfo。或者将其从函数中删除并在任何活动的onCreate中调用它。 - Dpedrinha
1
现在似乎是getPackageManager().getPackageInfo([你的包名], PackageManager.GET_SIGNATURES)。 - Till - Appviewer.io
@Apurva 如果以后还有用的话,你可以将它放在Android SharedPreferences中。 - Maddy Sharma
显示剩余2条评论

79

您可以在浏览器控制台中使用一行JavaScript将十六进制地图密钥转换为Base64。在最新的浏览器中打开控制台(Windows上按F12macOS上按⌥ Option+⌘ Command+ILinux上按Ctrl+⇧ Shift+I),然后粘贴代码并替换Google Play发布 设置 应用签名下提供的SHA-1SHA-256十六进制地图:

十六进制地图密钥转为Base64密钥散列值

> btoa('a7:77:d9:20:c8:01:dd:fa:2c:3b:db:b2:ef:c5:5a:1d:ae:f7:28:6f'.split(':').map(hc => String.fromCharCode(parseInt(hc, 16))).join(''))
< "p3fZIMgB3fosO9uy78VaHa73KG8="

您也可以在此进行转换;运行以下代码片段,粘贴十六进制地图键并点击转换按钮:

document.getElementById('convert').addEventListener('click', function() {
  document.getElementById('result').textContent = btoa(
    document.getElementById('hex-map').value
      .split(':')
      .map(hc => String.fromCharCode(parseInt(hc, 16)))
      .join('')
  );
});
<textarea id="hex-map" placeholder="paste hex key map here" style="width: 100%"></textarea>
<button id="convert">Convert</button>
<p><code id="result"></code></p>

如果您想要反转密钥哈希以进行检查和验证:

将Base64密钥哈希反转为十六进制映射密钥

> atob('p3fZIMgB3fosO9uy78VaHa73KG8=').split('').map(c => c.charCodeAt(0).toString(16)).join(':')
< "a7:77:d9:20:c8:1:dd:fa:2c:3b:db:b2:ef:c5:5a:1d:ae:f7:28:6f"

document.getElementById('convert').addEventListener('click', function() {
  document.getElementById('result').textContent = atob(document.getElementById('base64-hash').value)
    .split('')
    .map(c => c.charCodeAt(0).toString(16))
    .join(':')
});
<textarea id="base64-hash" placeholder="paste base64 key hash here" style="width: 100%"></textarea>
<button id="convert">Convert</button>
<p><code id="result"></code></p>


1
SHA-1曾经是首选。 - Tarps
2
当谷歌应用商店为我生成证书时,这非常有用。我需要将其转换为生成的证书,而不是密钥库,以获取 Facebook 哈希值。 - Anh Nguyen
1
我相信这是最新的答案,因为Play商店现在管理最终应用程序签名,而.jks文件仅用作上传密钥而不是最终密钥。谢谢。 - Raphael

58

OpenSSL:如果您的操作系统没有预装它(例如,Windows没有预装它),则必须安装它。如何安装取决于您的操作系统(对于Windows,请查看coder_For_Life22提供的link)。

如果您使用的是Windows操作系统,则最简单的方法是将openssl.exe二进制文件复制到您的keytool路径中,而无需进行任何调整。如果您不想这样做,则必须将其添加到您的PATH环境变量中。然后执行文档中提供的命令。

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

请注意,在-keystore参数后面的参数指向您的调试密钥库。该位置还取决于您的操作系统。应该在以下位置之一:

  • Windows Vista或7 - C:\Users\.android\debug.keystore
  • Windows XP - C:\Documents and Settings\.android\debug.keystore
  • OS X和Linux - ~/.android/debug.keystore

如果您做得没错,会提示您输入密码。对于调试证书,密码为android。如果密码正确,控制台将打印出哈希值(一些随机字符和数字)。

将其复制到Facebook应用程序首选项中的android key hash字段中。要到达那里,请转到developers.facebook.com/apps,选择您的应用程序,进入编辑设置并向下滚动。之后,请等待几分钟以使更改生效。


我在cmd中运行了这个命令,它输出了一个非常长的字符列表,看起来像是以=符号结尾的哈希值,然后什么也没有。$ keytool -exportcert -alias androiddebugkey -keystore "C:\Users.android\debug.keystore" | "C:\OpenSSL\bin\openssl" sha1 -binary |"C:\OpenSSL\bin\openssl" base64 - Somk
听起来没问题。我在我的电脑上测试过了,对我来说是28个字符,只是为了给你一个想法。现在只需复制它,一切都会好的。 :) - user658042
我没有被提示使用“Android”这个词语。抱歉,我是不是有点慢? - Somk
老实说,我不确定为什么你没有得到提示。但是听起来对我来说是正确的。我的意思是,如果您做错了什么,应该会有错误消息。只需将其复制并查看是否有效。您可以使用Graph API Explorer测试一些图形查询。在顶部选择您的应用程序,并查看是否获得有效结果。如果有问题,它应该会出现错误。编辑:而且慢点也没关系,我们不急。 :) - user658042

36

如果您已经将应用程序上传到 Play 商店,则可以按以下方式生成哈希密钥:

  1. 前往发布管理 这里

  2. 选择发布管理 -> 应用签名

  3. 您可以在十六进制格式的应用程序签名证书中看到 SHA1 密钥。

  4. 将十六进制格式的SHA1复制并转换为base64格式,您可以使用此链接来完成转换而无需SHA1:十六进制部分。

  5. 前往 Facebook 开发者控制台,在设置- > 基本信息- > 密钥哈希中添加该密钥(转换为 base64 后)。


35

这里是完整的详情(适用于Windows)

1. 根据您的系统32位或64位,下载OpenSSL的第三个或第四个版本(搭配 e 更好)。

2. 将下载的zip文件解压缩到C目录中。

3. 打开提取的文件夹并复制路径,应该类似于C:\openssl-0.9.8k_X64\bin\openssl(在末尾添加 \openssl)。

4. (获取JDK的bin文件夹路径,如果您知道如何忽略此步骤。)

打开Android Studio 项目结构(Ctrl + Alt + Shift + S),选择左侧面板中的 SDK 位置,复制 JDK 位置并添加 /bin。

因为您可能像我一样使用嵌入式 JDK,所以我们正在遵循此方法来获取 JDK 位置。

enter image description here

现在您已经拥有 OpenSSL 位置和 JDK 位置。

5. 现在我们需要调试密钥存储位置,为此打开 C~>用户~>您的用户名~>.android 文件夹,应该有一个名为 debug.keystore 的文件,现在复制路径位置,应该类似于

C:\Users\Redman\.android\debug.keystore

6. 现在打开命令提示符并输入命令。

cd YourJDKLocationFromStep4  

就我的情况而言

 cd "C:\Program Files\Android\Android Studio\jre\bin"

7. 现在构建以下命令

keytool -exportcert -alias androiddebugkey -keystore YOURKEYSTORELOCATION | YOUROPENSSLLOCATION sha1 -binary | YOUROPENSSLLOCATION base64

在我的情况下,该命令看起来像:

keytool -exportcert -alias androiddebugkey -keystore "C:\Users\Redman\.android\debug.keystore" | "C:\openssl-0.9.8k_X64\bin\openssl" sha1 -binary | "C:\openssl-0.9.8k_X64\bin\openssl" base64

现在在命令提示符中输入此命令,如果您做对了所有步骤,将会要求您输入密码(密码为android)。

Enter keystore password:  android

就是这样,你会得到密钥哈希值,只需复制并使用它。

要构建已签名的KeyHash,请执行以下命令

keytool -exportcert -alias YOUR_ALIAS_FOR_JKS -keystore YOUR_JKS_LOCATION | YOUROPENSSLLOCATION sha1 -binary | YOUROPENSSLLOCATION base64

输入您的密钥库密码,如果您输入错误的密码,则会给出错误的KeyHash

注意:

如果由于某种原因在某个路径上出现错误,则将该路径括在双引号中。此外,Windows PowerShell对我来说不起作用,我使用了git bash(或使用命令提示符)。

示例

keytool -exportcert -alias androiddebugkey -keystore "C:\Users\Redman\.android\debug.keystore" | "C:\openssl-0.9.8k_X64\bin\openssl" sha1 -binary | "C:\openssl-0.9.8k_X64\bin\openssl" base64

2
非常感谢,这是一份非常详细的初学者指南! - Pablo Quemé
@TamimProduction 尝试使用 OpenSSL 的 k 版本重复上述过程,并查看 https://code.google.com/archive/p/openssl-for-windows/downloads - Manohar
@TamimProduction 如果您输入了错误的密码,它将返回错误的密钥哈希。另外,在删除密钥库后,您是否重新构建了APK? - Manohar
@TamimProduction 下载并安装 Facebook 应用程序,在 Facebook 应用程序中登录。打开您的应用程序并进行 Facebook 登录。它将在 Facebook 应用程序中为您提供密钥哈希,请检查它是否与您的相同。 - Manohar
让我们在聊天中继续这个讨论 - Tamim Attafi
显示剩余2条评论

25

要在本地计算机上生成您的密钥哈希,请使用Java的keytool实用程序(应该在控制台的路径中)针对Android调试密钥库运行。这是默认情况下在您的主目录.android目录中。在OS X上运行:

要在本地计算机上生成您的密钥哈希,请使用Java的keytool实用程序(应该在控制台的路径中)针对Android调试密钥库运行。这是默认情况下在您的主目录.android目录中。在OS X上运行:

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

在 Windows 上,使用以下命令:

keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64

希望这能对你有所帮助

参考 - Facebook开发者网站


我已经生成了密钥哈希,但不知道在哪里放置该密钥,请指导一下?我在Ubuntu上运行Android Studio。 - Apurva

18

还有一个简短的解决方案。只需在您的应用程序中运行此代码:

FacebookSdk.sdkInitialize(getApplicationContext());
Log.d("AppLog", "key:" + FacebookSdk.getApplicationSignature(this));

不需要 FB SDK 的较长解决方案(基于此处的一个解决方案):

public static void printHashKey(Context context) {
    try {
        final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
        for (android.content.pm.Signature signature : info.signatures) {
            final MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            final String hashKey = new String(Base64.encode(md.digest(), 0));
            Log.i("AppLog", "key:" + hashKey + "=");
        }
    } catch (Exception e) {
        Log.e("AppLog", "error:", e);
    }
}

结果应以 "=" 结尾。


1
我注意到我的密钥哈希中有一个“_”,这是FB不允许的。为了使用哈希,我不得不将其更改为“/”。 - Abdelalim Hassouna
Facebook函数返回了我的密钥为“-AAAAAAAA_AAAAAA-AAAAAAAAAA”,这是Facebook不允许的。而printHashKey以有效格式返回了密钥:“+AAAAAAAA/AAAAAA+AAAAAAAAAA=”。 - Pavlo28
@GrafOrlov 很奇怪。也许是某个新的FB SDK版本上出了BUG。你应该向他们报告。 - android developer

13

步骤1->在您的系统中打开命令提示符

步骤2->C:\Program Files\Java\jdk1.6.0_43\bin>

步骤3->keytool -list -v -keystore C:\Users\leon\.android\debug.keystore -alias androiddebugkey -storepass android -keypass android

您将得到SHA1值,点击此链接将SHA1值转换为哈希密钥

我百分之百确定这个链接会对您有所帮助


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