簡體   English   中英

Android-Facebook 應用程序的密鑰哈希

[英]Key hash for Android-Facebook app

我正在開發一個 Android 應用程序,我想在其中集成 Facebook 發布功能。 我下載了 Facebook-Android SDK,並在其中獲得了 readme.md(文本文件),其中提到了為 Android 生成密鑰哈希。 我如何生成它?

以下是步驟-

  1. Google 代碼下載 openssl(如果您有 64 位機器,則必須下載 openssl-0.9.8e X64不是最新版本)

  2. 提取它。 在 C:/ 中創建一個文件夾 - OpenSSL 並在此處復制提取的代碼。

  3. 檢測 debug.keystore 文件路徑。 如果您沒有找到,則在 C:/ 中進行搜索,並在下一步中使用命令中的路徑。

  4. 檢測您的 keytool.exe 路徑並在命令提示符中轉到該 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

    • 它會要求輸入密碼,輸入android
    • 就這樣。 你會得到一個密鑰哈希

欲了解更多信息,請訪問這里

[編輯 2020]-> 現在我完全推薦這里的答案,使用 android studio 更容易,速度更快,無需編寫任何代碼 - 下面的代碼回到了日食時代:) -。

您可以在任何活動中使用此代碼。 它將在 logcat 中記錄 hashkey,這是調試鍵。 這很容易,而且比使用 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 創建了一個小工具。只需放入密鑰存儲文件,並獲取哈希密鑰。

如果您想要默認的 debug.keystore 文件,請使用默認別名和密碼。 否則,請使用您自己的密鑰庫文件和值。

檢查一下,下載 Windows 版本下載 Mac OS X 版本(Dev-Host 有時可能會關閉......所以如果鏈接斷開,請 PM 我,我會修復它)。

我希望對你們有幫助...

2014 年 12 月 31 日 - 編輯:將主機更改為 AFH。 請讓我知道鏈接是否損壞

2013 年 11 月 21 日 - 編輯:

根據用戶的要求,我添加了一個默認的密鑰庫位置和一個DONATE 按鈕。 如果我幫助了你,請隨意使用它 :)

截屏屏幕截圖 2

目前Facebook 的 Android 教程中的說明在Windows下效果不佳。 他們的示例顯示了如何將 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

讓我把這個命令分解成片段。

  1. 尋找"keytool.exe" 您可以在 C: 驅動器上搜索。 您可以在"java jdk""java jre"中找到它。 如果您安裝了多個版本,請選擇任何一個。

  2. 打開 CMD 提示符並轉到上面找到"keytool.exe"的目錄。

    剪輯“exe`”並粘貼Facebook頁面上提供的上述命令。

  3. 輸入此內容時您將收到一個錯誤,即 OpenSSL 在輸入輸出命令中未被識別。 解決方案:從OpenSSL下載“Openssl”(如果您有 64 位機器,則必須下載 openssl-0.9.8e X64 )。 解壓並保存在任何地方...我將它保存在 C: 驅動器的OpenSSl文件夾中

  4. 將上述命令中的 openssl 替換為“C:\OpenSSL\bin\openssl”在管道“|”之后的兩個位置出現 OpenSSL 錯誤。

  5. 如果提示輸入密碼,請輸入android

你會得到你的哈希鍵。 有關進一步的步驟,請再次參閱 Facebook 頁面。

您可以從 SHA-1 密鑰獲取密鑰哈希。 它非常簡單,您需要從 Play 商店獲取您的 SHA-1(簽名 APK)密鑰,檢查下圖。 在此處輸入圖像描述

現在復制該 SHA-1 密鑰並將其粘貼到此網站http://tomeko.net中,同時檢查下圖以獲取您的密鑰哈希。

在此處輸入圖像描述

將此代碼添加到您的活動的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) {

}

您可以為您的帳戶添加多個哈希鍵,因此如果您一直在調試中運行,請不要忘記在發布模式下再次運行它

要獲取 Android 密鑰哈希碼,請執行以下步驟:

  1. 在此處下載適用於 Windows 的 OpenSSL
  2. 現在解壓到C盤
  3. 打開 CMD 提示符
  4. 鍵入cd C:\Program Files\Java\jdk1.6.0_26\bin
  5. 然后只鍵入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
  6. 完畢

我發現的最簡單的解決方案是:

  • 打開原木貓
  • 嘗試使用 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 Key Hash 區域。

我已經通過這種方式為Linux OS & Windows OS完成了:

Linux:

  • 下載 OpenSSL
  • 打開終端
  • keytool -exportcert -alias **myaliasname** -keystore **/home/comp-1/Desktop/mykeystore.jks** | openssl sha1 -binary | openssl base64

請根據您的要求使用其路徑更改別名名稱密鑰庫

終端會要求輸入密鑰庫的密碼 您必須為相同的Keystore提供密碼

所以最后你會得到Release Hashkey

視窗:

釋放哈希鍵的步驟:

  • 下載 Openssl(從這里下載),我已經下載了64 位操作系統,你可以在這里找到更多
  • 僅將下載的 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

請根據您的要求使用其路徑更改別名名稱密鑰庫

筆記:

請將您的詳細信息放在我在 ** ** 之間標記的位置。

終端會要求輸入密鑰庫的密碼 您必須為相同的Keystore提供密碼

所以最后你會得到Release Hashkey

完畢

  • 在此處下載適用於 Windows 的 openSSL,您可以在此處找到 64 位和 32 位

  • 解壓下載的文件

  • 在 C 盤創建文件夾名稱 openSSL
  • 將所有提取的項目復制到 openSSL 文件夾(bin、include、lib、openssl.cnf)
  • 獲取 android 調試密鑰庫,默認位置為

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. 只需打開您的主活動文件並創建以下提及的功能:

     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 運行你的應用程序,這將為你的應用程序生成一個哈希鍵。

  1. 現在,打開 log cat 並使用“KeyHash”搜索並復制哈希鍵。

  2. 生成哈希鍵后,您可以刪除此功能。

您需要通過keytool為Android簽名應用程序創建一個密鑰庫,如Android站點中描述的過程,然后您必須安裝cygwin,然后您需要從google代碼安裝openssl,然后只需執行以下命令,您將獲得哈希android 的密鑰,然后將該哈希密鑰放入您創建的 facebook 應用程序中。 然后您可以通過 Android 應用程序訪問 facebook 應用程序以發布牆(“publish_stream”)就是一個例子。

$ keytool -exportcert -alias alias_name -keystore sample_keystore.keystore | openssl sha1 -二進制 | 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) {

    }

對於 Android 應用程序

此代碼用於在您的 Android 應用程序中獲取用於 Facebook 集成的哈希鍵。 我已經測試了所有設備並且它正在工作。 僅更改此代碼的包名稱:

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

    }
}

1) 創建一個密鑰來簽署您的應用程序,並記住別名。

2) 安裝 OpenSSL。

3)將OpenSSL的bin文件夾放在你的路徑中。

4) 按照 FB-Android-SDK頁面上“設置單點登錄”中提到的步驟,生成您的哈希密鑰。 確保輸入正確的別名和密鑰庫文件名。

5) 在 Facebok 上創建一個應用程序,並在移動設備選項卡下,輸入此哈希鍵。

有兩種方法可用,一種是復雜的,一種簡單的

方法一:(小復雜)

首先你必須相應地下載64bit32bitssl ,記住在版本代碼openssl-0.9.8e_X64.zipopenssl-0.9.8e_WIN32.zip后下載名稱包含e的文件,而不是版本代碼后的k

並放在 AndroidStudio/jre/bin 目錄下,如果你不知道放在哪里,你可以通過右鍵單擊 android studio 快捷方式找到這個目錄:

在此處輸入圖像描述

現在您已經在一個地方管理了兩個必需的東西,但是您仍然必須找到debug.keystore的路徑,該路徑始終可以在"C:\Users\yourusernamehere\.android\debug.keystore"中找到,

注意如果您的應用程序已經發布或即將發布,則使用您的發布簽名密鑰庫,當且僅當您在開發模式下進行測試時才可以使用 debug,keysotre

一切都設置好后,讓我們安排您想要執行的命令以生成base64 format的哈希密鑰,您的命令將如下所示

keytool.exe -exportcert -alias androiddebugkey -keystore "C:\Users\ayyaz talat\.android\debug.keystore" | "D:\Program Files\Android\Android Studio\jre\bin\openssl\bin\openssl.exe" sha1 -binary |"D:\Program Files\Android\Android Studio\jre\bin\openssl\bin\openssl.exe" base64

它會提示您輸入 debug.keystore 的密碼,默認為 android。 如果您使用自己的密鑰,那么密碼也將是您的。 如果一切順利,輸出將如下所示,希望對您有所幫助

在此處輸入圖像描述

第二種方法(分別是簡單的一種)

如果您不想完成上述所有過程,則只需使用以下方法記錄haskey:

 private void printKeyHash() {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA1");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.e("KeyHash:", e.toString());
        } catch (NoSuchAlgorithmException e) {
            Log.e("KeyHash:", e.toString());
        }
    }

輸出:

在此處輸入圖像描述

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

打開終端:

用於調試構建

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

你會從“.android”文件夾中找到debug.keystore復制它並粘貼到桌面上並運行上面的命令

對於發布構建

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

注意:確保在這兩種情況下都必須要求輸入密碼。 如果它不要求輸入密碼,則意味着命令有問題。

正如在類似問題上的回答,我發現這對我有用:

  • 將您想知道哈希的apkname.apk文件復制到“ Java\jdk1.7.0_79\bin ”文件夾
  • 運行此命令keytool -list -printcert -jarfile apkname.apk
  • 復制SHA1值並使用此站點進行轉換
  • 使用轉換后的 Keyhash 值(例如 zaHqo1xcaPv6CmvlWnJk3SaNRIQ=

最簡單的解決方案:

  1. 不要添加哈希鍵,實現其他所有內容
  2. 按下 facebook 登錄時,您將收到一條錯誤消息“無效的密鑰哈希。密鑰哈希“xxx”與任何存儲的密鑰不匹配。...”
  3. 打開 facebook 應用程序儀表板並添加哈希“xxx=”(錯誤中的“xxx”哈希+“=”符號)

要生成發布密鑰的哈希,請在 Mac 或 Windows 上運行以下命令,替換您的發布密鑰別名和密鑰庫的路徑。

在 Windows 上,使用:

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

此命令應生成 28 個字符的字符串。 請記住,將此 Release Key Hash復制粘貼到您的 Facebook App 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

將此用於 kotlin 中的打印鍵哈希

try {
        val info = context.getPackageManager().getPackageInfo(context.packageName,
                PackageManager.GET_SIGNATURES);
        for (signature in info.signatures) {
            val md = MessageDigest.getInstance("SHA")
            md.update(signature.toByteArray())
            Log.d("Key hash ", android.util.Base64.encodeToString(md.digest(), android.util.Base64.DEFAULT))
        }
    }catch (e:Exception){

    }

在 Android Studio 中也解決了我的問題,但方法略有不同。

在 Android Studio 中獲取 SHA-1 值。

  1. 單擊 Gradle
  2. 點擊簽名報告
  3. 復制 SHA-1

單擊Android工作室中的標記面板

  1. SHA-1 值如下所示 CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84

    並打開http://tomeko.net/online_tools/hex_to_base64.php將您的 SHA1 值轉換為 base64。 這就是 Facebook 需要獲取生成的哈希“ ********************= ”並將密鑰哈希復制到 facebook 應用程序控制台的內容。

這個答案的一部分取自這里Github Link

在 Android Studio 中,只需單擊右側邊欄面板“Gradle”以顯示 gardel 面板然后:-YOURAPPNAME --Task ---Android ----(雙擊)signingReport(啟動 Gradle Daemon)

然后你會看到結果:

Config: debug
Store: C:\Users\username\.android\debug.keystore
Alias: AndroidDebugKey
MD5: C8:46:01:EA:36:02:D1:21:1B:23:19:91:D4:32:CB:AC
SHA1: 38:AB:4C:01:01:D7:62:E0:61:D1:9F:52:04:0C:E5:07:4E:E4:9B:39
SHA-256: 1B:8C:DC:35:48:10:01:2C:1F:BD:01:64:F1:01:06:01:60:01:A6:8B:10:15:2E:BF:7B:C4:FD:38:4C:C1:74:01
Valid until: Saturday, February 12, 2050

復制 SHA1:

38:AB:4C:01:01:D7:62:E0:68:D1:9F:52:04:0C:E5:07:4E:E4:9B:39

轉到此

粘貼 SHA1 並生成您的 Facebook 密鑰哈希碼。

我犯了一個小錯誤,應該牢記在心。 如果您使用的是您的密鑰庫,請提供您的別名,而不是 androiddebugkey ...

我解決了我的問題。 現在,如果我的設備中安裝了 Facebook,那么我的應用程序仍在獲取 Facebook 登錄集成的數據。 只關心你的哈希鍵。

請看下文。

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 - 它會要求您輸入密碼,然后輸入您的密鑰庫密碼,而不是 Android。

涼爽的。

最好的方法是使用以下代碼:

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

享受 :)

這是 Xamarin 版本


private void printKeyHash()
{
    try
    {
        PackageInfo info = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.Signatures);
        foreach (var signature in info.Signatures)
        {
            MessageDigest md = MessageDigest.GetInstance("SHA1");
            md.Update(signature.ToByteArray());
            var hash = Base64.EncodeToString(md.Digest(), Base64Flags.Default);
            Log.Debug("KeyHash:", hash);
        }
    }
    catch (PackageManager.NameNotFoundException e)
    {

    }
    catch (NoSuchAlgorithmException e)
    {

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



}

Kotlin 代碼獲取哈希鍵

 private fun logHashKey() {
    try {
        val info = getPackageManager().getPackageInfo("your.package.name", PackageManager.GET_SIGNING_CERTIFICATES);
        for (signature in info.signingInfo.signingCertificateHistory) {

            val md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            val something = Base64.getEncoder().encodeToString(md.digest());
            Log.e("hash key", something);
        }
    } catch (e1: PackageManager.NameNotFoundException) {
        Log.e("name not found", e1.toString());
    } catch (e: NoSuchAlgorithmException) {
        Log.e("no such an algorithm", e.toString());
    } catch (e: Exception) {
        Log.e("exception", e.toString());
    }
}

請不要忘記在調試和發布環境中生成密鑰,因為它們會根據構建設置進行更改。

嘗試這個 :

  • 兩種獲取哈希鍵值的方法

1)使用命令行獲取哈希鍵(官方文檔: https ://developers.facebook.com/docs/android/getting-started)

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

或者

2)使用代碼獲取哈希鍵

  @Override
   protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

            //Hask Kay generation 
             GetKeyHase();
    }

    private void GetKeyHase() {
            try {
                PackageInfo info = getPackageManager().getPackageInfo("ADD YOUR PACKAGE NAME", PackageManager.GET_SIGNATURES);
                for (Signature signature : info.signatures) {
                    MessageDigest md = (MessageDigest.getInstance("SHA"));
                    md.update(signature.toByteArray());
                    String hashkey_value = new String(Base64.encode(md.digest(), 0));
                    Log.e("hash key", hashkey_value);
                    //check you logcat hash key value
                }
            }catch (Exception e) {
                Log.e("exception", e.toString());
            }
        }

我只是為此目的制作了一個工具,即https://keyhash.vaibhavpandey.com/ 它比其他任何東西都簡單,因為它需要您瀏覽計算機上的密鑰庫並輸入密碼以分別為 Google 和 Facebook 生成SHA-1 HexBase64版本。

不要擔心密鑰庫或密碼短語,因為這項工作完全在瀏覽器中完成,您可以在https://github.com/vaibhavpandeyvpz/keyhash檢查網絡選項卡並且該工具也是開源的。

This required no coding input. Go to Android Studio-> 
Click on Right side panel "Gradle"=>
*Your App Name =>
*Your App Name(root)=>
*Tasks=>
*android =>
*Double click on **signinReport**=>
Will get 
example :
SHA1: [![6A:DE:ED:5A:9F:0B:19:47:38:DC:DE:3B:7B:A2:D7:4C:6C:0A:24:70][1]][1]

Go to 

http://fbkeyhash.com/index.php
Paste your SHA-1

您可以從 Java/Kotlin Activity 打印哈希鍵。 部分代碼已棄用,但這是包含新舊代碼的完整解決方案。

private fun printHashKey(context: Context) {
    try {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            val packageInfo: PackageInfo = context.packageManager.getPackageInfo(
                context.packageName,
                PackageManager.GET_SIGNING_CERTIFICATES
            )

            for (signature in packageInfo.signingInfo.apkContentsSigners) {
                val md = MessageDigest.getInstance("SHA")
                md.update(signature.toByteArray())
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT))
            }
        } else {
            val packageInfo: PackageInfo = context.packageManager.getPackageInfo(
                context.packageName,
                PackageManager.GET_SIGNATURES
            )

            for (signature in packageInfo.signatures) {
                val md = MessageDigest.getInstance("SHA")
                md.update(signature.toByteArray())
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT))
            }
        }

    } catch (e: PackageManager.NameNotFoundException) {
        Log.d(TAG, "printHashKey: PackageManager.NameNotFoundException -> $e")
    } catch (e: NoSuchAlgorithmException) {
        Log.d(TAG, "printHashKey: NoSuchAlgorithmException -> $e")
    }
}

這是對我有用的方法以及我所做的一些觀察:

  1. 每個 SHA1 密鑰都有一個對應的密鑰哈希,長度為 28 個字符,並以 '=' 結尾

  2. 我已經嘗試使用在線工具從我的 SHA1 中獲取散列密鑰,但該密鑰散列從未對我有用。

  3. 如果您在 Windows 上,請從此處安裝 open-ssl:Open ssl

  4. 我已經在我擁有的所有密鑰庫文件上使用了這個 keytool 命令,即暫存、調試和發布。

keytool -exportcert -alias my_alias_name -keystore "C:\Users\...my_filename.jks" | "C:\Openssl\bin\openssl.exe" sha1 -binary | "C:\Openssl\bin\openssl.exe" base64

注意:即使您錯誤地填寫了任何參數,上述方法也會始終為您提供密鑰哈希。 知道您是否獲得正確的哈希密鑰的技巧是 - 在運行此命令后,如果提示您輸入密碼,則意味着后續密鑰是正確的。

不要使用my_filename.keystore而是使用my_filename.jks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM