我完全不明白这个过程。我已经能够导航到Java SDK中包含keytool的文件夹。虽然我一直得到错误openssl不识别为内部或外部命令。问题是,即使我能让它工作,我该做什么,然后做什么?
以下是你需要做的
从Code下载openSSl 提取它。在C:/目录下创建一个名为OpenSSL的文件夹,并将解压后的代码复制到这里
检测调试。Keystore文件路径。如果你没有找到,那么在C:/中进行搜索,并在下一步中使用命令中的Path。
检测您的keytool.exe路径,并进入dir/ in命令提示符,并在一行中运行此命令
$ keytool -exportcert -alias androiddebugkey -keystore "C:\Documents and Settings\Administrator.android\debug.keystore" | "C:\OpenSSL\bin\openssl" sha1 -binary |"C:\OpenSSL\bin\openssl" base64
它会要求输入密码,输入android 这是所有。U将得到一个key-hash
OpenSSL:如果你的操作系统(例如Windows没有预先安装)没有预安装OpenSSL,你必须安装它。如何安装取决于你的操作系统(对于Windows,检查coder_For_Life22提供的链接)。
最简单的方法是将openssl.exe二进制文件复制到您的keytool路径(如果您使用的是Windows)。如果你不想这样做,你必须将它添加到你的PATH环境变量。然后执行文档中提供的命令。
PATH
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
注意,-keystore后面的参数指向调试密钥库。这个位置也取决于您的操作系统。应位于下列地点之一:
-keystore
如果所有操作都正确,系统将提示您输入密码。这是调试证书的android。如果密码正确,控制台将输出一个散列(有些随机字符和数字)。
android
把它复制到你在facebook上的应用程序的首选项中的android key hash字段。要到达那里,请转到developers.facebook.com/apps,选择你的应用程序,转到Edit settings并向下滚动。之后,等待几分钟,直到更改生效。
android key hash
Edit settings
我遇到了完全相同的问题,我没有被要求提供密码,而且似乎我的密钥库文件路径错误。
事实上,如果keytool没有找到您设置的密钥存储库,它将创建一个密钥存储库,并提供错误的密钥,因为它没有使用正确的密钥。
一般的规则是,如果你没有被要求输入密码,那么你生成了错误的密钥。
这就是我如何获得我的:
private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session, SessionState state, Exception exception) { if (exception != null) { new AlertDialog.Builder(FriendActivity.this) .setTitle(R.string.login_failed_dialog_title) .setMessage(exception.getMessage()) .setPositiveButton(R.string.ok_button, null) .show(); }
因此,当您试图在没有密钥的情况下输入时,将会出现异常。Facebook在这个例外中加入了RIGHT键。你所要做的就是复制它。
Linux和Mac
开放式终端:
用于调试构建
keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
你会发现debug.keystore在“。android”文件夹。复制并粘贴到桌面上,然后运行上面的命令。
发布版本
keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64
注意:确保在这两种情况下它都要求密码。如果它不要求输入密码,则意味着命令中有错误。debug.keystore的密码是“android <强> < / >强”,要释放你必须输入密码在创建密钥库期间设置。
为了在你的本地计算机上生成你的密钥散列,运行Java的keytool实用程序(它应该在你的控制台路径上)针对Android调试密钥存储库。默认情况下,在你的home .android目录下)。在OS X上运行:
Windows操作系统使用:-
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
希望这对你有所帮助
参考开发者facebook网站
Windows:
keytool -exportcert -alias androiddebugkey -keystore % HOMEPATH % .android \调试。Keystore | openssl sha1 -binary | openssl . Keystore | openssl sha1 -binary | openssl . Keystore base64 < / p >
输入密码:android——>按Enter键
用你的开发者账号登录Facebook
去你的Facebook应用程序>设置>粘贴哈希键在“键哈希”选项>保存更改。
现在用Facebook登录/分享等测试你的android应用。
请试试这个:
public static void printHashKey(Context pContext) { try { PackageInfo info = pContext.getPackageManager().getPackageInfo(pContext.getPackageName(), PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String hashKey = new String(Base64.encode(md.digest(), 0)); Log.i(TAG, "printHashKey() Hash Key: " + hashKey); } } catch (NoSuchAlgorithmException e) { Log.e(TAG, "printHashKey()", e); } catch (Exception e) { Log.e(TAG, "printHashKey()", e); } }
下载开放ssl:
然后将openssl\bin添加到路径系统变量中:
我的电脑->属性->高级配置->高级->系统变量->系统变量下找到路径,并将此添加到它的结尾: ; yourFullOpenSSLDir \ bin < / p >
现在在你的jdk\bin文件夹C:\Program Files\Java\ jdk1.8.0_40\bin上打开一个命令行(在windows上按住shift并右键单击->打开命令行此处),并使用:
keytool -exportcert -alias keystorealias -keystore C:\yourkeystore\folder\keystore.jks | openssl sha1 -binary | openssl base64
并复制它在给出密码后生成的长度为28的数字。
fun main(args: Array<String>) { listOf("<your_production_sha1_fingerprint>", "<your_debug1_sha1_fingerprint>", "<your_debug2_sha1_fingerprint>") .map { it.split(":") } .map { it.map { it.toInt(16).toByte() }.toByteArray() } .map { String(Base64.getEncoder().encode(it)) } .forEach { println(it) } }
这里是完整的细节(窗口)
1.根据你的系统32位或64位,下载第3位或第4位的< >强OpenSSl < / >强(带e会更好)。
2.解压到C目录下下载的zip文件
3.打开解压的文件夹到bin并复制路径,它应该是类似C:\openssl-0.9.8k_X64\bin\openssl(在end添加\openssl)这样的东西
C:\openssl-0.9.8k_X64\bin\openssl
4.(获取Jdk bin文件夹的路径,如果你知道怎么做,忽略这个)。
打开android studio ~file~Project Structure(ctrl+alt+shift+s),在左侧面板中选择SDK location,复制JDK位置并添加/bin
因此最终的JDK Location将像C:\Program Files\Android\Android Studio\jre\bin一样
C:\Program Files\Android\Android Studio\jre\bin
我们使用这种方法来获取Jdk的位置,因为你可能像我一样使用嵌入式Jdk
现在你有了OpenSSl的位置&JDK的位置
5.现在我们需要调试密钥库的位置,为打开C~>Users~>YourUserName~>。Android应该有一个文件名调试。Keystore,复制路径位置,应该是这样的
C:\Users\Redman\.android\debug.keystore
6.现在打开命令提示符并键入命令
cd YourJDKLocationFromStep4
对我来说
cd "C:\Program Files\Android\Android Studio\jre\bin"
7.现在构造以下命令
keytool -exportcert -alias androiddebugkey -keystore YOURKEYSTORELOCATION | YOUROPENSSLLOCATION sha1 -binary | YOUROPENSSLLOCATION base64
在我的例子中,命令如下所示
keytool -exportcert -alias androiddebugkey -keystore "C:\Users\Redman\.android\debug.keystore" | "C:\openssl-0.9.8k_X64\bin\openssl" sha1 -binary | "C:\openssl-0.9.8k_X64\bin\openssl" base64
现在在命令提示符中输入这个命令,如果你做对了,你会被要求输入密码(密码是android)
Enter keystore password: android
就是这样,你会得到Key Hash,只是复制它并使用它
对于Signed KeyHash,构造以下命令
keytool -exportcert -alias YOUR_ALIAS_FOR_JKS -keystore YOUR_JKS_LOCATION | YOUROPENSSLLOCATION sha1 -binary | YOUROPENSSLLOCATION base64
输入您的密钥库密码,如果您输入错误的密码,它将给出错误的KeyHash
请注意
如果出于某种原因,如果它在某些路径上给出错误,那么将该路径用双引号括起来。此外,Windows power shell对我来说工作不太好,我使用git bash(或使用命令提示符)。
例子
你可以使用这个apk
1.first install the app from the Google play store 2.install the above apk 3.launch the apk and input the package name of your app 4.then you will get the hash code you want
在你的应用程序中运行:
FacebookSdk.sdkInitialize(getApplicationContext()); Log.d("AppLog", "key:" + FacebookSdk.getApplicationSignature(this)+"=");
或:
public static void printHashKey(Context context) { try { final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); for (android.content.pm.Signature signature : info.signatures) { final MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); final String hashKey = new String(Base64.encode(md.digest(), 0)); Log.i("AppLog", "key:" + hashKey + "="); } } catch (Exception e) { Log.e("AppLog", "error:", e); } }
然后看看日志。
结果应该以“=”结尾。
解决方案基于这里<强> < / >强和这里<强> < / >强。
也有一个简单的解决方案。在你的应用中运行这个:
FacebookSdk.sdkInitialize(getApplicationContext()); Log.d("AppLog", "key:" + FacebookSdk.getApplicationSignature(this));
一个较长的不需要FB SDK的(基于解决方案这里<强> < / >强):
从API 26开始,你可以使用下面的代码在芬兰湾的科特林中生成你的散列键,而不需要任何Facebook SDK。
fun generateSSHKey(context: Context){ try { val info = context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_SIGNATURES) for (signature in info.signatures) { val md = MessageDigest.getInstance("SHA") md.update(signature.toByteArray()) val hashKey = String(Base64.getEncoder().encode(md.digest())) Log.i("AppLog", "key:$hashKey=") } } catch (e: Exception) { Log.e("AppLog", "error:", e) } }
https://developers.facebook.com/docs/android/getting-started/
4.19.0 - 2017年1月25日
Facebook SDK
修改
Facebook SDK现在在应用程序启动时自动初始化。在大多数情况下,不再需要手动调用FacebookSDK.sdkInitialize()。更多细节参见升级指南。
为调试
try { PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
试试这个答案
https://stackoverflow.com/a/54513168/9236994 < a href = " https://stackoverflow.com/a/54513168/9236994 " > < / >
用最小的努力就能解决这个问题。
不安装openssl ->使用GIT BASH!
默认密码为“android”
我们大多数人都安装了Git Bash,所以这是我最喜欢的方式。
如果你已经将应用程序上传到Play商店,你可以生成哈希密钥如下:
进入发布管理在这里
选择发布管理->应用程序签名
可以看到SHA1密钥十六进制格式的App签名证书。
转到Facebook开发者控制台,在设置中添加键(转换为基数64后)>基本→关键的散列。
keytool -exportcert -alias androiddebugkey -keystore "c:\keystorekey\new.jks" | "C:\Users\0\Downloads\openssl-0.9.8e_X64\bin\openssl.exe" sha1 -binary |"C:\Users\0\Downloads\openssl-0.9.8e_X64\bin\openssl.exe" base64
你可以简单地使用一行javascript在浏览器控制台转换十六进制映射键到base64。在最新浏览器中打开控制台(F12在窗户上,⌥选项+⌘命令+我在macOS上,Ctrl+⇧转变+我在SHA-2561上),粘贴代码并替换SHA-2564在SHA-2565下提供的SHA-2562, SHA-2563十六进制映射🡪SHA-2566🡪SHA-2567:
SHA-256
> btoa('a7:77:d9:20:c8:01:dd:fa:2c:3b:db:b2:ef:c5:5a:1d:ae:f7:28:6f'.split(':').map(hc => String.fromCharCode(parseInt(hc, 16))).join('')) < "p3fZIMgB3fosO9uy78VaHa73KG8="
你也可以在这里转换;运行下面的代码片段,粘贴十六进制映射键并点击转换按钮:
document.getElementById('convert').addEventListener('click', function() { document.getElementById('result').textContent = btoa( document.getElementById('hex-map').value .split(':') .map(hc => String.fromCharCode(parseInt(hc, 16))) .join('') ); });
<textarea id="hex-map" placeholder="paste hex key map here" style="width: 100%"></textarea> <button id="convert">Convert</button> <p><code id="result"></code></p>
如果你想反转一个键哈希来检查和验证它:
> atob('p3fZIMgB3fosO9uy78VaHa73KG8=').split('').map(c => c.charCodeAt(0).toString(16)).join(':') < "a7:77:d9:20:c8:1:dd:fa:2c:3b:db:b2:ef:c5:5a:1d:ae:f7:28:6f"
document.getElementById('convert').addEventListener('click', function() { document.getElementById('result').textContent = atob(document.getElementById('base64-hash').value) .split('') .map(c => c.charCodeAt(0).toString(16)) .join(':') });
<textarea id="base64-hash" placeholder="paste base64 key hash here" style="width: 100%"></textarea> <button id="convert">Convert</button> <p><code id="result"></code></p>
步骤1-在系统中打开CMD
C:\Program Files\Java\jdk1.6.0_43\bin>
步骤3- keytool -list -v -keystore C:\Users\leon\.android\debug. exeKeystore -alias androiddebugkey -storepass android -keypass android
你得到SHA1值点击此链接你转换你的SHA1值为哈希键
我100%肯定这个链接会帮助你
只要在你的OnCreateView或OnStart活动中运行这段代码,这个函数返回你开发密钥散列。
private String generateKeyHash() { try { PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = (MessageDigest.getInstance("SHA")); md.update(signature.toByteArray()); return new String(Base64.encode(md.digest(), 0)); } }catch (Exception e) { Log.e("exception", e.toString()); } return "key hash not found"; }
简单的方法
通过使用这个网站,你可以通过将SHA1键转换为Facebook的哈希键来获得哈希键。
keytool -exportcert -alias androiddebugkey -keystore "C:\Users**Deepak**.android\debug. keystore "base64 . keystore" | "C:\Users\Deepak\ssl\bin\openssl" sha1 -binary " | "C:\Users\Deepak\ssl\bin\openssl
2上述命令的变化 1.Deepak===替换为您的系统用户名 2.C:\Users\Deepak\ssl===替换您的Open ssl路径
运行此命令并获得如下输出
C:\Users\Deepak>keytool -exportcert -alias androiddebugkey -keystore "C:\Users\D eepak.android \调试。keystore" | "C:\Users\Deepak\ssl\bin\openssl" sha1 -二进制 | "C:\Users\Deepak\ssl\bin\openssl" base64 输入keystore密码:****** ga0RGNY ******************= p >
如果有人使用openssl有问题,请遵循以下说明:
就是这样
https://sourceforge.net/projects/openssl/files/latest/download
我也遇到了同样的问题,下面是我如何解决它的方法
keytool -list -alias androiddebugkey -keystore <project_file\android\app\debug.keystore>
很容易找到你的android项目的sha1
并粘贴在这个网站tomeko
对于get sha1只是
// vscode and my cmd project-name/cd android && ./gradlew signingReport // other project-name/cd android && ./gradlew signingReport
private fun generateKeyHash(): String? {try { val info =packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES) for (signature in info.signatures) { val md: MessageDigest = MessageDigest.getInstance("SHA") md.update(signature.toByteArray()) return String(Base64.encode(md.digest(), 0)) } } catch (e: Exception) { Log.e("exception", e.toString()) } return "key hash not found" }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Add code to print out the key hash try { PackageInfo info = getPackageManager().getPackageInfo( "com.facebook.samples.hellofacebook", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } ...
保存更改并重新运行示例。检查你的logcat输出是否有类似这样的消息:
12-20 10:47:37.747: D/KeyHash:(936): 478uEnKQV+fMQT8Dy4AKvHkYibo=
将密钥哈希保存在开发人员配置文件中。重新运行示例并验证可以成功登录。
请试试这个,它对我有用:
fun Context.generateSignKeyHash(): String { try { val info = packageManager.getPackageInfo( packageName, PackageManager.GET_SIGNATURES ) for (signature in info.signatures) { val md = MessageDigest.getInstance("SHA") md.update(signature.toByteArray()) return Base64.encodeToString(md.digest(), Base64.DEFAULT) } } catch (e: Exception) { Log.e("keyHash", e.message.toString()) } return "" }