Facebook Android生成密钥哈希


119

尝试创建与Facebook集成的android应用程序时,我已经进入文档中必须生成密钥哈希文件的部分,它指定要运行以下代码

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

当我在终端上运行此命令时,我收到密钥库被篡改或密码错误的错误消息,

我只想生成我的密钥哈希

谁能指出我正确的方向?


2
您使用的密码正确吗?
总统詹姆斯·波尔克(James K. Polk)

当在终端中输入命令时,它没有给我输入密码的选项
Scott Scott

尝试仅输入keytool命令,而不输入最后两个管道。
总统詹姆斯·波尔克(James K. Polk)

6
我明白了,有时候我真是个傻瓜,在一行中输入命令,不要复制和粘贴
Scott

Answers:


20

删除〜/ .android / debug.keystore下的调试证书(在Linux和Mac OS X上);该目录类似于Windows上的%USERHOME%/。android。

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

让我知道是否可行。


没用 删除了debug.keystore文件,进行了调试构建,文件再也没有回来。注意该文件夹中的其他内容已更新。
CthulhuJon 2015年

3
我真的不知道这是如何接受的答案?
Enoobong

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

281

为了生成密钥哈希,您需要遵循一些简单的步骤。

1)从以下位置下载Openssl

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

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

4)在我的情况下(.C:\ Users \ SYSTEM.android)从.android文件夹复制文件debug.keystore,并在我的情况下(C:\ Program Files \ Java \ jdk1.6.0_05 \ bin)粘贴到JDK 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)现在,您需要输入password,密码= 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-在debug_sha.txt> debug_base64.txt中

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

15)打开debug_base64.txt文件这是您的密钥哈希。


4
不错的答案+1为您服务,我已经遵循了这一要求,并获得了预期的结果:)
BBdev 2012年

我得到这个:keytool错误:java.io.IOException:密钥库被篡改,或者密码不正确。如何找到正确的密码?
2013年

经过2天的困惑后,这对我有用。辉煌的工作!
rennoDeniro

4
@Vizzz:解释生成密钥哈希的好方法。感谢这篇文章,希望这篇文章可以节省很多时间。
Emran Hamza

1
我尝试了所有代码,但从未获得所需的输出。我尝试了来自facebook的代码,同一命令中的所有三个命令也是相同的,但分别运行三个命令给出了正确的代码,工作,搜索时间或搜索天数。谢谢。在此之前,只有Android应用程序上的代码给出了正确的结果,命令提示符给出了无效的密钥,现在一切正常。再次感谢
Diljeet 2015年

149

更新的响应(通过代码生成)更简单的方法:

以我的经验,openssl总是很麻烦,我尝试了facebook建议的第二种方法。真是太好了。这是获取哈希键的最佳方法。

第二种选择是打印出发送到Facebook的密钥哈希并使用该值。在主要活动中对onCreate()方法进行以下更改:

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

        try {
            PackageInfo info = getPackageManager().getPackageInfo(
                    "com.facebook.samples.loginhowto", 
                    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) {

        }
        ...other operations

}//end of onCreate

用您自己的包名称(Manifest.xml中的包名称)替换com.facebook.samples.loginhowto。

官方链接- //developers.facebook.com/docs/android/login-with-facebook/(请参阅页面底部)

OLD ANSWER(使用openssl生成Keyhash)

  1. 要生成签名,您需要在计算机上安装openssl。如果您没有一个下载openssl从此处
  2. 在C:中,创建openssl文件夹
  3. 将下载的openssl zip文件的内容解压缩到 opensslC:驱动器的夹中
  4. 打开命令提示符
  5. 移动到binopensslC:\openssl\bin在命令提示
  6. 运行以下命令来生成您的密钥哈希。在生成哈希密钥时,它应该询问您密码。

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

注意:在上面的代码中,您需要给用户指定路径(即,在我的情况下是C:\ Users \ Anhsirk,您只需要为用户帐户更改此路径即可)

输入密码为android

。如果不要求输入密码,则您的密钥库路径不正确。

如果一切正常,它应该为您提供下面的哈希键。

在此处输入图片说明


我得到这个:keytool错误:java.io.IOException:密钥库被篡改,或者密码不正确。如何找到正确的密码?
2013年

@DuyguK-可能意味着您的密钥存储区已经存在。尝试删除并重做。或您指定的路径错误
AnhSirk Dasarp 2013年

天哪,这花了我几个小时。非常感谢!
Yenthe 2013年

我想问一下,新方法(通过代码获取密钥哈希)是否会以某种方式减慢onCreate进程。因为据我所知,当创建签名的APK时,密钥哈希是不同的。还是感谢您的代码!:)
marson 2014年

没有模拟器,而是在真正的android设备上,更简单的方法是否可以工作?

24

生成哈希键的最简单方法。

要求: SHA1键

您可以通过两种方式从密钥库文件中获取SHA1密钥

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

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

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

要么

2)通过运行signingReport

请参考下图。

在此处输入图片说明

运行文件后,将生成包含必需的sha1键的输出。

在此处输入图片说明

获得所需的SHA1密钥后

然后转到

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

并粘贴您的sha1键

在此处输入图片说明

最后,您将获得Required HashKey,可以将其用于Facebook。


2
这个答案比其他答案要简单得多,因为它只关心最终输出。总是正确的。在其他情况下,如果签名过程配置错误,我们将不知道如何解决。
hakuna1811

1
像魅力一样令人敬畏的工作感谢好友
Dheeraj Jaiswal19年

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。stackoverflow.com/questions/7506392/...
纳伊姆·易卜拉欣

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) {

    }

二。为Facebook创建密钥哈希发布

  1. 下载openssl-0.9.8e_X64

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

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

  4. 开始->运行:cmd(按Enter)

  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. 输入密钥库密码:这是注册密钥库发行版时的密码。

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

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


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

9

此问题的最简单解决方案:

我已经有两个月了。我的主要哈希值一直达到9。今天,我终于找到了简单的解决方案:

第1步:

安装从手机上的Facebook开发人员页面下载的facebook SDK。不要安装普通的Facebook应用程序。确保您可以登录facebook。然后注销。

第2步:

将您的最终发布密钥作为apk导出您的应用程序,就像将其上载到Playstore一样。

步骤3:

通过USB电缆或USB棒将Apk文件放在手机上。

第4步:

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

步骤5:

启动您的应用程序,然后尝试使用Facebook登录。将打开一个对话框,告诉您:“在Facebook开发人员控制台中找不到密钥YOURHASHKEY”

步骤6:

写下密钥。

步骤7:

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

请享用


只是一个注释:您需要在从日志复制的密钥后面加上'='
akshay7692's

7

如果要发布,请使用用于导出应用程序的密钥库,而不要使用debug.keystore。


1
嗨,我已经尝试过使用应用程序密钥库生成密钥哈希,但是每当我尝试共享应用程序中的任何内容时,都会出现错误,表明应用程序配置为Facebook登录错误。但是当我尝试通过debug.keystore生成的keyhash起作用时。你能帮我吗?
KunalK


6

最后 :)

这是我的故事:

  1. 设置布局后,将此代码添加到您的主要活动中。

    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. 将PROJECTNAME更改为您的包裹名称!

  3. 签名您的应用程序(Android工具->导出签名的应用程序)
  4. 在您从2选项粘贴代码的主要活动中,在布局中创建ID为textstring的TextView
  5. 取消注释两行,将您的签名代码设置为TextView 6 Wuolia,您有HASH,请在手机上安装应用程序!并检查您的哈希密钥!
  6. 现在,当它可见时,转到您创建的facebook应用程序并将其添加到[Key Hashes]
  7. 请注意,您的包裹名称应与[关键哈希]下的Facebook [包裹名称]相同
  8. 祝你今天愉快 :)

5

为Facebook生成的一线解决方案

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

4

为了生成发布密钥哈希,您需要遵循一些简单的步骤。

1)下载Openssl

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

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

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

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

6)复制以下代码,然后按Enter

keytool -exportcert -alias abcd-keystore D:\ Projects \ MyAppFolder \ keystore.txt | C:\ openssl \ bin \ openssl sha1-二进制| C:\ openssl \ bin \ openssl base64 ex-keytool -exportcert -alias(您输入的apk别名输入此处,就像我的登录名apk名称是abcd一样)-keystore“已签名的apk生成的keystore apth输入此处” “ openssl bin文件夹路径在此处输入” sha1-二进制| “ openssl bin文件夹路径在此处输入” base64

7)现在您需要输入密码,密码=(在此处输入您的登录密钥库密码)

8)您有用于发布应用程序密钥哈希的密钥库


3

即使此线程很旧,但我还是想分享一下我的经验(最近开始使用facebook),在我看来,这很直截了当:

  1. 从下面的链接下载openssl:https : //code.google.com/p/openssl-for-windows/downloads/list
  2. 将其解压缩到本地驱动器(例如C:\ openssl)
  3. 要获取Facebook集成的开发密钥,请在Windows的命令行中使用以下命令:

    keytool -exportcert -alias androiddebugkey -keystore%HOMEPATH%.android \ debug.keystore | “ C:\ openssl \ bin \ openssl.exe” sha1 -binary | “ C:\ openssl \ bin \ openssl.exe” base64

注意!:请用您自己的安装路径替换openssl.exe的路径(在本示例中为“ C:\ openssl \ bin \ openssl.exe”)。

  1. 它将提示输入密码,例如,

输入密钥库密码:android

如上所示,输入android作为密码。

而已!系统会为您提供28个字符的长键。干杯!

使用相同的过程来获取Release键。只需将命令替换为以下命令,然后使用释放密钥别名即可。

keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | sha1 -binary |“ openssl.exe的路径” | openssl base64


但是它显示询问密码,同时也提供签名的密钥库密码,然后显示chines laungauge
Harsha

确保为openssl \ bin和java ... \ bin正确设置了路径
KawaiKx

3

生成调试哈希键

  public String hashkey(Context context) {
        String keyhash = "";
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.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));
                keyhash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
            }
        } catch (PackageManager.NameNotFoundException e) {

        } catch (NoSuchAlgorithmException e) {

        }
        return keyhash;
    }

生成发布哈希密钥

 keytool -exportcert -alias specialbridge -keystore /home/shilpi/newproject/specialBridge/SpecialBridgeAndroid/keystore/specialbridge.jks | openssl sha1 -binary | openssl base64

2

关于该主题的出色博客文章

从.p12密钥中提取密钥哈希

  1. 打开终端或命令行,然后导航到.p12键所在的位置。
  2. 键入:“ keytool -v -list -keystore mycert.p12 -storetype pkcs12”,其中mycert.p12是.p12密钥的文件名。
  3. 输入密钥库密码(导出.p12密钥时使用的密码)。4。复制sha1指纹签名字节文本。
  4. sha1指纹签名处的字节需要写入“ sha1.bin”文件。您可以使用十六进制编辑器粘贴复制的字节。然后,将文件另存为“ sha1.bin”。
  5. 再次打开终端,然后输入:“ openssl base64 -in sha1.bin -out base64.txt”。
  6. 生成的“ base64.txt”将包含Facebook所需的密钥哈希。

适用于Mac的出色,简单的十六进制编辑器:HexFiend

应该在Mac上预安装OpenSSL,这是Windows版本的链接。

链接


对于Adobe AIR应用程序开发人员(Flash或Apache Flex)而言,这是非常有用的信息。Facebook SSO的“类名”应为AppEntry
Alexander Farber

2

尝试传递密钥密码并作为命令的一部分进行存储

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

1

我可以使用这里的一些解决方案来执行请求的任务,但是我心想,这个笨蛋……为什么不编写一个小的Java代码来完成此任务并将其打包到Jar中,所以我做到了。 ..

一个链接下载的Jar

可在Windows 8上运行...没有尝试任何其他操作系统。


1
我不明白的是,如果花了我几个小时来学习所有内容并进行草绘,为什么没有一家大公司已经这样做,从而为我们提供了一种简单的方法来获取他们向我们询问的信息???
TacB0sS 2013年

1

大家好,我的故事我如何签到拥有Facebook的密钥

首先,您只需在第一堂课中复制这2个方法

    private void getAppKeyHash() {
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                getPackageName(), 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));
            System.out.println("HASH  " + something);
            showSignedHashKey(something);

        }
    } catch (NameNotFoundException e1) {
        // TODO Auto-generated catch block
        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());
    }
}
public void showSignedHashKey(String hashKey) {

    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    adb.setTitle("Note Signed Hash Key");
    adb.setMessage(hashKey);
    adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {

        }
    });

    adb.show();
}

**如果要签名哈希,请从oncreate方法调用funcation getAppKeyHash(),然后执行签名构建安装签名构建并运行,您将在对话框中获取哈希密钥,然后将其记录下来并在facebook dev帐户上对其进行更新,并对该函数进行注释并制作另一个签名的APK **


1

如果您的密码= android错误,那么请输入您的PC密码对我有用。

而对于产生keyHash尝试此链接这里


0

对我唯一有用的就是使用密码android。为什么在那里没有任何指南中提到?


0

在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){

    }
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.