如何使用 Google 应用程序签名为 Sms Retriever 生成 11 个字符的哈希密钥
How to generate 11 char hash key for Sms Retriever with Google App signing
我使用 AppSignatureHelper
class 生成了 11 个字符的散列。但是在将 apk 上传到 play store 之后,它们的哈希不再起作用了。而且我发现 Play 将密钥替换为另一个密钥,这就是哈希值也发生变化的原因。现在我无法获取 11 个字符的哈希键。
我不知道如何使用Google给出的命令。我从
找到这个命令
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 上执行上面的第一个命令,它成功了!
在 the help documents for Google Play App Signing 中有一个部分 "New Apps"。本节中的第 4 步是:
Step 4: Register your app signing key with API providers
If your app uses any API, you will usually need to register the certificate of the key Google signs your app with for authentication purposes. This is usually done through the fingerprint of the certificate.
To find the certificate of the key Google uses to re-sign your APK for delivery:
- Sign in to your Play Console.
- Select an app.
- On the left menu, click Release management > App signing.
- From this page, you can copy the most common fingerprints (MD5, SHA-1 and SHA-256) of your app signing certificate. If the API provider requires a different type of fingerprint, you can also download the original certificate in DER format and run it through the transformation tools that the API provider requires.
下载 DER 格式的原始证书,然后在该证书上使用您的命令。
试试这个
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 的正确路径
默认的 bash 命令对我不起作用,我需要为本地密钥库和 Google Play 证书生成哈希值,我为此编写了自己的 Ruby 脚本: https://github.com/michalbrz/sms-retriever-hash-generator/blob/master/google_play_sign.rb
然后使用 Google 播放签名生成哈希只是:
ruby google_play_sign.rb --package com.your.app --google-play-key deployment_key.der
其中 deployment_key.der
是从 Google 下载的证书,如在 中一样播放。
在引擎盖下,它将 Google Play cert 转换为密钥库,基本上执行其他建议的 bash 命令所做的事情,但将其包装在更易于使用的内容中。
我发现所有这些命令和过程本身有点混乱(我也有 4 个环境和 4 个不同包的项目),所以我所做的是在客户端时将散列包含在来自客户端的有效负载上请求一个 OTP,然后服务器将其保存(信任首次使用)以供在内容管理系统上进行人工审查。
使用此方法未发现任何安全方面
这是完整的分步指南。
- 去玩控制台 -> 打开应用 -> 发布管理 -> 应用签名 -> 下载证书。就像下面的屏幕截图
这会给你 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
如果需要,请使用完整路径
输入此命令后会询问
Trust this certificate? [no]: yes
输入 yes 并点击回车。它将显示消息
Certificate was added to keystore
这将生成一个新文件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
如果需要,请使用完整路径
它会要求输入密码
Enter keystore password: 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
感谢 and Op of this question and above answer from
我知道我回复的很晚了。但是我找到了解决方案。
首先按照上面Manoher Reddy给出的步骤进行。
如果这不起作用,请尝试以下替代解决方案,它适用于我的各种应用程序:
将 Play 商店生成的哈希值提供给后端。为了在 Playstore 上生成哈希密钥,我使用了 AppSignatureHelper class 并为生成的哈希密钥制作了 Toast,并将此构建上传到 Play 商店。成功推出后,我下载了构建。现在 Toast 将显示 playstore 生成的哈希键,将此键提供给后端。它对我来说很好用。
这些步骤在 Mac 大苏尔对我有用:
➜ 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 字符散列键。
我使用 AppSignatureHelper
class 生成了 11 个字符的散列。但是在将 apk 上传到 play store 之后,它们的哈希不再起作用了。而且我发现 Play 将密钥替换为另一个密钥,这就是哈希值也发生变化的原因。现在我无法获取 11 个字符的哈希键。
我不知道如何使用Google给出的命令。我从
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 上执行上面的第一个命令,它成功了!
在 the help documents for Google Play App Signing 中有一个部分 "New Apps"。本节中的第 4 步是:
Step 4: Register your app signing key with API providers If your app uses any API, you will usually need to register the certificate of the key Google signs your app with for authentication purposes. This is usually done through the fingerprint of the certificate.
To find the certificate of the key Google uses to re-sign your APK for delivery:
- Sign in to your Play Console.
- Select an app.
- On the left menu, click Release management > App signing.
- From this page, you can copy the most common fingerprints (MD5, SHA-1 and SHA-256) of your app signing certificate. If the API provider requires a different type of fingerprint, you can also download the original certificate in DER format and run it through the transformation tools that the API provider requires.
下载 DER 格式的原始证书,然后在该证书上使用您的命令。
试试这个
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 的正确路径默认的 bash 命令对我不起作用,我需要为本地密钥库和 Google Play 证书生成哈希值,我为此编写了自己的 Ruby 脚本: https://github.com/michalbrz/sms-retriever-hash-generator/blob/master/google_play_sign.rb
然后使用 Google 播放签名生成哈希只是:
ruby google_play_sign.rb --package com.your.app --google-play-key deployment_key.der
其中 deployment_key.der
是从 Google 下载的证书,如在
在引擎盖下,它将 Google Play cert 转换为密钥库,基本上执行其他建议的 bash 命令所做的事情,但将其包装在更易于使用的内容中。
我发现所有这些命令和过程本身有点混乱(我也有 4 个环境和 4 个不同包的项目),所以我所做的是在客户端时将散列包含在来自客户端的有效负载上请求一个 OTP,然后服务器将其保存(信任首次使用)以供在内容管理系统上进行人工审查。 使用此方法未发现任何安全方面
这是完整的分步指南。
- 去玩控制台 -> 打开应用 -> 发布管理 -> 应用签名 -> 下载证书。就像下面的屏幕截图
这会给你 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
如果需要,请使用完整路径
输入此命令后会询问
Trust this certificate? [no]: yes
输入 yes 并点击回车。它将显示消息
Certificate was added to keystore
这将生成一个新文件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
如果需要,请使用完整路径
它会要求输入密码
Enter keystore password: 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
感谢
我知道我回复的很晚了。但是我找到了解决方案。
首先按照上面Manoher Reddy给出的步骤进行。
如果这不起作用,请尝试以下替代解决方案,它适用于我的各种应用程序:
将 Play 商店生成的哈希值提供给后端。为了在 Playstore 上生成哈希密钥,我使用了 AppSignatureHelper class 并为生成的哈希密钥制作了 Toast,并将此构建上传到 Play 商店。成功推出后,我下载了构建。现在 Toast 将显示 playstore 生成的哈希键,将此键提供给后端。它对我来说很好用。
这些步骤在 Mac 大苏尔对我有用:
➜ 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 字符散列键。