我使用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 App签名,我将不得不使用此命令,
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上执行了上面的第一个命令,它工作了!
这是完整的分步指南。
这将给你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替换为您在密钥库中使用的内容。如果需要,使用完整路径代替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,可以通过安装如下的coreutil来安装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
在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格式下载原始证书,然后在该证书上使用您的命令。
由于默认的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命令,但将其包含在更易于使用的内容中。
试试这个
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
用你的别名替换*别名,用你的kestore位置替换* keystorePath。如果将openssl.exe安装到另一个目录,也将其放入正确的路径
我发现所有这些命令和进程本身有点乱(我还有4个环境有4个不同包的项目),所以我做的是在客户端请求OTP时从客户端包含有效负载的哈希值,然后服务器将其保存(首次使用时信任),以便在内容管理系统上进行手动审核。使用此方法未找到任何安全方面