Android-Facebook应用的密钥哈希


229

我正在开发一个Android应用程序,我想在其中集成Facebook发布功能。我下载了Facebook-Android SDK,并在其中找到了readme.md(文本文件),其中提到该文件可为Android生成密钥哈希。我如何生成它?


2
你可以检查此链接javatechig.com/2012/12/10/...
Nilanchal

2
检查对于那些仍然面临问题的人,
Chintan Khetiya 2013年

使用此生成用于调试和发布模式的HashKey。stackoverflow.com/questions/7506392/...
纳伊姆·易卜拉欣

要获取钥匙,请观看视频
很快Santos '18

Answers:


310

这是步骤-

  1. Google代码下载openssl (如果您使用的是64位计算机,则必须下载openssl-0.9.8e X64,而不是最新版本)

  2. 提取它。在C:/中创建一个文件夹-OpenSSL,然后在此处复制提取的代码。

  3. 检测debug.keystore文件路径。如果找不到,则在C:/中进行搜索,然后在下一步中使用命令中的Path。

  4. 检测您的keytool.exe路径,并在命令提示符下转到该dir /并在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
    • 就这样。你会得到一个哈希值

欲了解更多信息,请点击这里


5
在Win7 x64上,这个答案几乎对我有用。但是,生成的编码证书不正确。布莱恩·贝达德(Bryan Bedard)的回答将产生正确的证书价值。我猜想窗户上的管道是罪魁祸首。
Walt Armor

10
对于64位用户请注意:仅适用于openssl-0.9.8e X64版本,不适用于openssl-0.9.8k X64
Nicola Peluchetti 2011年

我为我的系统下载了openssl-0.9.8e X64并解压缩了它,除了一个包含一些数据的文件外,不包含任何内容。请帮助我了解更多。
Ravikiran

2
该命令应在Windows系统中Java的bin文件夹中执行。
Antrromet'2

1
@HanishSharma尝试忽略$
ban-geoengineering

241

[EDIT 2020]->现在我完全推荐这里的答案,使用android studio更加容易,更快,并且不需要编写任何代码-下面的代码回到了日食时代:)-。

您可以在任何活动中使用此代码。它将哈希密钥记录在logcat中,这是调试密钥。这很容易,并且比使用SSL感到轻松。

PackageInfo info;
try {
    info = getPackageManager().getPackageInfo("com.you.name", PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md;
        md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String something = new String(Base64.encode(md.digest(), 0));
        //String something = new String(Base64.encodeBytes(md.digest()));
        Log.e("hash key", something);
    }
} catch (NameNotFoundException e1) {
    Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
    Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
    Log.e("exception", e.toString());
}

您可以在知道密钥后删除代码;)


27
伙计们,保重,创建apk后,密钥哈希值已更改!因为使用此代码可以获取调试密钥库的哈希值,但是在创建apk时,这是另一个哈希值,必须在模拟器上尝试apk后才能从日志中捕获它,然后删除代码并再次导出而没有此日志:)-我知道这很麻烦: D但对我来说,它比
键盘工具

4
Opensssl总是会产生问题。这种方法是最好的一种。只需创建一个空白应用程序,然后打印密钥即可使用。谢啦!!
2013年

1
到目前为止,这是最简单的解决方案。使用该keytool命令,我得到了错误的哈希值(我不知道为什么,决定我不太在意调查)。这行之有效,实际上花费了5分钟时间来获得调试和发布密钥哈希。+1
克里斯·西里菲斯

1
是的,塞巴斯蒂安,您只需要在设备上安装签名的apk,然后将其连接到android studio并检查日志猫,或者您就可以在ui中的edittext中显示哈希并进行复制,无论如何,此代码产生的哈希可用于签名的apk :)
巴瑟姆·维萨

1
使用keytool

135

我已经为Windows和Mac OS X创建了一个小工具。只需放入密钥存储文件,然后获取哈希密钥即可。

如果要使用默认的debug.keystore文件,请使用默认的别名和密码。否则,请使用您自己的密钥库文件和值。

检出它,下载Windows版本下载Mac OS X版本 (Dev-Host有时可能会关闭...因此,如果链接断开了,我会修复它)。

希望对您有所帮助...

2014年12月31日-编辑: 将主机更改为AFH。请让我知道链接是否断开

2013年11月21日-编辑:

根据用户的要求,我添加了默认的密钥库位置和“ 捐赠”按钮。如果我帮助过您,请随时使用。:)

屏幕截图 屏幕截图2


1
最好。方法。曾经 捐赠按钮在哪里?
亚当·瓦赫吉

1
@ Shahar2k5真的不知道,还是重新开始了,像个魅力一样工作。抱歉
Anearion 2014年

1
奇迹般有效!感谢您的分享:)
Vinayak 2014年

1
@Shahar Barsheshet谢谢。你是对的。从Devhost域下载,没有问题。
MajorGeek 2014年

1
我不明白:与使用keytool命令行相比,为什么您的工具提供了不同的SHA密钥?如果应用于相同的密钥库文件,是否应该产生相同的结果?
2015年

64

目前,Facebook的Android教程中的说明 在Windows下无法正常运行。他们的示例显示了如何将keytool输出通过管道传递给openssl,但是如果您在Windows下尝试这样做,则由于某种原因该输出无效。我发现必须使用中间文件才能使其正常工作。以下是对我有用的步骤:

首先从Google 下载适用于Windows的openssl

C:\Users\Me>keytool -exportcert -alias my_key -keystore my.keystore -storepass PASSWORD > mycert.bin

C:\Users\Me>openssl sha1 -binary mycert.bin > sha1.bin

C:\Users\Me>openssl base64 -in sha1.bin -out base64.txt

运行这些命令后,有效的哈希存储在文件base64.txt中。将其复制并粘贴到Facebook上的应用程序设置中。


工作完美,其他所有都失败了。
奥利弗·迪克森

2
真是PITA-但布莱恩(Bryan)是对的!无论您的路径错误,密码错误还是管道运行不正常,该命令几乎都会输出哈希值-您仍会获取哈希值,但它将无法正常工作。因此,(在Windows上)我放弃了Powershell并尝试了Cygwin-仍然无法正常工作。只有将debug.keystore文件复制到工作目录后,我才能使它运行和工作!!
鲍比2012年

2
因此,总而言之,在Windows上,要么使用Bryan的拆分技术,要么将cygwin与工作目录中的密钥库文件一起使用:keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64如果没有提示您输入密码,则找不到正确的密钥库文件。
鲍比

为我完美地工作。好答案。
罗恩

如果您想避免因密码错误而散列,只需在继续使用openSSL之前检查mycert.bin。否则,您将散列错误的密码错误文本:)
Vaiden

50

这是在Facebook的官方页面上给出的

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

让我将此命令分解为多个片段。

  1. 寻找"keytool.exe"。您可以在C:驱动器上进行搜索。您可以在"java jdk"或中找到它"java jre"。如果安装了多个版本,请选择任何一个。

  2. 打开CMD提示符,然后转到找到的上述目录"keytool.exe"

    剪辑“ exe”并粘贴上面在Facebook页面上提供的命令。

  3. 输入此错误将导致输入输出命令中未识别OpenSSL。解决方案:从OpenSSL下载“ Openssl” (如果您使用64位计算机,则必须下载openssl-0.9.8e X64)。解压缩并将其保存在任何位置...我将其保存在OpenSSl文件夹中的C:驱动器上

  4. 在管道“ |”后的两个位置,将上面遇到OpenSSL错误的命令替换为“ C:\ OpenSSL \ bin \ openssl”中的openssl。

  5. 如果提示您输入密码,请输入android

然后您将获得您的哈希密钥。有关更多步骤,请再次参考Facebook页面。


32

将此代码添加到onCreate您的活动中,它将在logCat中的KeyHash标记下打印哈希

try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           getPackageName(),
                           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) {

}

您可以为您的帐户添加多个哈希键,因此,如果您在调试中运行,请不要忘记在发布模式下再次运行它


很好的解决方案,我想应该没有可执行的未签名版本?未签名版本应无法在任何设备上安装。那些调试版本使用调试密钥库签名:)
benleung 2016年

26

要获取Android密钥哈希码,请按照以下步骤操作:

  1. 在此处下载适用于Windows的OpenSSL
  2. 现在解压缩到C盘
  3. 打开CMD提示
  4. 类型 cd C:\Program Files\Java\jdk1.6.0_26\bin
  5. 然后只输入keytool -export -alias myAlias -keystore C:\Users\您的用户名\.android\myKeyStore | C:\openssl-0.9.8k_WIN32\bin\openssl sha1 -binary | C:\openssl-0.9.8k_WIN32\bin\openssl enc -a -e
  6. 完成了

2
好答案。非常感谢你。
Palani Kumar 2012年

1
这是用于调试密钥还是用于发布密钥?
IgorGanapolsky

@IgorGanapolsky而不是的路径myKeyStore,请提供释放密钥的路径。上面的代码用于调试密钥
Pallavi

17

我发现的最简单的解决方案是:

  • 打开日志猫
  • 尝试使用Android SDK访问Facebook
  • 在日志中查找如下所示的行:

    04-24 01:14:08.605: I/System.out(31395): invalid_key:Android key mismatch. 
    Your key "abcdefgHIJKLMN+OPqrstuvwzyz" does not match the allowed keys specified in your
    application settings. Check your application settings at 
    http://www.facebook.com/developers
  • 复制“ abcdefgHIJKLMN + OPqrstuvwzyz”并将其粘贴到Facebook Android密钥哈希区域。


这是最简单,最有效的方法,只需从日志中获取它,甚至不需要openssl!
卡C.19年

这是对我唯一可行的解​​决方案!我没有看到像您这样的日志,但是我KeyHash: XWwXXXXX/5xxxxxxxxxxx=在日志中看到了此日志,并帮助了我!
1918年

14

您可以从SHA-1密钥获取密钥哈希。非常简单,您需要从Play商店获取SHA-1(Signed APK)密钥,如下图所示。在此处输入图片说明

现在,复制该SHA-1密钥,并将其粘贴在此网站http://tomeko.net中,然后检查下面的图像以获取您的密钥哈希。

在此处输入图片说明


1
谢谢。我试图通过使用OpenSSL获得密钥哈希。我花了1分钟,很简单。
绿色Y.

1
非常感谢!这是解决方案,因为Google现在正在签署我的应用程序(我只是使用上传证书/密钥库)
哈里森

13

对于Linux OSWindows OS,我已经通过这种方式完成操作:

Linux:

  • 下载Openssl
  • 打开终端
  • keytool -exportcert -alias **myaliasname** -keystore **/home/comp-1/Desktop/mykeystore.jks** | openssl sha1 -binary | openssl base64

请根据需要更改别名名称密钥库的路径

终端将要求密码密钥库中。您必须提供相同密钥库的密码

所以最后您将获得Release Hashkey

视窗:

释放 Hashkey的步骤:

  • 下载Openssl(从此处下载),我已经下载了64位操作系统,您可以在此处找到更多信息
  • 将下载的zip文件解压缩到仅C:\驱动器
  • 打开命令提示符
  • keytool -exportcert -alias **myaliasname** -keystore **"C:\Users\hiren.patel\Desktop\mykeystore.jks"** | "C:\openssl-0.9.8e_X64\bin\openssl.exe" sha1 -binary | "C:\openssl-0.9.8e_X64\bin\openssl.exe" base64

请根据需要更改别名名称密钥库的路径

注意:

请把您的详细信息放在我在** **之间标记的位置。

终端将要求密码密钥库中。您必须提供相同密钥库的密码

所以最后您将获得Release Hashkey

完成了


这里的密码是什么?
阿卡什·比萨里亚

@AkashBisariya,创建密钥库时提供的密钥库密码。
埃伦·帕特尔

成功生成密钥后在哪里可以找到密钥?
阿南德·菲德克

11
  • 在此处下载适用于Windows的openSSL,您可以在此处找到64位和32位

  • 解压缩下载的文件

  • 在C驱动器中创建文件夹名称openSSL
  • 将所有提取的项目复制到openSSL文件夹中(bin,include,lib,openssl.cnf)
  • 获取android调试密钥库,默认位置为

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

  • 现在得到命令提示符并粘贴此代码

keytool -exportcert -alias androiddebugkey -keystore C:\ Users \ username.android \ debug.keystore | “ C:\ openSSL \ bin \ openssl” sha1 -binary | “ C:\ openSSL \ bin \ openssl” base64

  • 按Enter键,您将获得28位键盘密码

否,它要求输入密码。键入android给出24位哈希,键入a给出28位哈希。不知道为什么!
sud007 '16

坏链接!他们根本没有keytool
KawaiKx

6

您需要使用keytool为已签名的android应用(如Android网站中所述的过程)使用keytool创建一个密钥库,然后您必须安装cygwin,然后需要从Google代码安装openssl,然后执行以下命令即可得到哈希值Android密钥,然后将该哈希密钥放入您创建的Facebook应用程序中。然后您可以通过Android应用程序访问Facebook应用程序,以张贴墙(“ publish_stream”)为例。

$ keytool -exportcert -alias alias_name -keystore sample_keystore.keystore | openssl sha1 -binary | openssl base64

您需要从cygwin执行以上命令。


6

下载openSSL- >安装->通常将其安装在C:\ OpenSSL中

然后打开cmd并输入

cd../../Program Files (Enter)

java (Enter)

dir (Enter)

cd jdk1.6.0_17 (varies with jdk versions) (Enter)

检查jdk版本,转到C:/ program files / java / jdk_version

cd bin (enter)

keytool -exportcert -alias androiddebugkey -keystore C:Users\Shalini\.android\debug.keystore | "C:\OpenSSL\bin\openssl sha1 -binary | "C:\OpenSSL\bin\openssl base64 (Enter)

它将询问您的密码是android。


6
  1. 只需打开您的主活动文件并创建以下提及的功能:

         try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "your.application.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) {
     }

1.1运行您的应用程序,这将为您的应用程序生成一个哈希键。

  1. 现在,打开log cat并使用“ KeyHash”进行搜索,然后复制哈希键。

  2. 生成哈希键的人可以删除此功能。


5

1)创建一个密钥来对您的应用程序进行签名,并记住别名。

2)安装OpenSSL。

3)在路径中放入OpenSSL的bin文件夹。

4)按照FB-Android-SDK 页面上“设置单一登录”下提到的步骤,并生成您的哈希密钥。确保输入正确的别名和密钥库文件名。

5)在Facebok上创建一个应用程序,然后在“移动设备”选项卡下,输入此哈希键。


5

Facebook开发者网站上的官方文档:

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

    // Add code to print out the key hash
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.facebook.samples.hellofacebook", 
                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) {

    }

@WilliamKinaan:随时;):P
Hardik Thaker

@HardikThaker我使用了您的代码,它为我提供了与我使用此命令从终端获得的完全相同的keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64密钥哈希,但是我仍然得到的密钥哈希与任何存储的密钥哈希都不匹配
Shan Xeeshi

4
keytool -exportcert -alias androiddebugkey -keystore       C:\Users\pravin\.android\debug.keystore | "H:\OpenSSL\bin\openssl" sha1 -binary | "H:\OpenSSL\bin\openssl" base64

这对我有用...

脚步:

1) Open command line go to - > java Keytool..... for me C:\Program Files\Java\JDK1.7\bin
2) Download OpenSSL from google
3) paste this with changing your paths -
   keytool -exportcert -alias androiddebugkey -keystore C:\Users\pravin\.android\debug.keystore | "H:\OpenSSL\bin\openssl" sha1 -binary | "H:\OpenSSL\bin\openssl" base64 

    ....................   give proper debug.keystore path and openSSL path .. 

4) Finley it may be ask u password .. so give password -> android   ...
5) you will get 28 characters that will be your has key

4

对于Linux

打开终端:

对于调试版本

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

注意:确保在两种情况下都必须输入密码。如果未要求输入密码,则表示命令中存在错误。


我用不同的别名获得了不同的值,如何验证哪一个是正确的?
Javal Nanda

是否要求输入具有别名的密码?
比拉伊·扎拉瓦迪亚

ya,无论我输入什么密码,都给我哈希密钥。我的应用程序已经在Play商店中,本机fb现在无法正常工作。无论如何,我将需要为发布版本生成确切的密钥哈希。开发人员建议在以下文章中将代码包含在onCreate内,但我想使其在Playstore stackoverflow.com/questions/15021790/
Javal Nanda 2013年

是的,openssl的寡妇有问题。您可以使用该文章中指定的代码来实现。
比拉伊·扎拉瓦迪亚(Biraj Zalavadia)2013年

如果要在Playstore上不进行更新。1)创建新的Android Demp应用程序。2)将这段代码放入create中。3)在应用商店上与您的应用相同的密钥库签署此演示应用4)然后运行此签名的apk 5)并最终使用此哈希密钥
Biraj Zalavadia 2013年

4

对于Android应用程序

此代码用于获取Android应用程序中的哈希密钥以进行Facebook集成。我已经测试了所有设备,并且可以正常工作。仅更改此代码的程序包名称:

private void facebookHashKey() {

    try {
        PackageInfo info = getPackageManager().getPackageInfo("com.app.helpcove", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            String hashCode  = Base64.encodeToString(md.digest(), Base64.DEFAULT);
            System.out.println("Print the hashKey for Facebook :"+hashCode);
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }
}

4

回答类似问题时,我发现这对我有用:

  • apkname.apk您想知道其哈希值的文件复制到“ Java \ jdk1.7.0_79 \ bin ”文件夹中
  • 运行此命令 keytool -list -printcert -jarfile apkname.apk
  • 复制SHA1值并使用此网站进行转换
  • 使用转换后的Keyhash值(例如zaHqo1xcaPv6CmvlWnJk3SaNRIQ =

3

最简单的解决方案:

  1. 不要添加哈希键,执行其他所有操作
  2. 按下facebook登录后,您将收到一条错误消息:“无效的密钥哈希。密钥哈希“ xxx”与任何存储的密钥都不匹配。...”
  3. 打开facebook应用程序仪表板,并添加哈希“ xxx =“(错误中的“ xxx”哈希+ + =”)

3

要生成释放密钥的哈希,请在Mac或Windows上运行以下命令,以替换释放密钥别名和密钥库的路径。

在Windows上,使用:

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

此命令应生成一个28个字符字符串。请记住,将此发布密钥哈希复制粘贴到您的Facebook App ID的Android设置中。

图片:fbcdn-dragon-a.akamaihd.net/hphotos-ak-xpa1/t39.2178-6/851568_627654437290708_1803108402_n.png

请参阅:https : //developers.facebook.com/docs/android/getting-started#release-key-hashhttp://note.taable.com


3

使用它进行Kotlin中的打印密钥哈希

try {
        val info = context.getPackageManager().getPackageInfo(context.packageName,
                PackageManager.GET_SIGNATURES);
        for (signature in info.signatures) {
            val md = MessageDigest.getInstance("SHA")
            md.update(signature.toByteArray())
            Log.d("Key hash ", android.util.Base64.encodeToString(md.digest(), android.util.Base64.DEFAULT))
        }
    }catch (e:Exception){

    }

2

在Android Studio中也解决了我的问题,但方法略有不同。

在Android Studio中获取SHA-1值。

  1. 单击摇篮
  2. 点击签名报告
  3. 复制SHA-1

单击Android Studio中的标记面板

  1. SHA-1值看起来像这样CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84

    并打开http://tomeko.net/online_tools/hex_to_base64.php将SHA1值转换为base64。这就是Facebook所需要的,获取生成的哈希值“ ******************** =”并将密钥哈希值复制到facebook应用程序控制台。

从这里获取的部分答案Github链接


2

有两种方法可用,复杂的一种简单的一种

方法一:(小复杂)

首先你要下载的SSL 64bit32bit相应的,记得要下载的文件包含名称e版本代码之后openssl-0.9.8e_X64.zipopenssl-0.9.8e_WIN32.zip不与k版本的代码后,

并放置在AndroidStudio / jre / bin目录中,如果您不知道放置在哪里,则可以通过右键单击android studio快捷方式找到此目录,如下所示:

在此处输入图片说明

现在,您已经在一处管理了两个必需的东西,但是仍然需要找到您的路径,该路径debug.keystore始终可以在中找到"C:\Users\yourusernamehere\.android\debug.keystore"

注意: 如果您的应用已经发布或即将发布,请使用发布签名密钥库,前提是且仅当您在开发模式下进行测试时,才可以使用debug,keysotre

一切设置完成后,在中安排要执行的用于生成哈希键的base64 format命令,您的命令将如下所示

keytool.exe -exportcert -alias androiddebugkey -keystore "C:\Users\ayyaz talat\.android\debug.keystore" | "D:\Program Files\Android\Android Studio\jre\bin\openssl\bin\openssl.exe" sha1 -binary |"D:\Program Files\Android\Android Studio\jre\bin\openssl\bin\openssl.exe" base64

它将提示您输入debug.keystore的密码,默认情况下为android。如果您使用自己的密钥,那么密码也是您的。如果一切都按预期进行,则输出将如下所示,希望对您有所帮助

在此处输入图片说明

第二种方法(分别简单)

如果您不想完成上述所有过程,则只需使用以下方法记录haskey:

 private void printKeyHash() {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA1");
                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());
        }
    }

输出:

在此处输入图片说明


1

最好的方法是使用以下代码:

private void getHashKey(String pkgName)
{
    try
    {
        PackageInfo info = getPackageManager().getPackageInfo(pkgName, PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures)
        {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            String hashKey = Base64.encodeBytes(md.digest());
            _hashKey_et.setText(hashKey);
            Log.i("KeyTool", pkgName + " -> hashKey = " + hashKey);
        }
    }
    catch (NameNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (NoSuchAlgorithmException e)
    {
        e.printStackTrace();
    }
}

但是,我感到非常沮丧的是,没有一个简单的工具可以为Facebook应用程序生成HashKey。每次我不得不使用Openssl和Keytool或使用代码从签名中获取哈希值时……

因此,我编写了一个简单的KeyGenTool可以为您工作:-> Google Play上的KeyGenTool <-

请享用 :)


1

我犯了一个小错误,应该牢记。如果您使用的是密钥库,请提供别名,而不是androiddebugkey ...

我解决了我的问题。现在,如果我的设备中安装了Facebook,那么我的应用仍在通过Facebook登录集成获取数据。只关心您的哈希键。

请看下面。

C:\Program Files\Java\jdk1.6.0_45\bin>keytool -exportcert -alias here your alias name  -keystore "G:\yourkeystorename.keystore" |"G:\ssl\bin\openssl" sha1 -binary | "G:\ssl\bin\openssl" base64

然后按Enter-它会要求您输入密码,然后输入密钥库密码,而不是Android。

凉。


0
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.text.Editable;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

    Button btn;
    EditText et;
    PackageInfo info;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn=(Button)findViewById(R.id.button1);
        et=(EditText)findViewById(R.id.editText1);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                try {
                    info = getPackageManager().getPackageInfo("com.example.id", PackageManager.GET_SIGNATURES);
                    for (Signature signature : info.signatures) {
                        MessageDigest md;
                        md = MessageDigest.getInstance("SHA");
                        md.update(signature.toByteArray());
                        String something = new String(Base64.encode(md.digest(), 0));
                        //String something = new String(Base64.encodeBytes(md.digest()));
                        et.setText("" + something);
                        Log.e("hash key", something);
                    }
                } catch (NameNotFoundException e1) {
                    Log.e("name not found", e1.toString());
                } catch (NoSuchAlgorithmException e) {
                    Log.e("no such an algorithm", e.toString());
                } catch (Exception e) {
                    Log.e("exception", e.toString());
                }
            }
        });
    }



}

此代码不会为我生成有效的哈希键。@Jamshid的答案对我适用于Mac OSX。
Loolooii 2015年

0

Kotlin代码获取哈希密钥

 private fun logHashKey() {
    try {
        val info = getPackageManager().getPackageInfo("your.package.name", PackageManager.GET_SIGNING_CERTIFICATES);
        for (signature in info.signingInfo.signingCertificateHistory) {

            val md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            val something = Base64.getEncoder().encodeToString(md.digest());
            Log.e("hash key", something);
        }
    } catch (e1: PackageManager.NameNotFoundException) {
        Log.e("name not found", e1.toString());
    } catch (e: NoSuchAlgorithmException) {
        Log.e("no such an algorithm", e.toString());
    } catch (e: Exception) {
        Log.e("exception", e.toString());
    }
}

请不要忘记在调试和发布环境中生成密钥,因为它们会根据构建设置进行更改。


0

试试这个 :

  • 获得哈希键值的两种方法

1)使用命令行获取哈希键(官方文档:https//developers.facebook.com/docs/android/getting-started

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

要么

2)使用代码获取哈希键

  @Override
   protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

            //Hask Kay generation 
             GetKeyHase();
    }

    private void GetKeyHase() {
            try {
                PackageInfo info = getPackageManager().getPackageInfo("ADD YOUR PACKAGE NAME", PackageManager.GET_SIGNATURES);
                for (Signature signature : info.signatures) {
                    MessageDigest md = (MessageDigest.getInstance("SHA"));
                    md.update(signature.toByteArray());
                    String hashkey_value = new String(Base64.encode(md.digest(), 0));
                    Log.e("hash key", hashkey_value);
                    //check you logcat hash key value
                }
            }catch (Exception e) {
                Log.e("exception", e.toString());
            }
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.