使用Android Facebook SDK的keytool

15

我只是想确认一下。

我正在Windows上开发。

我试图将Facebook集成到一个应用程序中,SDK文档说我需要“导出签名”。

从这里开始:http://developers.facebook.com/docs/guides/mobile/#android

所以它说运行这个命令:

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

首先我需要下载openssl:OpenSSL

现在,我假设上面的命令应该被转换为:

"C:\path\to\java\keytool" -exportcert -alias your_alias -keystore "C:\path\to\your\keystore\keystore.name" | "C:\path\to\openssl_install\bin\openssl" sha1 -binary |"C:\path\to\openssl_install\bin\openssl" base64
  • 你想要使用安装在最新Java安装文件夹中的keytool吗?
  • 你要求别名为在Eclipse中创建普通apk时使用的别名的名称?
  • 你要求keystore是导出Android应用程序时使用的那个?
  • 你要求使用刚安装的openssl。

完成后,它会要求输入密码:(输入时显示密码)

如果我输入正确的密码,则会返回

'zR2tey1h9kqPRSW/yEYEr0ruswyD='(为公开而更改)

但是,如果我输入错误的密码,它仍会以以下形式返回代码

'ga0RGNYHvTR5d3SVDEfpQQAPGJ1='?

所以,我只是想确认我正在做正确的事情,这是预期的输出。


很好的博客,解释了一些陷阱:http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/ - Blundell
你是否将“android”作为密钥库的密码? - IgorGanapolsky
3个回答

12

获取哈希值的最佳方式是运行以下代码:

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));
                    Log.e("hash key", something);
        } 
        }
        catch (NameNotFoundException e1) {
            // TODO Auto-generated catch block
            Log.e("name not found", e1.toString());
        }

             catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                 Log.e("no such an algorithm", e.toString());
            }
             catch (Exception e){
                 Log.e("exception", e.toString());
             }

在使用Windows命令提示符、Git Bash或Cygwin终端提取哈希值时,这三个工具会给出不同的结果。

最准确的代码如下所示:


@Mina 那个 Base64 类的导入是什么? - Blundell
如果你的Android版本低于2.2,那么你需要构建你的应用程序以适配2.2版本,然后运行代码并获取哈希值,最后再构建应用程序以适配你的初始目标版本。而如果你的Android版本是2.2或更高,则无需进行此操作。 - Mina Wissa
哦,现在我更加困惑了,因为这给了我一个不同于使用我的问题方法得到的哈希码。 - Blundell
对我来说,使用上面的代码是有效的,但是请将运行应用程序附加到调试器中,然后它将输出可工作的KeyValue日志,如果我去掉“=”符号。奇怪的是,我有一个Toast来输出字符串,而Toast在真实设备应用上显示不同的键,但在调试中显示真实键。很奇怪。 - Miguel
在我的情况下,keytool和PackageManager代码生成了相同的哈希值。如果生成不同的哈希值,则问题可能与错误的密钥库密码或错误的keytool命令参数有关。 - Baha
显示剩余3条评论

1

是的,我认为你正在以正确的方式进行操作。我也执行了这个命令,并将这个哈希值放入我的 Facebook 应用程序中,它可以正常工作。


0

以下是您的问题答案:

所以,一旦我完成这个步骤,它会要求输入密码:(在我输入密码时显示密码)

如果我输入正确的密码,我会得到

'zR2tey1h9kqPRSW/yEYEr0ruswyD='(已更改为公共),但如果我输入错误的密码,它仍然会以以下形式返回代码

'ga0RGNYHvTR5d3SVDEfpQQAPGJ1='?所以,只是想确认我是否做对了,这是预期的输出

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 有三个命令将前一个命令的输出传递给后一个命令。

  1. keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore
  2. openssl sha1 -binary
  3. openssl base64

当输入错误的密钥库密码时,第一个命令会生成错误,但不会显示出来,因为它将成为第二个命令的输入,并生成不同的哈希值。只需运行第一个keytool命令(keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore)以确认您的密钥库密码是否正确。如果密码不正确,则会显示类似下面的输出。

> keytool -exportcert -alias androiddebugkey -keystore 

~/.android/debug.keystore 输入密钥库密码:
keytool错误:java.io.IOException:密钥库被篡改,或密码不正确

如果生成了Android调试哈希值,请提供android作为输入密钥库密码:的答案。Android调试密钥库的默认密码是android

命令也可以写成捕获keytool命令的错误,以查看在运行第二个命令之前是否返回了错误。

所以你想要安装在最新Java安装文件夹中的keytool?

你想要别名是你在eclipse中用于普通apk创建的别名的名称?

你想要密钥库是你在导出Android应用程序时使用的那个?

你想要openssl是你刚刚安装的那个?

以上所有问题的答案都是肯定的。PATH可以设置为不需要输入keytool和openssl的完整路径。


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