Keytool生成的密钥哈希长度为32个字符,而不是28个字符。

40

我正在使用以下命令为安卓版Facebook应用控制台生成密钥哈希:

.\keytool.exe -exportcert -alias app_android -keystore release.keystore | openssl sha1 -binary | openssl base64
根据Facebook开发者SDK帮助文档所述,以及开发者控制台显示,密钥散列值应为28个字符,但是keytool生成的密钥散列值为32个字符。
Java版本:jdk1.8.0_31 操作系统:Windows 7
生成用于android的密钥散列值。
编辑:
根据@Shreyash-mashru的建议,我使用了以下代码获取密钥散列值。
try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "my.package.name",
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.e("KeyHash:", "++++++++++++++++++++++++++++++++++++++" + Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (PackageManager.NameNotFoundException e) {
        Log.e("KeyHash:", "++++++++++++++++++++++++++++++++++++++" + e.toString());

    } catch (NoSuchAlgorithmException e) {
        Log.e("KeyHash:", "++++++++++++++++++++++++++++++++++++++" + e.toString());
    }

不过,如果有人能够帮我理解为什么命令行工具生成的密钥散列长度是32个字符而不是28个字符,那就太好了...


1
建议。你可以从上面的链接中找到一个易于使用的方法,将其哈希到你的日志中,并从中复制粘贴到你的Facebook应用程序中。该页面的链接 - shreyash mashru
谢谢@shreyashmashru,我会尝试。但是你知道为什么keytool生成32个字符而不是28个吗? - Jalpesh
谢谢您的提问。 - Bugs Happen
7个回答

109

我也遇到了这个问题,我的情况是我在使用Windows Powershell时,生成的密钥长度始终为32个字符。当我切换到普通的cmd命令行工具时,它就按预期工作了。


1
我也有同样的问题,尽管它没有生成32个字符长的字符串,但Facebook显示为无效(给出错误:应该像那样在结尾处有=),使用cmd可以完美解决。 - Luckyy
这个解决方案对于我的特定问题非常完美地奏效了。 - Jalpesh
一样的问题。我想知道这是一个openSSL问题还是一个PowerShell的问题。 - ronenmiller
1
它解决了这个问题。对于那些想知道哪个openssl zip/rar适合的人,我可以确认在https://code.google.com/archive/p/openssl-for-windows/downloads上的openssl-0.9.8e_X64.zip对于64位客户端按预期工作。 - hanilozmen
@hanilozmen 谢谢兄弟! - undefined
显示剩余5条评论

5
生成的哈希值是32个字符,因为在结尾处添加了回车和换行符。要解决这个问题,您可以选择以下方法之一:
删除哈希值的最后5个字符,并在末尾添加一个“=”号。例如:"1234567890abcdefghijklmnopqrstuv"(32个字符)--> "1234567890abcdefghijklmnopq="(28个字符)
或者:
打开JavaScript控制台,使用以下代码:
btoa(atob("your hash string").slice(0, -2))

其中"your hash string"是您的32个字符哈希字符串。


1

尝试在命令提示符中输入命令!

它会要求您输入密码,然后您将获得哈希密钥

powershell上尝试相同的命令不会提供正确的哈希密钥。


1
尝试使用普通的命令提示符或使用git bash命令提示符,它将生成28个字符长度的字符串。不要使用Windows PowerShell,因为它会生成32个字符长的字符串。

0

我曾经遇到过同样的问题。这可能与使用现有版本的openSSL(64位)有关。我从这里下载了32位版本并将其安装到c:\openSSL中。然后命令指向这个版本的SSL,我得到了我的28个字符的哈希值。

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


0
如果您正在使用 Windows,则打开 cmd 并输入以下命令:

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

在任何情况下都可以运行此命令。

-4
.\keytool.exe -exportcert -alias app_android -keystore release.keystore | openssl sha1 -binary | openssl base64

这对我来说很好用。再试一次。


哈希值是否为28个字符长?您能否提及环境和Java版本? - Jalpesh
是的,Java(TM) SE 运行时环境(版本 1.7.0_80-b15) - Shivanshu Verma
我认为这个问题与使用PowerShell而非命令提示符有关。因此,重新运行命令将无法解决它。 - hanilozmen

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