Facebook Android 生成密钥哈希

124

我正在尝试创建一个集成Facebook的Android应用程序,我已经看了文档中生成密钥散列文件的部分,它指定运行以下代码:

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

当我在终端中运行时,出现密钥库篡改或密码不正确的错误,

我只想生成我的键哈希

有人能指点我正确的方向吗?


2
你是否使用了正确的密码? - President James K. Polk
当我在终端输入命令时,它没有给我输入密码的选项。 - Scott
6
我明白了,有时候我真傻,要在一行内输入命令,不要复制粘贴。 - Scott
http://developementsolution.blogspot.in/ - Akarsh M
默认密码是:android。否则,AnhSirk Dasarp的方法也不错。 - Pranaysharma
显示剩余3条评论
20个回答

286
为了生成密钥散列值,您需要按照以下简单步骤进行操作:

1)从这里下载Openssl。

2)在C驱动器中创建一个名为openssl的文件夹。

3)将Zip文件解压缩到在C驱动器中创建的openssl文件夹中。

4)将debug.keystore文件从.android文件夹复制并粘贴到JDK bin文件夹中。在我的情况下为(C:\Users\SYSTEM.android),粘贴到JDK bin文件夹中,在我的情况下为(C:\Program Files\Java\jdk1.6.0_05\bin)。

5)打开命令提示符并给出JDK Bin文件夹的路径,在我的情况下为(C:\Program Files\Java\jdk1.6.0_05\bin)。

6)复制以下代码并按Enter键。

keytool -exportcert -alias androiddebugkey -keystore debug.keystore > c:\openssl\bin\debug.txt

7)现在您需要输入密码,密码为 android。

8)如果您在openssl Bin文件夹中查看,您将得到一个名为debug.txt的文件。

9)现在您可以重新启动命令提示符或继续使用现有命令提示符。

10)回到C驱动器,然后给出openssl Bin文件夹的路径。

11)复制以下代码并粘贴。

openssl sha1 -binary debug.txt > debug_sha.txt

12)您将在openssl bin文件夹中获得debug_sha.txt

13)再次复制以下代码并粘贴。

openssl base64 -in debug_sha.txt > debug_base64.txt

14)您将在openssl bin文件夹中获得debug_base64.txt

15) 打开 debug_base64.txt 文件,这里将会展示你的密钥哈希。


4
谢谢你的好评+1,我已经按照您的建议操作并获得了想要的结果 :) - BBdev
我遇到了这个问题:keytool 错误:java.io.IOException: Keystore 被篡改或密码不正确。我该如何找到正确的密码? - DuyguK
4
@Vizzz: 对生成密钥哈希的解释很好。感谢这篇文章,希望它能为某些人节省很多时间。 - Emran Hamza
在我的情况下,当我在命令提示符中运行此命令 openssl sha1 -binary debug.txt > debug_sha.txt 时,它会显示“拒绝访问”错误。 - Naveen Kumar
1
我尝试了所有的代码,但从未得到所需的输出。 我尝试了来自Facebook的代码,它也是一样的,只是将三个命令合并为一个命令,但是分别运行三个命令才能得到正确的代码并且工作正常,这花费了数小时甚至数天的搜索。谢谢。 在此之前,只有Android应用程序上的代码能够给出正确的结果,命令提示符会给出无效的密钥,现在一切都好了。再次感谢。 - Diljeet
显示剩余10条评论

42

生成哈希密钥的最简单方法。

要求:SHA1密钥

有两种方法可以从密钥库文件中获取SHA1密钥

1) 找到您的密钥库文件,在该位置打开命令提示符,然后使用以下命令。

keytool -list -v -keystore {keystore_name} -alias {alias_name}

然后输入您的密码,它将返回md5、sha1和sha256密钥。

或者

2) 运行 signingReport

请参阅下面的图片。

enter image description here

运行文件后,将生成包含所需的sha1密钥的输出。

enter image description here

获取所需的SHA1密钥后

然后去

http://tomeko.net/online_tools/hex_to_base64.php

并粘贴您的SHA1密钥

enter image description here

最终您将获得所需的HashKey,可以将其用于应用于Facebook。


2
这个答案比其他的简单得多,因为它只关心最终输出。始终正确。在其他情况下,如果签名过程配置错误,我们就不知道如何修复。 - hakuna1811
1
这相当可怕。请不要将机密信息放入随意的网站... 请尝试使用以下命令:echo 30:F1:74:91:D8:17:41:4D:31:EA:B8:A8:02:E1:63:74:2E:8D:26:9B | xxd -r -p | openssl base64 - AZR34L
@AZR34L 无论如何,这是公开的,至少当你的应用程序支持网页链接或通用链接时:https://www.google.com/.well-known/assetlinks.json - Thea Choem

20

在Linux和Mac OS X中,您可以在~/.android/debug.keystore下删除调试证书;在Windows中,该目录类似于%USERHOME%/.android。

当您下次尝试构建调试包时,Eclipse插件应该会生成一个新的证书。

如果这样无效,请告诉我。


没有起作用。删除了debug.keystore文件,进行了调试构建,但该文件从未出现。该文件夹中没有更新任何其他内容。 - CthulhuJon
3
我真的不知道为什么这个被接受为答案了? - Enoobong
通过使用此方法为调试和发布模式生成HashKey。 https://dev59.com/zWs05IYBdhLWcg3wAdST#41763383 - Naeem Ibrahim

14

如果使用Facebook SDK 3.0及以上版本,可以通过向应用程序本身添加以下代码来获得正确的密钥哈希(此方法有效):

try {
            PackageInfo info = getPackageManager().getPackageInfo("com.package.mypackage",         PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String sign=Base64.encodeToString(md.digest(), Base64.DEFAULT);
                Log.e("MY KEY HASH:", sign);
                Toast.makeText(getApplicationContext(),sign,         Toast.LENGTH_LONG).show();
            }
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}

将com.package.mypackage替换为您的包名


通过使用此方法为调试和发布模式生成HashKey。 https://dev59.com/zWs05IYBdhLWcg3wAdST#41763383 - Naeem Ibrahim

12

I. 为Facebook创建密钥哈希调试

添加代码打印出Facebook的密钥哈希。

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.google.shoppingvn", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.i("KeyHash:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }

II. 为 Facebook 创建密钥哈希发布版

  1. 下载 openssl-0.9.8e_X64

  2. 在 C 盘中创建一个 openssl 文件夹

  3. 将 Zip 文件解压缩到 openssl 文件夹中

  4. 开始 -> 运行:cmd (按回车键)

  5. (按下)cd C:\Program Files\Java\jdk1.6.0_45\bin。注意:C:\Program Files\Java\jdk1.6.0_45\bin 是您计算机中 jdk 文件夹的路径。

  6. (按下)keytool -exportcert -alias gci -keystore D:\folder\keystorerelease | C:\openssl\bin\openssl sha1 -binary | C:\openssl\bin\openssl base64。注意:D:\folder\keystorerelease 是您的 keystorerelease 的路径。

  7. 输入 keystore 密码:这是注册 keystorerelease 时的密码。

    然后,您将获得一个密钥哈希值:jDehABCDIQEDWAYz5Ow4sjsxLSw=

  8. 登录 Facebook。访问“管理应用程序”。将密钥哈希粘贴到 developers.facebook.com 上的应用程序中。


通过使用此方法为调试和发布模式生成HashKey。 https://dev59.com/zWs05IYBdhLWcg3wAdST#41763383 - Naeem Ibrahim

9
这个问题最简单的解决方案如下:

我已经遇到了这个问题两个月了。我的密钥散列一直堆积到9。今天,我终于找到了简单的解决方法:

步骤1:

在手机上安装从Facebook开发者页面下载的Facebook SDK,不要安装普通的Facebook应用程序。确保您可以登录Facebook。然后退出登录。

步骤2:

使用您的最终发布密钥将应用程序导出为apk文件,就像上传到Play商店一样。

步骤3:

通过USB电缆或USB驱动器将Apk文件放入手机中。

步骤4:

使用文件管理器安装您的应用程序:示例

步骤5:

启动您的应用程序并尝试使用Facebook登录。一个对话框会弹出并告诉您:“在Facebook开发者控制台中未找到密钥YOURHASHKEY”

步骤6:

记下密钥。

第七步:

将其放入您的Facebook开发者控制台并保存。现在您完成了。使用先前使用的密钥库发布的应用程序的任何人都可以登录Facebook。

享受吧!


1
只是一个提醒:从日志中复制的键后面需要加上“=”。 - akshay7692

7

如果你要发布应用程序,请使用你之前导出应用程序所使用的keystore,而不是debug.keystore。


1
嗨,我尝试使用我的应用程序密钥库生成密钥散列,但每当我尝试从我的应用程序分享任何内容时,它都会给我一个错误,指出应用程序未正确配置以进行Facebook登录。但是,当我尝试使用debug.keystore生成的keyhash时,它可以正常工作。你能帮我解决这个问题吗? - KunalK

6
最后终于成功了 :)
这里是我的故事:
  1. Add this code to your main activity, after you set layout.

    try { 
      PackageInfo info = getPackageManager().getPackageInfo("PROJECTNAME", PackageManager.GET_SIGNATURES);
      for (Signature signature : info.signatures) {
          MessageDigest md = MessageDigest.getInstance("SHA");
          md.update(signature.toByteArray());
          String sign=Base64.encodeToString(md.digest(), Base64.DEFAULT);
          Log.e("MY KEY HASH:", sign);
          //textInstructionsOrLink = (TextView)findViewById(R.id.textstring);
          //textInstructionsOrLink.setText(sign);
          Toast.makeText(getApplicationContext(),sign, Toast.LENGTH_LONG).show();
      }
    } catch (NameNotFoundException e) {
        Log.d("nope","nope");
    } catch (NoSuchAlgorithmException e) {
    }
    
  2. Change PROJECTNAME to your package name!

  3. Sign your app (Android Tools->Export Signed Application)
  4. In your main activity where you paste code from 2 option, in your layout create TextView with id textstring
  5. uncomment two lines, that your sign code would be set to TextView 6 Wuolia, you have your HASH , install app on your phone!!! and check your hash Key!
  6. Now when it is visible , go to facebook app you created and add it to [Key Hashes]
  7. Note that your package name should be same as on facebook [Package Name] under [Key Hashes]
  8. Have a nice day :)

6

调试证书的密码是android,而不是Android。


5

一行代码生成Facebook分享链接的解决方案

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

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