Search code examples
androidkotlinxamarinsignature

How to get Package Signature in Xamarin android api level more than 28


 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


Solution

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