【问题标题】:Is there any way to get key hash from signed APK?有没有办法从签名的 APK 中获取密钥哈希?
【发布时间】:2013-06-29 17:15:45
【问题描述】:

有没有办法从签名的 APK 中获取密钥哈希? 我们有一个签名的 Android apk 文件,我们想找出这个 APK 的密钥哈希,用于 Facebook SDK。 我们可以通过 jarsigner 之类的方法来做到这一点吗?
有什么建议吗?

【问题讨论】:

  • 尝试检查this答案

标签: android facebook codesign


【解决方案1】:

在 linux 上,我使用此命令从 apk 中获取密钥哈希:

 keytool -list -printcert -jarfile [path_to_your_apk] | grep -Po "(?<=SHA1:) .*" |  xxd -r -p | openssl base64

对于 Mac 用户 (OS X),因为没有 grep -P 支持

keytool -list -printcert -jarfile ~/Downloads/YOURAPKFILE.apk | grep "SHA1: " | cut -d " " -f 3 | xxd -r -p | openssl base64

【讨论】:

  • 感谢您提供具体问题的答案。我需要将现有 APK 的哈希值与新 APK 的哈希值进行比较,以确保它们使用相同的密钥进行签名。从密钥库文件生成哈希,如接受的答案,是不够的。
  • 对于 OSX(不支持 grep -P)。 keytool -list -printcert -jarfile ~/Downloads/YOURAPKFILE.apk | grep "SHA1: " | cut -d " " -f 3 | xxd -r -p | openssl base64
  • @caller9 你的终端命令,keytool -list -printcert -jarfile ~/Downloads/YOURAPKFILE.apk | grep "SHA1: " | cut -d " " -f 3 | xxd -r -p | openssl base64 正是我想要的。谢谢
  • 这个 Hash 是否与我们以编程方式从包管理器获得的 Hash 相同?
  • 你能不能为windows提供命令来从apk中获取key hash?
【解决方案2】:

对于从 openssl 获取密钥的 Windows 用户,有时可能会很棘手。我总是使用它来找到正确的 签名.. 只需将此代码粘贴到您的 onCreate() 中并运行。

 // Add code to print out the key hash
  try {
  PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
  for (Signature signature : info.signatures) {
  MessageDigest md = MessageDigest.getInstance("SHA");
  md.update(signature.toByteArray());
  Log.e("MY KEY HASH:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
      }
  } catch (NameNotFoundException e) {

  } catch (NoSuchAlgorithmException e) {

  }

更新:

使用安卓工作室(2.1.2):

  1. 在工作室打开您的项目,然后点击 gradle 图标。
  2. 选择您的应用 -> 任务 -> android -> SigningReport

这将运行一个 gradle 任务,该任务将使用 md5 和 sha1 密钥打印调试和发布证书

【讨论】:

  • 请注意,包名可以是手机上安装的任何东西,所以你可以编写一个新的应用程序,并使用此方法获取其他应用程序的密钥哈希。
  • 使用 Gradle 4.1,我没有看到发布报告的输出是 Variant: release Config: none,知道为什么吗?
  • @john-salib 我们必须首先设置发布配置。 stackoverflow.com/questions/18460774/…
【解决方案3】:

您可以从here下载openssa

  1. 要生成签名,您需要在您的电脑上安装 openssl。如果你 没有一个从这里下载 openssl
  2. 在 C: 中,创建 openssl 文件夹
  3. 将下载的openssl zip文件的内容解压到openssl C:drive 中的文件夹
  4. 打开命令提示符
  5. 移动到 openssl 的 bin,即命令提示符中的 C:\openssl\bin
  6. 运行以下命令以生成您的密钥哈希。生成时 hashkey 它应该问你密码。

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

注意:在上面的代码中,请注意您需要提供您的用户路径(即在我的情况下它是 C:\Users\Anhsirk,您只需为您的用户更改此路径帐户。

将密码设置为 android。如果它不要求输入密码,则您的密钥库路径不正确。

【讨论】:

    【解决方案4】:

    现在回答为时已晚,但它是获取签名应用密钥哈希的非常快速的方法。

    安装apk,它可以提取所有应用程序的密钥哈希。

    下载地址:https://apkpure.com/key-hash-key/notimeforunch.keyhash

    【讨论】:

    • 永不迟到... ;)
    【解决方案5】:

    当我构建我的 Facebook 应用程序时。我使用了我的 Android 密钥库。有一个哈希函数。常用在 Google API 中。(参见那里的说明)。如果您拥有该应用程序并对其进行了签名;否则这应该没问题..你基本上搞砸了。没有办法。

    【讨论】:

      【解决方案6】:

      您还可以使用以下方法从您的 apk 签名密钥库文件中获取 base64 中的 Sha1 Hash(根据 facebook 的要求):-

      Mac: keytool -exportcert -alias <KEY_STORE_ALIAS> -keystore <KEY_STORE_PATH> | openssl sha1 -binary | openssl base64
       
      Windows: keytool -exportcert -alias <KEY_STORE_ALIAS> -keystore <KEY_STORE_PATH> | openssl sha1 -binary | openssl base64
      

      您还需要为该命令安装 openssl。

      例如:

      keytool.exe -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android | openssl sha1 -binary | openssl base64
      

      其中,"%LocalAppData%\Xamarin\Mono for Android\debug.keystore" 应替换为用于签署 apk 的密钥库文件的路径(在调试或临时分发中)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2013-12-25
        • 2019-02-24
        • 1970-01-01
        相关资源
        最近更新 更多