如何使用 Google App 签名为 Sms Retriever 生成 11 个字符的哈希密钥

Posted

技术标签:

【中文标题】如何使用 Google App 签名为 Sms Retriever 生成 11 个字符的哈希密钥【英文标题】:How to generate 11 char hash key for Sms Retriever with Google App signing 【发布时间】:2018-12-24 05:37:56 【问题描述】:

我使用 AppSignatureHelper 类生成了 11 个字符的哈希值。但是在将apk上传到Play商店后,它们的哈希值不再起作用了。我发现 Play 用另一个键替换了键,这就是哈希值也被更改的原因。现在我无法获取 11 字符哈希键。

我不知道如何使用 Google 提供的命令。我从here找到这个命令

keytool -exportcert -alias MyandroidKey -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

由于我的应用启用了 Play 应用签名,我将不得不使用此命令,

keytool -exportcert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

我已经用它从 JDK 的 bin 文件夹中的路径替换了 keytool,但后来它说 xxd 未被识别,所以我从一个网站下载它现在它说 tr 无法识别,我猜它我也会对cut 这么说。

如果我问这个问题似乎太菜鸟,请原谅我,但是我该如何解决这个问题?

更新:我在 linux 机器上尝试了上面的第二个命令,该命令有效并给了我 11 个字符的哈希值,但 SMS Retriever 仍然无法正常工作。

解决方案:在 Nick Fortescue 的回答的帮助下,我下载了 DER 格式的文件。然后使用以下命令将其转换为 .jks 文件,

keytool -importcert -alias myalias -file deployment_cert.der -keystore certificate.jks -storepass mypassword

然后在 certificate.jks 上执行上面的第一个命令,它成功了!

【问题讨论】:

如何在 Windows 机器中生成哈希,因为我也面临同样的问题。 xxd, tr, ... 无法识别。 @AnkitKumarSingh 我用的是 Linux。我不知道如何在 Windows 上做到这一点。 @AnkitKumarSingh 您可以使用 bash 终端在 Windows 上执行该命令。 有人可以解释一下我需要用我的密钥库替换 MyProductionKeys.keystore 还是它是命令的一部分 @HemendraKhatik 用你自己的密钥库替换它 【参考方案1】:

这些步骤在 Mac big sur 上对我有用:

➜ keytool -importcert -alias my-upload-key-alias -file deployment_cert.der -keystore certificate.jks -storepass notARealPassword

...

Trust this certificate? [no]:  yes
Certificate was added to keystore

➜ keytool -exportcert -alias my-upload-key-alias -keystore certificate.jks | xxd -p | tr -d "[:space:]" | xargs echo -n com.myapp | shasum -a 256 | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
Enter keystore password: notARealPassword
6bAhwera2r5

6bAhwera2r5 是输出的 11 字符哈希键。

【讨论】:

【参考方案2】:

我知道我很晚才回复。但我得到了解决方案。

首先按照上面 Manoher Reddy 给出的步骤进行操作。

如果这不起作用,请尝试以下替代解决方案,它适用于各种应用程序:

将 Play 商店生成的哈希提供给后端。为了在 Playstore 上生成哈希键,我使用了 AppSignatureHelper 类并为生成的哈希键制作 Toast 并将此构建上传到 Play 商店。成功推出后,我已经下载了构建。现在 Toast 将显示 playstore 生成的哈希键,将此键提供给后端。它对我来说很好用。

【讨论】:

是的,不幸的是,我的日志已启用,并且使用 Play Store apk 打印了新密钥(带有 appSignatureHelper calss),并且运行良好【参考方案3】:

这是完整的分步指南。

    进入游戏控制台 -> 打开应用 -> 发布管理 -> 应用签名 -> 下载证书。如下图所示

这会给你deployment_cert.der文件

    deployment_cert.der 文件转换为 .jks 文件

使用下面的命令

keytool -importcert -alias YOUR_ALIAS -file deployment_cert.der -keystore certificate.jks -storepass YOUR_PASSWORD

将 YOUR_ALIAS,YOUR_PASSWORD 替换为您在 keystore 中使用的。如果需要,请使用完整路径代替 deployment_cert.der

输入此命令后会询问

信任此证书? [否]:是的

键入 yes 并单击 enter 。它会显示消息

证书已添加到密钥库

这将生成一个新文件certificate.jks

    现在在终端输入命令

    keytool -exportcert -alias YOUR_ALIAS -keystore certificate.jks | xxd -p | tr -d "[:space:]" | echo -n YOUR_PACKAGE `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

将 YOUR_ALIAS,YOUR_PACKAGE 替换为您在 keystore,project 中使用的。如果需要,请使用完整路径代替 certificate.jks

它会要求输入密码

输入密钥库密码:mypassword

输入您的密码,您将获得哈希值。

编辑 MacOS 用户:

如果您使用的是 MacOS,您可以通过安装 coreutils 来安装 sha256sum,如下所示:

brew install coreutils

或者你可以像这样使用shasum -a 256 而不是sha256sum

keytool -exportcert -alias YOUR_ALIAS -keystore certificate.jks | xxd -p | tr -d "[:space:]" | echo -n YOUR_PACKAGE `cat` | shasum -a 256 | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

感谢Abhinav Gupta 和此问题的操作Farhan Farooqui 及以上来自Nick Fortescue 的答案

【讨论】:

完美解决方案,有效!!谢谢。我必须阅读大量应用程序的签名过程才能理解它。 您好,我收到以下错误,keytool 错误:java.lang.Exception:回复中的公钥和密钥库不匹配 在mac中输入密码后没有生成哈希字符串 我按照所有步骤操作并获得了哈希键。我将哈希键添加到我的 SMS 中。但是,它仍然不适用于 Play 商店 apk。 for mac 如果 cat > 不起作用,用 替换【参考方案4】:

我发现所有这些命令和过程本身有点混乱(我也有具有 4 个环境和 4 个不同包的项目),所以我所做的是在客户端请求时在来自客户端的有效负载中包含哈希值OTP,然后服务器将其保存(首次使用时信任)以在内容管理系统上进行手动审查。 使用此方法未发现任何安全方面

【讨论】:

【参考方案5】:

由于默认的 bash 命令对我不起作用,我需要为本地密钥库和 Google Play 证书生成哈希,我为此编写了自己的 Ruby 脚本:https://github.com/michalbrz/sms-retriever-hash-generator/blob/master/google_play_sign.rb

那么使用 Google Play 签名生成哈希就是:

ruby google_play_sign.rb --package com.your.app --google-play-key deployment_key.der

其中deployment_key.der 是从Google Play 下载的证书,如Nick's response。

在底层,它将 Google Play 证书转换为密钥库,基本上完成了其他建议的 bash 命令所做的事情,但将其包装在更易于使用的东西中。

【讨论】:

我正在执行您的命令,一些建议为什么我无法获得哈希: ruby​​ google_play_sign.rb --package com.xxxx.xxxx --google-play-key deployment_key.der回溯(最近一次通话最后一次):2:来自 google_play_sign.rb:86:in <main>' 1: from google_play_sign.rb:59:in der_to_keystore' google_play_sign.rb:59:in ``':没有这样的文件或目录 - keytool -importcert -alias myalias -file deployment_key。 der -keystore gp_imported_keystore_temp.jks -storepass mypassword -noprompt (Errno::ENOENT) @S.P.简单的解释是您的deployment_key.der 不存在。你确定你在那里放了正确的路径吗?如果您确定,您可以检查命令 keytool -importcert -alias myalias -file DER_FILE_PATH -keystore gp_imported_keystore_temp.jks -storepass pwd -noprompt 是否适合您 - 当然您应该将 DER_FILE_PATH 替换为真实路径。【参考方案6】:

试试这个

C:\Program Files\Java\jdk1.8.0_25\bin> keytool -exportcert -alias *Alias -keystore *keystorePath | C:\OpenSSL\bin\openssl.exe sha1 -binary | C:\OpenSSL\bin\openssl.exe base64

将 *Alias 替换为您的别名,将 *keystorePath 替换为您的 kestore 位置。如果将 openssl.exe 安装到另一个目录,也要放置正确的路径

【讨论】:

【参考方案7】:

在the help documents for Google Play App Signing 中有一个“新应用程序”部分。本节的第 4 步是:

第 4 步:向 API 提供商注册您的应用签名密钥 如果您的应用程序使用任何 API,您通常需要注册 Google 为您的应用程序签名的密钥证书以进行身份​​验证。这通常通过证书的指纹来完成。

要查找 Google 用于重新签署您的 APK 以进行交付的密钥证书:

    登录您的 Play 管理中心。
      选择一个应用程序。 在左侧菜单中,点击发布管理 > 应用签名。 在此页面中,您可以复制应用签名证书的最常见指纹(MD5、SHA-1 和 SHA-256)。如果 API 提供者需要不同类型的指纹,您也可以下载 DER 格式的原始证书,并通过 API 提供者需要的转换工具运行它。

下载 DER 格式的原始证书,然后在该证书上使用您的命令。

【讨论】:

您好,感谢您的回复。我找到了 DER 格式的文件,现在我只需要在命令中将MyProductionKeys.keystore 替换为 DER 文件的路径? 我之前使用过 SHA-256 并试图获取 11 char Hash,但这也不起作用,SMS Retriever 无法检测到它 我收到以下错误:keytool 错误:java.lang.Exception:回复中的公钥和密钥库不匹配 keytool -exportcert -alias MyAndroidKey -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11` 此命令需要 Play 提供的 DER 文件未提供的别名。 使用您在主密钥库文件中使用的别名

以上是关于如何使用 Google App 签名为 Sms Retriever 生成 11 个字符的哈希密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Google App Engine 上出现“ImportError:没有名为 oauth2client.client 的模块”?

android 4.4(KitKat)上,如何开发SMS功能的APP

如何在Google App Engine上防止“ImportError:没有名为oauth2client.client的模块”?

如何签入用户已在 Google recaptcha 中选中复选框的 js?

Google App Engine - ModuleNotFoundError:没有名为“dlib”的模块

Google App Engine - Python 3 - ModuleNotFoundError:没有名为“pytz”的模块