如何创建Android Facebook密钥哈希?

我完全不明白这个过程。我已经能够导航到Java SDK中包含keytool的文件夹。虽然我一直得到错误openssl不识别为内部或外部命令。问题是,即使我能让它工作,我该做什么,然后做什么?

384145 次浏览

以下是你需要做的

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环境变量。然后执行文档中提供的命令。

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

注意,-keystore后面的参数指向调试密钥库。这个位置也取决于您的操作系统。应位于下列地点之一:

  • Windows Vista或Windows 7 - C:\Users\.android\debug.keystore
  • Windows XP - C:\Documents and Settings\.android\ debug.keystore
  • OS X和Linux - ~/.android/debug.keystore

如果所有操作都正确,系统将提示您输入密码。这是调试证书的android。如果密码正确,控制台将输出一个散列(有些随机字符和数字)。

把它复制到你在facebook上的应用程序的首选项中的android key hash字段。要到达那里,请转到developers.facebook.com/apps,选择你的应用程序,转到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上运行:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

Windows操作系统使用:-

keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64

希望这对你有所帮助

参考开发者facebook网站

Windows:

  1. 打开命令提示符并粘贴下面的命令

keytool -exportcert -alias androiddebugkey -keystore % HOMEPATH % .android \调试。Keystore | openssl sha1 -binary | openssl . Keystore | openssl sha1 -binary | openssl . Keystore base64 < / p >

  1. 输入密码:android——>按Enter键

  2. 用你的开发者账号登录Facebook

  3. 去你的Facebook应用程序>设置>粘贴哈希键在“键哈希”选项>保存更改。

  4. 现在用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的数字。

你可以从https://console.developers.google.com/projectselector/apis/credentials
中得到你所有的指纹 然后使用Kotlin代码将其转换为keyhash:

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)这样的东西

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一样

我们使用这种方法来获取Jdk的位置,因为你可能像我一样使用嵌入式Jdk

enter image description here

现在你有了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(或使用命令提示符)。

例子

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

你可以使用这个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的(基于解决方案这里<强> < / >强):

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);
}
}

结果应该以“=”结尾。

从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)
}


}

enter image description here

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!

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

默认密码为“android”

我们大多数人都安装了Git Bash,所以这是我最喜欢的方式。

如果你已经将应用程序上传到Play商店,你可以生成哈希密钥如下:

  1. 进入发布管理在这里

  2. 选择发布管理->应用程序签名

  3. 可以看到SHA1密钥十六进制格式的App签名证书。

  4. 复制十六进制格式的SHA1并将其转换为base64格式,您可以使用 link在没有SHA1:十六进制部分的情况下做到这一点。

  5. 转到Facebook开发者控制台,在设置中添加键(转换为基数64后)>基本→关键的散列。

< p > 这也将帮助新人 < br > < br > 只是在@coder_For_Life22的答案中添加了更多的细节 如果这个答案对你有帮助,别忘了投票。它激励我们

对此,您必须已经知道应用程序的keystore文件的路径和密码 < br > < br > 在这个例子中,假设密钥存储在"c:\keystorekey\new.jks"

1. 打开本页https://code.google.com/archive/p/openssl-for-windows/downloads

2. 下载32位或64位压缩文件,根据您的windows操作系统 3.将下载的文件解压到任何你想要的地方,并记住路径。

4. 对于这个例子,我们认为您已经解压了下载文件夹中的文件夹。

因此文件地址将是“C:\Users\0\Downloads\openssl-0.9.8e_X64\bin\openssl.exe”;

5. 现在在键盘上按windows+r键。

6. 打开运行框。

7. 输入cmd,按Ctrl + Shift + Enter

8. 以管理员身份打开命令提示符

9. 这里导航到java的bin文件夹:

如果你使用Android Studio提供的jre,你会发现路径如下:
A.打开android studio.
B. file->项目结构
c.在左侧窗格中,单击“SDK location”
d.在右边窗格中,“JDK location”下面是您的jre路径 E.在这个路径的末尾添加“\bin”,因为我们需要的文件“keytool.exe”就在这个文件夹里 对于我考虑的这个例子,您已经单独安装了Java,下面是路径
“C: \ Program Files \ Java \ jre-10.0.2 \ bin " < br > 如果你已经安装了32位Java,它将在
"C:\Program Files (x86)\Java\jre-10.0.2\bin"
. 10. 现在对上述路径执行如下命令:

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
  1. 您将被要求输入密码,提供您在创建密钥仓库密钥时所提供的密码 ! ! 这将为您提供键
< p >错误: 如果你得到:
——< br > 'keytool'不能被识别为内部或外部命令
——< br > 这意味着Java被安装在其他地方

你可以简单地使用一行javascript在浏览器控制台转换十六进制映射键到base64。在最新浏览器中打开控制台(F12窗户上,⌥选项+⌘命令+macOS上,Ctrl+⇧转变+SHA-2561上),粘贴代码并替换SHA-2564在SHA-2565下提供的SHA-2562, SHA-2563十六进制映射🡪SHA-2566🡪SHA-2567:

十六进制映射键到Base64键哈希

> 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>

如果你想反转一个键哈希来检查和验证它:

反向Base64键哈希到十六进制映射键

> 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%肯定这个链接会帮助你

只要在你的OnCreateViewOnStart活动中运行这段代码,这个函数返回你开发密钥散列

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 ******************=

如果有人使用openssl有问题,请遵循以下说明:

  1. 下载“Windows版openssl”zip文件
  2. 在您想要的路径中提取zip。
  3. 获取zip中“bin”文件夹的路径

就是这样

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 ""


}