Java 如何创建Android Facebook密钥哈希?

Java 如何创建Android Facebook密钥哈希?,java,android,facebook,Java,Android,Facebook,我完全不理解这个过程。我已经能够导航到JavaSDK中包含keytool的文件夹。尽管我不断收到错误,但openssl未被识别为内部或外部命令。问题是,即使我可以让它工作,我会做什么,以及之后做什么?以下是您需要做的- 从下载openSSl 把它取出来。创建一个文件夹-OpenSSL in C://并将提取的代码复制到此处 检测debug.keystore文件路径。如果未找到,则在C:/中进行搜索,并在下一步中使用命令中的路径 检测keytool.exe路径并转到该dir/in命令提示符,然后在

我完全不理解这个过程。我已经能够导航到JavaSDK中包含keytool的文件夹。尽管我不断收到错误,但openssl未被识别为内部或外部命令。问题是,即使我可以让它工作,我会做什么,以及之后做什么?

以下是您需要做的-

从下载openSSl 把它取出来。创建一个文件夹-OpenSSL in C://并将提取的代码复制到此处

检测debug.keystore文件路径。如果未找到,则在C:/中进行搜索,并在下一步中使用命令中的路径

检测keytool.exe路径并转到该dir/in命令提示符,然后在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
它将要求输入密码,并将
这就是全部。您将获得一个密钥散列

OpenSSL:如果您的操作系统没有预装该密钥,则必须安装该密钥散列(例如,Windows没有预装该密钥)。如何安装取决于您的操作系统(对于Windows,请查看coder\u提供的\u Life22)

如果您在Windows上,最简单的方法就是将openssl.exe二进制文件复制到您的keytool路径。如果不想这样做,则必须将其添加到
PATH
环境变量中。然后执行文档中提供的命令

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
请注意,
-keystore
后面的参数指向调试密钥库。此位置还取决于您的操作系统。应位于以下位置之一:

  • Windows Vista或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
字段中。要到达那里,请转到,选择你的应用程序,转到编辑设置,然后向下滚动。之后,等待几分钟,直到更改生效。

我遇到了同样的问题,没有人要求我输入密码,而且似乎密钥库文件的路径错误

事实上,如果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在这个异常中输入了正确的密钥。你所需要做的就是复制它

适用于Linux和Mac的

开放式终端:

用于调试生成

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64
您将在“.android”文件夹中找到debug.keystore
。复制并粘贴到桌面上,然后运行上述命令

发布版本

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64
keytool-exportcert-alias-keystore | openssl sha1-binary | openssl base64

注意:确保在这两种情况下都需要密码。如果它不要求输入密码,则表示命令中有错误。debug.keystore的密码是“android”,发布时,您必须输入在创建keystore

期间设置的密码。要在本地计算机上生成密钥散列,请针对android debug keystore运行Java的keytool实用程序(应位于控制台路径上)。默认情况下,这在您的home.android目录中)。在OS X上,运行:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
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";
}
在Windows上,使用:-

keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
希望这对你有帮助


Ref-开发者facebook站点

适用于Windows:

  • 打开命令提示符并粘贴到命令下方

  • keytool-exportcert-alias androiddebugkey-keystore %HOMEPATH%.android\debug.keystore | openssl sha1-二进制| openssl base64

  • 输入密码:安卓-->点击回车键

  • 复制生成的哈希键-->使用开发者帐户登录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);
            }
        }
    
    :

    然后将openssl\bin添加到路径系统变量:

    我的电脑->属性->高级配置->高级->系统变量->在系统变量下查找路径,并将其添加到其结尾: ;yourFullOpenSSLDir\bin

    现在在jdk\bin文件夹C:\Program Files\Java\jdk1.8.0\U 40\bin上打开一个命令行(在windows上按住shift键并右键单击->此处打开命令行),然后使用:


    并复制它在给出密码后生成的28个长度的数字。

    您可以从
    并使用此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) }
    }
    
    fun main(args:Array){
    列表(“”,
    "",
    "")
    .map{it.split(“:”)}
    .map{it.map{it.toInt(16.toByte()}.toByteArray()}
    .map{String(Base64.getEncoder().encode(it))}
    .forEach{println(it)}
    }
    
    以下是完整的详细信息(适用于Windows)

    1。根据您的系统32位或64位,下载第三或第四版本(使用e会更好)

    2.在C目录中解压缩下载的zip文件

    3.将提取的文件夹打开到bin并复制路径,路径应该类似于
    C:\openssl-0.9.8k_X64\bin\openssl
    (在末尾添加\openssl)

    4.(获取Jdk的bin文件夹的路径,如果您知道如何获取,请忽略此项)

    打开android studio~file~项目结构(ctrl+alt+shift+s),在左侧面板中选择SDK位置,复制JDK位置
    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
    
    Enter keystore password:  android
    
    keytool -exportcert -alias YOUR_ALIAS_FOR_JKS -keystore YOUR_JKS_LOCATION | 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
    
    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));
    
    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);
        }
    }
    
    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)
        }
    
    }
    
    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();
    }
    
    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
    
    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";
    }
    
    keytool -list -alias androiddebugkey -keystore <project_file\android\app\debug.keystore>
    
    // 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) {
            
        }
        
        ...