2017-10-12 25 views
0

私は現在、私が取り組んでいるUnity3dアプリケーションに対してセキュリティを確保することに苦労しています.papファイルが一部のパッチャーによって改ざんされていないという検証を追加したいと思います。私は(キーツールのような)ビルドされたアプリケーションからキーストアのフィンガープリントを取得する方法を知っていますが、実行時にそのアプリケーションのコードからそのフィンガープリントを取得して同じであることを確認するのは難しいです。私はこれまでに多くの他のスレッドを成功させてきました(このように:Get certificate fingerprint from android appコードからKeystoreの指紋を取得する方法

これを行う方法や探し始めたいヒントを誰かが見つけましたか?前もって感謝します!

答えて

2

Android ContextをパラメータとしてリンクしたanswerからgetCertificateSHA1Fingerprint関数を変更します。 UnityからContextを取得し、それをこの関数に送信してから、staticというマークを付けます。

のJava:

public final class CertificateSHA1Fingerprint 
{ 

    private static String getCertificateSHA1Fingerprint(Context mContext) 
    { 
    PackageManager pm = mContext.getPackageManager(); 
    String packageName = mContext.getPackageName(); 
    int flags = PackageManager.GET_SIGNATURES; 
    PackageInfo packageInfo = null; 
    try { 
    packageInfo = pm.getPackageInfo(packageName, flags); 
    } catch (PackageManager.NameNotFoundException e) { 
    e.printStackTrace(); 
    } 
    Signature[] signatures = packageInfo.signatures; 
    byte[] cert = signatures[0].toByteArray(); 
    InputStream input = new ByteArrayInputStream(cert); 
    CertificateFactory cf = null; 
    try { 
    cf = CertificateFactory.getInstance("X509"); 
    } catch (CertificateException e) { 
    e.printStackTrace(); 
    } 
    X509Certificate c = null; 
    try { 
    c = (X509Certificate) cf.generateCertificate(input); 
    } catch (CertificateException e) { 
    e.printStackTrace(); 
    } 
    String hexString = null; 
    try { 
    MessageDigest md = MessageDigest.getInstance("SHA1"); 
    byte[] publicKey = md.digest(c.getEncoded()); 
    hexString = byte2HexFormatted(publicKey); 
    } catch (NoSuchAlgorithmException e1) { 
    e1.printStackTrace(); 
    } catch (CertificateEncodingException e) { 
    e.printStackTrace(); 
    } 
    return hexString; 
} 

public static String byte2HexFormatted(byte[] arr) 
{ 
    StringBuilder str = new StringBuilder(arr.length * 2); 
    for (int i = 0; i < arr.length; i++) 
    { 
    String h = Integer.toHexString(arr[i]); 
    int l = h.length(); 
    if (l == 1) h = "0" + h; 
    if (l > 2) h = h.substring(l - 2, l); 
    str.append(h.toUpperCase()); 
    if (i < (arr.length - 1)) str.append(':'); 
    } 
    return str.toString(); 
} 
} 

C#

AndroidJavaClass unityClass; 
AndroidJavaObject unityActivity; 
AndroidJavaObject unityContext; 
AndroidJavaClass customClass; 

public string getCertificateSHA1Fingerprint() 
{ 
    //Replace with your full package name 
    string packageName = "com.example.CertificateSHA1Fingerprint"; 

    unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
    unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity"); 
    unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext"); 

    customClass = new AndroidJavaClass(packageName); 

    string result = customClass.CallStatic<string>("getCertificateSHA1Fingerprint", unityContext); 
    return result; 
} 

あなたが唯一のAndroid StudioでのJava機能を構築し、JARまたは.AARファイルに変換し、その後でそれを配置する必要がありますあなたの<ProjectName>Assets\Plugins\AndroidフォルダC#コードは、それと通信することができます。

+1

これは魅力的なように機能し、Androidスタジオでaar/jarファイルを作成する方法について私の頭脳を包むために必要でした。素晴らしいマニュアル!ありがとうございました! – PavelAlieinikov

+1

私はそれをテストしなかったが、それはすべきである。私は喜んで助けてくれました。新しいユーザーには.aarと.jarをビルドするのは難しいですが、一度やり直せば慣れるでしょう。どういたしまして! – Programmer

関連する問題