Android-Facebook应用程序的关键哈希
我正在开发一个Android应用程序,我想在其中集成Facebook发布function。 我下载了Facebook-Android SDK,并在那里获得了readme.md(文本文件),其中提到了为Android生成密钥散列。 我如何生成它?
这里是步骤 –
-
从谷歌代码下载openssl(如果你有一个64位的机器,你必须下载openssl-0.9.8e X64不是最新版本)
-
提取它。 在C:/创build一个文件夹 – OpenSSL,并在这里复制提取的代码。
-
检测debug.keystore文件path。 如果你没有find,那么在C:/中进行search,然后在下一步的命令中使用Path。
-
检测您的keytool.exepath,然后转到该命令提示符下的dir /,并以1行方式运行此命令
$ keytool -exportcert -alias androiddebugkey -keystore“C:\ Documents and Settings \ Administrator.android \ debug.keystore”| “C:\ OpenSSL \ bin \ openssl”sha1 -binary |“C:\ OpenSSL \ bin \ openssl”base64
- 它会要求input密码,把android
- 就这样。 你会得到一个密钥哈希
欲了解更多信息请访问
您可以在任何活动中使用此代码。 它会将hashkeylogging在debugging密钥logcat中。 这很容易,比使用SSL更容易一些。
PackageInfo info; try { info = getPackageManager().getPackageInfo("com.you.name", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md; md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String something = new String(Base64.encode(md.digest(), 0)); //String something = new String(Base64.encodeBytes(md.digest())); Log.e("hash key", something); } } catch (NameNotFoundException e1) { Log.e("name not found", e1.toString()); } catch (NoSuchAlgorithmException e) { Log.e("no such an algorithm", e.toString()); } catch (Exception e) { Log.e("exception", e.toString()); }
知道密钥后,可以删除代码;)
我为Windows和Mac OS X创build了一个小工具。只需input密钥存储文件并获取散列键即可。
如果您需要默认的debug.keystore文件,请使用默认的别名和密码。 否则,使用您自己的密钥库文件和值。
检查出来, 下载Windows版本或下载Mac OS X版本 (Dev-Host有时候可能会closures…所以如果链接被破坏,PM我和我会修复它)。
我希望能帮助你们
2014年12月31日 – 编辑:主机更改为AFH。 请让我知道,如果链接被破坏
2013年11月21日 – 编辑:
随着用户请求,我添加了一个默认的密钥库位置和一个捐赠button。 随意使用它,如果我帮你。 🙂
目前Facebook的Android教程中的说明在Windows下无法正常工作。 他们的例子显示了如何pipe道keytool输出到openssl,但如果你在Windows下尝试这个输出是由于某种原因无效。 我发现我不得不使用中间文件才能正常工作。 以下是适合我的步骤:
首先从Google下载适用于Windows的openssl 。
C:\Users\Me>keytool -exportcert -alias my_key -keystore my.keystore -storepass PASSWORD > mycert.bin C:\Users\Me>openssl sha1 -binary mycert.bin > sha1.bin C:\Users\Me>openssl base64 -in sha1.bin -out base64.txt
运行这些命令之后,有效散列存储在文件base64.txt中。 复制并粘贴到您在Facebook上的应用程序设置。
这是在Facebook的官方网页上给出的 :
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
让我把这个命令分解成碎片。
-
找
"keytool.exe"
。 您可以在C:驱动器上search。 你可以在"java jdk"
或"java jre"
find它。 如果您安装了多个版本,请select任意版本。 -
打开一个CMD提示符并转到上面find
"keytool.exe"
目录。剪下“exe”,粘贴上面的Facebook页面上提供的命令。
-
input时出现错误,input输出命令中无法识别OpenSSL。 解决scheme:从OpenSSL下载“Openssl”(如果您有64位的计算机,则必须下载openssl-0.9.8e X64 )。 解压缩并保存在任何地方…我将它保存在
OpenSSl
文件夹中的C:驱动器上 -
在pipe道“|”后面的两个地方,将上面得到OpenSSL错误的命令中的opensslreplace为“C:\ OpenSSL \ bin \ openssl”。
-
如果提示input密码,请input
android
。
你会得到你的哈希键。 有关更多步骤,请再次参阅Facebook页面。
将此代码添加到您的活动的onCreate
,它将在您的logCat中的KeyHash标记下打印散列
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 (NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { }
您可以为您的帐户添加多个哈希键,所以如果您正在运行debugging,不要忘记在发布模式下再次运行 。
要获取Android密钥哈希码,请按照下列步骤操作:
- 在这里下载OpenSSL for Windows
- 现在解压到C盘
- 打开一个CMD提示符
- 键入
cd C:\Program Files\Java\jdk1.6.0_26\bin
- 然后键入
keytool -export -alias myAlias -keystore C:\Users\
你的用户名\.android\myKeyStore | C:\openssl-0.9.8k_WIN32\bin\openssl sha1 -binary | C:\openssl-0.9.8k_WIN32\bin\openssl enc -a -e
\.android\myKeyStore | C:\openssl-0.9.8k_WIN32\bin\openssl sha1 -binary | C:\openssl-0.9.8k_WIN32\bin\openssl enc -a -e
- 完成
我find的最简单的解决scheme是:
- 打开日志猫
- 尝试使用Android SDK访问Facebook
-
在日志中查找如下所示的行:
04-24 01:14:08.605: I/System.out(31395): invalid_key:Android key mismatch. Your key "abcdefgHIJKLMN+OPqrstuvwzyz" does not match the allowed keys specified in your application settings. Check your application settings at http://www.facebook.com/developers
-
复制“abcdefgHIJKLMN + OPqrstuvwzyz”并粘贴到Facebook的Android密钥哈希区域。
对于Linux操作系统和Windows操作系统,我已经这样做了:
Linux的:
- 下载Openssl
- 打开terminal
-
keytool -exportcert -alias **myaliasname** -keystore **/home/comp-1/Desktop/mykeystore.jks** | openssl sha1 -binary | openssl base64
请按照您的要求更改别名和密钥库 。
terminal会要求 密码存储的密码 。 您必须为相同的密钥库 提供密码 。
所以最后你会得到释放哈希键 。
视窗:
释放 哈希键的步骤:
- 下载Openssl(从这里下载),我已经下载了64位操作系统,你可以在这里find更多
- 仅将下载的zip文件解压缩到C:\驱动器
- 打开命令提示符
-
keytool -exportcert -alias **myaliasname** -keystore **"C:\Users\hiren.patel\Desktop\mykeystore.jks"** | "C:\openssl-0.9.8e_X64\bin\openssl.exe" sha1 -binary | "C:\openssl-0.9.8e_X64\bin\openssl.exe" base64
请按照您的要求更改别名和密钥库 。
注意:
请把你的细节放在**之间标记的位置。
terminal会要求 密码存储的密码 。 您必须为相同的密钥库 提供密码 。
所以最后你会得到释放哈希键 。
完成
-
在这里你可以find64位和32位的 Windows下载openSSL
-
提取下载的文件
- 在C驱动器中创build文件夹名称openSSL
- 将所有提取的项目复制到openSSL文件夹(bin,include,lib,openssl.cnf)
- 得到androiddebugging密钥库,默认位置将会是
C:\ Users \用户名\ .android \ debug.keystore
- 现在得到你的命令提示符并粘贴这个代码
keytool -exportcert -alias androiddebugkey -keystore C:\ Users \ username.android \ debug.keystore | “C:\ openSSL \ bin \ openssl”sha1 -binary | “C:\ openSSL \ bin \ openssl”base64
- 按回车键,你将得到28位数的键码
下载openSSL – >安装它– >它通常会安装在C:\ OpenSSL中
然后打开cmd并键入
cd../../Program Files (Enter) java (Enter) dir (Enter) cd jdk1.6.0_17 (varies with jdk versions) (Enter)
要检查jdk版本,请转到C:/ program files / java / jdk_version
cd bin (enter) keytool -exportcert -alias androiddebugkey -keystore C:Users\Shalini\.android\debug.keystore | "C:\OpenSSL\bin\openssl sha1 -binary | "C:\OpenSSL\bin\openssl base64 (Enter)
它会问你的密码这是Android。
1)创build一个密钥来签署你的应用程序,并记住别名。
2)安装OpenSSL。
3)把OpenSSL的bin文件夹放在你的path中。
4)按照FB-Android-SDK 页面上的“设置单一login”中提到的步骤,生成你的哈希密钥。 确保你input了正确的别名和密钥库文件名。
5)在Facebok上创build一个应用程序,在移动设备选项卡下,input这个哈希键。
你需要通过Android的签名应用程序的keytool来创build一个keystore,就像Android站点中描述的过程一样,然后你必须安装cygwin,然后你需要从google代码安装openssl,然后执行下面的命令,你将得到hash键为Android,然后把该哈希键到您创build的Facebook应用程序。 然后,您可以通过Android应用程序访问Facebook应用程序发布墙(“publish_stream”)可能是一个例子。
$ keytool -exportcert -alias alias_name -keystore sample_keystore.keystore | openssl sha1 -binary | openssl base64
你需要从cygwin执行上面的命令。
Facebook开发人员网站上的官方文档:
@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) { }
-
只需打开你的主要活动文件,创build下面提到的function:
try { PackageInfo info = getPackageManager().getPackageInfo( "your.application.package.name", 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 (PackageManager.NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { }
1.1运行你的应用程序,这将为你的应用程序生成一个哈希键。
-
现在,打开日志猫并用“KeyHash”search并复制散列键。
-
你生成哈希键,你可以删除这个function。
keytool -exportcert -alias androiddebugkey -keystore C:\Users\pravin\.android\debug.keystore | "H:\OpenSSL\bin\openssl" sha1 -binary | "H:\OpenSSL\bin\openssl" base64
这对我工作…
脚步:
1) Open command line go to - > java Keytool..... for me C:\Program Files\Java\JDK1.7\bin 2) Download OpenSSL from google 3) paste this with changing your paths - keytool -exportcert -alias androiddebugkey -keystore C:\Users\pravin\.android\debug.keystore | "H:\OpenSSL\bin\openssl" sha1 -binary | "H:\OpenSSL\bin\openssl" base64 .................... give proper debug.keystore path and openSSL path .. 4) Finley it may be ask u password .. so give password -> android ... 5) you will get 28 characters that will be your has key
对于Linux
开放terminal:
对于debugging版本
keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
你会发现从“.android”文件夹debug.keystore复制它并粘贴在桌面上运行上面的命令
用于发布构build
keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64
注意:确保在两种情况下都必须要求input密码。 如果它不要求input密码,那就意味着命令有问题。
要生成释放密钥的散列,请在Mac或Windows上运行以下命令,replace您的释放密钥别名和密钥存储的path。
在Windows上,使用:
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
这个命令应该生成一个28个string。 请记住, 复制和粘贴这个释放密钥哈希到您的Facebook应用程序ID的Android设置。
图片:fbcdn-dragon-a.akamaihd.net/hphotos-ak-xpa1/t39.2178-6/851568_627654437290708_1803108402_n.png
请参考: https : //developers.facebook.com/docs/android/getting-started#release-key-hash和http://note.taable.com
对于Android应用程序
这段代码是用来获取您的Android应用程序中的哈希键用于Facebook集成。 我testing了所有设备,它的工作。 只更改此代码的包名称:
private void facebookHashKey() { try { PackageInfo info = getPackageManager().getPackageInfo("com.app.helpcove", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String hashCode = Base64.encodeToString(md.digest(), Base64.DEFAULT); System.out.println("Print the hashKey for Facebook :"+hashCode); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } }
最简单的解决scheme:
- 不要添加散列键,执行一切
- 当按下facebookloginbutton时,你会看到一个错误:“无效的密钥散列,密钥散列”xxx“与任何存储的密钥都不匹配……”
- 打开Facebook应用程序仪表板并添加散列“xxx =”(来自错误+“=”符号的“xxx”散列)
最好的方法是使用下面的代码:
private void getHashKey(String pkgName) { try { PackageInfo info = getPackageManager().getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String hashKey = Base64.encodeBytes(md.digest()); _hashKey_et.setText(hashKey); Log.i("KeyTool", pkgName + " -> hashKey = " + hashKey); } } catch (NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } }
但是,我感到非常沮丧的事实是,没有简单的工具来生成Facebook应用程序的HashKey。 每次我必须玩Openssl和Keytool或使用代码从签名获取散列…
所以我写了一个简单的KeyGenTool,它可以帮助你: – > Google Play上的KeyGenTool < –
请享用 :)
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import android.os.Bundle; import android.app.Activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.text.Editable; import android.util.Base64; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { Button btn; EditText et; PackageInfo info; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.button1); et=(EditText)findViewById(R.id.editText1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { info = getPackageManager().getPackageInfo("com.example.id", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md; md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String something = new String(Base64.encode(md.digest(), 0)); //String something = new String(Base64.encodeBytes(md.digest())); et.setText("" + something); Log.e("hash key", something); } } catch (NameNotFoundException e1) { Log.e("name not found", e1.toString()); } catch (NoSuchAlgorithmException e) { Log.e("no such an algorithm", e.toString()); } catch (Exception e) { Log.e("exception", e.toString()); } } }); } }
首先,为了在本地计算机上生成密钥哈希值,运行Java的keytool实用程序(应该在您的控制台的path上)对Androiddebugging密钥库。 这是,默认情况下,在你的家.android目录)。
在Ubuntu上,这是在我的电脑中开火
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
我犯了一个小错误,应该记住。 如果你正在使用你的密钥库然后给你的别名,而不是androiddebugkey …
我解决了我的问题。 现在,如果Facebook已经安装在我的设备上,那么我的应用程序也正在获取Facebooklogin集成的数据。 只关心你的散列键。
请参阅下文。
C:\Program Files\Java\jdk1.6.0_45\bin>keytool -exportcert -alias here your alias name -keystore "G:\yourkeystorename.keystore" |"G:\ssl\bin\openssl" sha1 -binary | "G:\ssl\bin\openssl" base64
然后按Enter键 – 它会要求您input密码,然后input您的密钥库密码,而不是Android。
凉。
对于不懂代码的人来说,AivarsDa的谷歌关键工具是我最简单的解决scheme。 只需从中获取散列键并复制到Facebook应用程序设置。 keygen工具上的共享使得我的应用程序在手机上崩溃,所以我只是手动在记事本中input并将其复制到fb。 最后经过这一步,经过几天的挫折
在c盘和openssl文件夹中打开ssl之后,使用这个命令。
keytool -exportcert -alias androiddebugkey -keystore "C:\Users\AJAY SUNDRIYAL.android\debug.keystore" | openssl sha1 -binary | openssl base64
就类似的问题回答 ,我发现这是为我工作:
- 将你想知道散列的
apkname.apk
文件复制到' Java \ jdk1.7.0_79 \ bin '文件夹 - 运行这个命令
keytool -list -printcert -jarfile apkname.apk
- 复制
SHA1
值并使用此站点进行转换 - 使用转换后的Keyhash值( 例如:zaHqo1xcaPv6CmvlWnJk3SaNRIQ = )
- 我应该使用netsh.exe什么appid?
- 当使用hash_map时,在stlstring上使用什么最好的散列algorithm?
- 如何在不编写自己的程序的情况下将某个file upload到Azure blob存储?
- 在另一个cmd.exe提示符下创build一个新的cmd.exe窗口
- 检查Windows服务是否存在并在PowerShell中删除
- 在更改某些非文本字符的字体时,如何使TRichEdit在Windows 7上的行为类似于写字板?
- 在Windows上的Qt可执行文件中设置应用程序信息
- 如何为现有的.exe,.dll设置版本信息?
- 注册comdlg32.dll获取Regsvr32:找不到DllRegisterServer入口点