Wednesday, 9 July 2014

Android : Application Signature Certificate Check: Check Your Apk certificate

Android : Application Signature Certificate Check: Check Your Apk certificate: To Check Your Apk certificate at runtime:    I've been searching for how can i check my apk certificate at my server end...


package com.example.certcheck;

public class Environments {

  public static final String Staging = "staging";
  public static final String Production = "production";
  public static final String Unknown = "unknown";
  public static final String Debug = "debug";

}





 

package com.example.certcheck;

import java.security.MessageDigest;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkCertificate();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
  SignedCertificate  certificate;
    private void checkCertificate() {
      try {
        PackageManager pm = MainActivity.this.getPackageManager();
        Signature sig = pm.getPackageInfo(MainActivity.this.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
        String md5Fingerprint = doFingerprint(sig.toByteArray()"MD5");
        System.out.println(md5Fingerprint);
        certificate = SignedCertificate.getCertificate(md5Fingerprint);
      catch (Exception e) {
        System.out.println("Error getting certificate, assuming release version..."+e);
        certificate = SignedCertificate.Production;
      finally {
        System.out.println("Found Certificate: " + certificate.name());
        System.out.println(certificate.showsLogs);
      }
    }

    protected static String doFingerprint(byte[] certificateBytes, String algorithm)
        throws Exception {
      MessageDigest md = MessageDigest.getInstance(algorithm);
      md.update(certificateBytes);
      byte[] digest = md.digest();
      
      String toRet = "";
      for (int i = 0; i < digest.length; i++) {
        if (i != 0)
          toRet += ":";
        int b = digest[i0xff;
        String hex = Integer.toHexString(b);
        if (hex.length() == 1)
          toRet += "0";
        toRet += hex;
      }
      return toRet;
    
    private enum SignedCertificate {
      Debug("32:16:95:45:e1:ba:df:68:30:ff:24:10:10:5a:1c:17", Environments.Debug, true, true),
      Staging("33:c1:9e:df:e1:f1:2c:30:b9:20:b8:d8:4b:4e:a2:ac", Environments.Staging, false, true),
      Production("e3:61:60:f1:b9:a2:b0:f9:ff:7e:fa:30:a1:1b:fc:e7", Environments.Production, false, false),
      Unknown("There is no such a certificate", Environments.Unknown, false, false), ;
      private final String md5;

      private final String environment;

      private final boolean debugMode;

      private final boolean showsLogs;

      private SignedCertificate(String md5, String environment, boolean debugMode, boolean showsLogs) {
        this.md5 = md5;
        this.environment = environment;
        this.debugMode = debugMode;
        this.showsLogs = showsLogs;
      }

      public static final SignedCertificate getCertificate(String md5) {
        md5 = md5.toLowerCase();
        for (SignedCertificate certificate : values()) {
          if (certificate.md5.toLowerCase().equals(md5))
            return certificate;
        }
        return Unknown;
      

    }
}