查找已签名应用程序的密钥哈希

23
我已经签署了我的应用程序并将其导出到桌面上名为“app”的文件夹中,该文件夹中包含我的应用程序本身和密钥库。我该如何找到可以复制到Facebook开发者页面的密钥哈希值?我已经安装了openssl但似乎不能生成密钥哈希。我尝试了许多其他关于Stack的线程,但没有一个似乎有所帮助,谢谢。
詹姆斯

我看到了,但它没有起作用,只是说keytool是无效的命令。 - James
因此,在Google上查找keytool...> Java SDK。 - Selvin
安装Java SDK...它包含一个名为keytool的工具,还有很多其他工具(在一句话中)...是的,你也应该下载OpenSSL工具(避免下一个关于“openssl无效命令”的问题)。 - Selvin
我创建的每个应用程序都会有不同的哈希密钥还是相同的? - James
关于keytool,再说一遍:C:\Program Files\Java\jdk1.6.0_22\bin\keytool.exe....这取决于您...如果您使用相同的密钥签署所有应用程序,则只需要一个哈希密钥。 - Selvin
显示剩余2条评论
7个回答

51
  1. 你应该知道你的密钥库文件位置。对我来说是C:\Users\Selvin\Desktop\selvin.kp
  2. 你应该知道你在密钥库中的别名。对我来说是selvin
  3. 你应该知道keytool的路径。C:\Program Files\Java\jdk1.6.0_22\bin\keytool.exe
  4. 你应该知道openssl的路径。C:\OpenSSL-Win32\bin\openssl.exe
  5. 你应该知道密钥库的密码。对我来说是***** hehe

然后,你应该执行:

"C:\Program Files\Java\jdk1.6.0_22\bin\keytool.exe" -exportcert -alias selvin -keystore c:\users\selvin\desktop\selvin.kp | C:\OpenSSL-Win32\bin\openssl sha1 -binary | C:\OpenSSL-Win32\bin\openssl base64

用正确的路径和别名替换我的路径和别名。

然后你会看到:

输入密钥库口令:

输入密码,你应该得到像这样的东西:NfhDlIH7XWJzUZRjL+pZySrMX1Q=

编辑NfgDlIG7XWJzUZRUL+bZySrMX1Q= <- 是一个错误的哈希。或者你运气好到让你的密钥产生了和...

错误:keytool 错误: java.lang.Exception: 别名不存在

如果哈希不起作用:

首先,执行

C:\Program Files\Java\jdk1.6.0_22\bin\keytool.exe" -exportcert -alias selvin -keystore c:\users\selvin\desktop\selvin.kp

输入密码并阅读错误信息。

如果您忘记了别名,就会出现keytool error: java.lang.Exception: Alias <selvinn> does not exist错误。我使用selvinn来显示错误。
要查看所有条目/别名的列表,请使用以下命令:

C:\Program Files\Java\jdk1.6.0_22\bin\keytool.exe -list -keystore c:\users\selvin\desktop\selvin.kp

第二次编辑

输入图像描述


1
别名(alias)的意思是什么?还是无所谓吗? - James
请查看我的编辑,它应该与您在Eclipse中签署应用程序时使用的相同。 - Selvin
非常感谢。如果您使用的是Mac,keytool和openssl已经安装好了。(只需使用keytool .... | openssl ...) - Nimajen
你的一行代码(坏哈希)救了我的命,提醒我检查命令中的别名,现在可以安心睡觉了,谢谢!:D - Shubham Badal
我应该在哪里调用这行代码?这个答案根本不完整。 - Lampione
可以了!另外,您可以使用以下命令稍后获取信息:keytool -list -keystore "path\to\debug.keystore" - eyal_katz

22

对于那些仍在苦苦挣扎的人,我发现正确遵循以下步骤肯定会起作用,但第一次确实很难做到完美,实际上我发现有时候处理某些别名时指纹的base64转换不起作用(由于某种原因哈希被截断了)。 我已经编写了各种批处理文件,将大部分这些已经提到的指令集合在一起,所以我不能排除那里存在问题。

然而,基本上大多数人都会在openssl阶段失败(要么找不到它,要么不知道如何使用它,要么Windows管道不能正确地将SHA1导出的输出链接到base64转换输入中)。

为了解决这个问题,您可以使用另一种替代方法,这可能更容易理解和遵循。 基本上,Facebook API想要的是用于指纹识别APK的SHA1哈希的base64表示形式(编码)。 要做到这一点,您只需列出密钥库:

"C:\Program Files\Java\JRE6\Bin\keytool.exe" -list -v -keystore "Path-to-your-keystore" -storepass "KeystorePassword" > somefile.txt
显然,您需要根据自己的设置更改keytool可执行文件的路径,并将“Path-to-your-keystore”和“KeystorePassword”替换为您的密钥库路径和密码!结果应该是在当前文件夹中创建一个名为“ sometext.txt”的文件,您可以在任何文本编辑器中打开它。文本文件将列出所有密钥库别名及其对应的MD5和SHA1哈希值(十六进制字符串)。
现在,只需找到用于签署您的APK的别名,复制SHA1哈希值,并使用任何在线的十六进制到base64转换器将其转换为Facebook所需的base64编码格式。您可以通过搜索“在线十六进制到base64转换器”来找到在线转换器。我一直在使用这个,因为您可以直接从文本文件中复制和粘贴字符串到提供的框中,它将仅删除分隔每个十六进制字节的冒号。
最后一个要点(有些显而易见,但...)只复制并粘贴十六进制字符串,而不是SHA1:前缀!
希望这能帮助某人;对我来说肯定有效!

谢谢,这确实很有帮助。您提到base64转换有时无法正常工作 - 有没有更多关于修复它的细节,以便不需要在线转换器? - LocalPCGuy
抱歉打扰,但我得到的SHA1是这个:SHA1: 3C:FB:ED:25:2A:48:D4:D9:E6:11:CA:B6:E2:8A:80:7C:FE:68:7D:71 - Roi

14

首先,我想感谢Selvin!

这个答案几乎和Selvin的答案一模一样,但我还是花了3个小时才让它工作:P所以需要更详细的教程给真正的新手

如何从密钥库获取哈希密钥

  • 首先从Google Code安装OpenSSL并将其放入C:\文件夹中 下载链接
  • 找到keytool程序的位置(默认在java文件夹中)
  • 找到密钥库的位置(有一个默认值为debug)

keytool位置:C:\Program Files (x86)\Java\jdk1.xxx)\bin\keytool openssl位置:C:\OpenSSL-Win32\bin\OpenSSL (debug)密钥库位置:C:\Users[usernamepc].android\debug.keystore

在Windows中打开命令提示符(开始->运行->cmd)并导航到keytool位置,或者复制粘贴以下字符串,请注意您无法使用ctrl+v,但可以右键单击

cd c:\program files (x86)\java\jdk1.7.0_01\bin
当在正确的目录中时,将此字符串粘贴到命令行中:
keytool.exe -exportcert -alias androiddebugkey -keystore c:\users\charx\.android\debug.keystore | C:\OpenSSL-Win32\bin\openssl sha1 -binary | C:\OpenSSL-Win32\bin\openssl base64

"C:\OpenSSL-Win32\bin\openssl"是openssl.exe文件的路径,请将其替换为您的openssl.exe的路径。

确保将您的[usernamepc]更改为您计算机的名称,如我的情况下为charx。此外,java jdk xxxx的目录取决于您的版本。

cmd应该显示哈希密钥。

我的调试文件的哈希键是:

h1GdQbgB8b/liCG+acmZWkgIRHA=

9

Eclipse解决方案(适用于像我这样的懒人)。

在Eclipse中选择任何项目,导出 - Android应用,输入你的密钥等信息,在最后一页底部你将看到 MD5:.... SHA1:....

复制SHA1字符串并粘贴到任何HEX-Base64在线转换器中(例如这个:http://tomeko.net/online_tools/hex_to_base64.php

恭喜!您已经获得了Facebook开发者控制台所需的密钥哈希值。


4

出于某些原因,上述提及的解决方案对我没有起作用,但我成功生成了密钥哈希。以下是获取已签名apk[使用密钥库签名的apk]密钥哈希的10个最简单步骤:

  1. Copy the below code into your activity [start Activity].This code should be contained in your activity so that you can extract the proper keyhash when your signed apk's Activity starts.

    private void getHashKey() {
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                getPackageName(), PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.e("MY_KEY_HASH:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {
    } catch (NoSuchAlgorithmException e) {
    } }
    
  2. Your AndroidManifest.xml file should have the attribute android:allowBackup="true" in its application tag.

  3. Export your signed apk and Install the app in your mobile phone and then connect your phone in debugging mode with usb debugging on.

  4. Then go to sdk\platform-tools

  5. Open command prompt and type adb devices to see whether your device is connected or not. if device not listed then try to fix that issue before continuing to next step.

  6. Then type adb logcat >"log.txt". Your cmd screen will like hanged. Dont Panic. Its Perfectly normal as the whole logcat is being written to log.txt.

  7. Run your app and hopefully when you think that the getHashKey() function is executed then press ctrl+c on command prompt to end log file writing.

  8. Now the command prompt will become responsive again. Now go into your sdk\platform-tools dir and you will see that a log.txt file has been created which contains logs.

  9. Now open it in a texteditor and search for MY_KEY_HASH:"-----------Your keyhash-------"

  10. Copy this onto your FB account or whereever you need it and then make another build in which the android:allowBackup="false" and getHashKey() function is removed.
希望这能帮到大家 :)

你也可以直接在Android Studio监控Logcat输出并搜索"MY_KEY_HASH",以节省一些步骤。 - kira_codes

3

我对这一切都不感兴趣。我想知道Facebook SDK实际发送了什么内容,于是我导出我的签名应用程序,并且在授权中使用临时代码来显示Facebook的error.toString()信息。这个信息给了我Facebook正在寻找的哈希密钥。然后,我把它放到我的Facebook应用程序中,差不多就完成了!


是的,我做了这个,但当 Facebook 失败时,logcat 显示了关键信息。只用了大约 1 分钟就搞定了。 - Oliver Dixon

0
如果您使用别名,请使用此命令查找密钥库别名:

keytool -list -v -keystore keystore.jks | findstr "Alias Creation"


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