private static string GetPackageSignature(Context context)
{
PackageManager packageManager = context.PackageManager;
var signing = packageManager.GetPackageInfo(context.PackageName, PackageInfoFlags.Signatures).Signatures;
return signing.First().ToCharsString();
}
Usually I get signature through above code. but that is deprecated I tried to find to replace code and I try many solution but I can't find code that be able to change
How to use PackageInfo.GET_SIGNING_CERTIFICATES in API 28?
I converted above solution code to Xamarin code, but it is not working
List<string> signatureBase64 = new List<string>();
if (Build.VERSION.SdkInt >= BuildVersionCodes.P)
{
PackageInfo packageInfo = context.PackageManager.GetPackageInfo(context.PackageName, PackageInfoFlags.SigningCertificates);
Signature[] signatures = packageInfo.SigningInfo.GetApkContentsSigners();
MessageDigest md = MessageDigest.GetInstance("SHA");
foreach(Signature signature in signatures)
{
md.Update(signature.ToByteArray());
signatureBase64.Add(new string(Encoding.Unicode.GetChars(Base64.Encode(md.Digest(), Base64Flags.Default))));
}
}
return signatureBase64[0];
if I have some mistake or I don't know, could you say me
That is my final solution
private static string GetPackageSignature(Context context)
{
string packageSign = "-1";
if (context != null)
{
PackageManager packageManager = context.PackageManager;
PackageInfo packageInfo;
string packageName = context.PackageName;
Signature[] signatures = null;
try
{
if (Build.VERSION.SdkInt > BuildVersionCodes.P)
{
packageInfo = packageManager.GetPackageInfo(packageName, PackageInfoFlags.SigningCertificates);
SigningInfo signingInfo = packageInfo.SigningInfo;
signatures = signingInfo.GetApkContentsSigners();
}
else
{
// APi Level28 Under
#pragma warning disable CS0618 // Type or member is obsolete
var signing = packageManager.GetPackageInfo(packageName, PackageInfoFlags.Signatures).Signatures;
#pragma warning restore CS0618 // Type or member is obsolete
return signing.First().ToCharsString();
}
}
catch (Java.Lang.Exception e)
{
Log.Error("Don't Read Pkg Sign AppHashKeyHelper", e.ToString());
}
if (null != signatures && signatures.Length > 0)
{
Signature sign = signatures[0];
packageSign = sign.ToCharsString();
}
}
return packageSign;
}
above code return value is packagesign
You could check the following code
public static string GetPackageSign(Context context)
{
string str = "-1";
if (context != null)
{
PackageManager packageManager = context.PackageManager;
PackageInfo packageInfo;
string packageName = context.PackageName;
Android.Content.PM.Signature[] signatures = null;
try
{
if (Build.VERSION.SdkInt > BuildVersionCodes.P)
{
packageInfo = packageManager.GetPackageInfo(context.PackageName, PackageInfoFlags.SigningCertificates);
SigningInfo signingInfo = packageInfo.SigningInfo;
signatures = signingInfo.GetApkContentsSigners();
}
else
{
}
}
catch (Java.Lang.Exception e)
{
}
if (null != signatures && signatures.Length > 0)
{
Android.Content.PM.Signature sign = signatures[0];
str = EncryptionMD5(sign.ToByteArray()).ToUpper();
}
}
return str;
}
private static string EncryptionMD5(byte[] byteStr)
{
MessageDigest messageDigest;
StringBuffer md5StrBuff = new StringBuffer();
try
{
messageDigest = MessageDigest.GetInstance("MD5");
messageDigest.Reset();
messageDigest.Update(byteStr);
byte[] byteArray = messageDigest.Digest();
foreach (byte aByteArray in byteArray)
{
if (Integer.ToHexString(0xFF & aByteArray).Length == 1)
{
md5StrBuff.Append("0").Append(Integer.ToHexString(0xFF & aByteArray));
}
else
{
md5StrBuff.Append(Integer.ToHexString(0xFF & aByteArray));
}
}
}
catch (Java.Lang.Exception e)
{
}
return md5StrBuff.ToString();
}