gpt4 book ai didi

java - 如何从代码中获取 Keystore 指纹

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:46 26 4
gpt4 key购买 nike

我目前正努力为我正在开发的 Unity3d 应用程序提供一些安全性,我想添加验证 apk 文件未被某些补丁程序篡改。我知道如何从构建的应用程序(如 keytool)获取 keystore 指纹,但我很难弄清楚如何在运行时从我的应用程序代码中获取该指纹以检查它是否相同。到目前为止,我已经经历了很多其他线程但没有成功(像这样:Get certificate fingerprint from android app)

有没有人找到解决方法或提示我应该从哪里开始寻找?提前致谢!

最佳答案

修改getCertificateSHA1Fingerprint来自 answer 的函数你链接到安卓Context作为参数。获取 Context从 Unity 并将其发送到此函数,然后标记为 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# 代码将能够与其通信。

关于java - 如何从代码中获取 Keystore 指纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com