【问题标题】:Keytool generates 32 character long key hash instead of 28Keytool 生成 32 个字符长的密钥散列而不是 28 个
【发布时间】:2016-01-25 05:27:22
【问题描述】:

我正在使用以下命令为 Android 的 Facebook 应用程序控制台生成密钥哈希

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

正如Facebook developers SDK help所说的那样

根据帮助页面和开发人员控制台,密钥哈希应该是 28 个字符长,但是 keytool 正在生成 32 个字符长的密钥。

Java 版本:jdk1.8.0_31 操作系统:Windows 7

为安卓生成。

编辑

根据@Shreyash-mashru 的建议,我使用以下代码获取keyhash

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

【问题讨论】:

  • 建议。它易于使用您可以从上面发布的链接中找到的方法,您可以将其散列到您的日志中。并将其复制并粘贴到您的 Facebook 应用程序中。link of that page
  • 谢谢@shreyashmashru 会尝试的。但是知道为什么 keytool 会生成 32 个字符而不是 28 个字符吗?
  • 感谢您提出这个问题。

标签: android facebook keytool


【解决方案1】:

也遇到了这个问题,对我来说,我使用的是 windows powershell,它一直在生成一个 32 个字符的密钥。当我切换到普通的旧 cmd 时,它按预期工作。

【讨论】:

  • 这很有趣......我也在使用powershell。有一天我回到 Windows 时肯定会检查一下。
  • 和我一样,虽然它没有生成 32 个字符长,但它被 Facebook 显示为无效(gving 错误:它应该是 = 在最后这样),使用 cmd 并且工作完美
  • 这个解决方案非常适合我的特定问题。
  • 这里也一样。我想知道这是 openSSL 问题还是 power shell 问题。
  • 它解决了这个问题。对于那些想知道哪个 openssl zip/rar 适合的人,我可以确认 code.google.com/archive/p/openssl-for-windows/downloads 的 openssl-0.9.8e_X64.zip 对于 64 位客户端可以正常工作。
【解决方案2】:

生成的哈希为 32 个字符,因为末尾添加了回车符和换行符。要解决此问题,您可以:

删除哈希的最后 5 个字符,并在末尾添加 "="。例如:"1234567890abcdefghijklmnopqrstuv"(32 个字符)--> "1234567890abcdefghijklmnopq="(28 个字符)

或者:

打开一个javascript控制台,然后使用:

btoa(atob("your hash string").slice(0, -2))

"your hash string" 是您的 32 个字符的哈希值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。它与使用我现有的 openSSL 版本(64 位)有关。我下载了 32 位版本 from here 并将其安装到 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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:
          .\keytool.exe -exportcert -alias app_android -keystore release.keystore | openssl sha1 -binary | openssl base64
          

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

          【讨论】:

          • 哈希是 28 字符长吗?能说说环境和java版本吗?
          • 是的,Java(TM) SE 运行时环境(内部版本 1.7.0_80-b15)
          • 我认为这个问题与使用 Powershell 而不是命令提示符有关。所以,重新运行命令并不能解决它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-31
          • 1970-01-01
          • 1970-01-01
          • 2014-02-13
          • 2017-01-14
          相关资源
          最近更新 更多