import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.util.Log;import java.io.ByteArrayInputStream;import java.security.MessageDigest;import java.security.cert.CertificateException;import java.security.cert.CertificateFactory;import java.security.cert.X509Certificate;import java.text.SimpleDateFormat;import java.util.HashMap;import java.util.Map;import java.util.Set;public class Signature {    public Map<String, String> getSignatureInfo(Context context) {        Map<String, String> map = new HashMap<String, String>();        try {            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);            android.content.pm.Signature[] signs = packageInfo.signatures;            android.content.pm.Signature sign = signs[0];            byte[] signature = sign.toByteArray();            X509Certificate cert = parseSignature(signature);            map.put("signName", cert.getSigAlgName());            map.put("pubKey", cert.getPublicKey().toString());            map.put("serialNumber", cert.getSerialNumber().toString());            map.put("sigAlgOID", cert.getSigAlgOID());            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            map.put("startTime", sdf.format(cert.getNotBefore()));            map.put("endTime", sdf.format(cert.getNotAfter()));            map.put("subjectDN", cert.getSubjectDN().toString());            map.put("MD5", getMessageDigest("MD5", signature));            map.put("SHA1", getMessageDigest("SHA1", signature));            map.put("SHA256", getMessageDigest("SHA256", signature));            Set<Map.Entry<String, String>> entrySet = map.entrySet();            for (Map.Entry<String, String> entry : entrySet) {                Log.i("",String.format("%s=%s", entry.getKey(), entry.getValue()));            }        } catch (Exception e) {            e.printStackTrace();        }        return map;    }    private String getMessageDigest(String instance, byte[] signature) {        String sinfo = null;        try {            MessageDigest md = MessageDigest.getInstance(instance);            md.update(signature);            byte[] digest = md.digest();            sinfo = toHexString(digest);        } catch (Exception e) {            e.printStackTrace();        }        return sinfo;    }    public X509Certificate parseSignature(byte[] signature) {        X509Certificate cert = null;        try {            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");            cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));        } catch (CertificateException e) {            e.printStackTrace();        }        return cert;    }    private void byte2hex(byte b, StringBuffer buf) {        char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8',                '9', 'A', 'B', 'C', 'D', 'E', 'F'};        int high = ((b & 0xf0) >> 4);        int low = (b & 0x0f);        buf.append(hexChars[high]);        buf.append(hexChars[low]);    }    /**     * Converts a byte array to hex string     */    private String toHexString(byte[] block) {        StringBuffer buf = new StringBuffer();        int len = block.length;        for (int i = 0; i < len; i++) {            byte2hex(block[i], buf);            if (i < len - 1) {                buf.append(":");            }        }        return buf.toString();    }

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. 2021华为认证报名须知,Pearson VUE考试中
  2. 关于一个NBA球队连续夺冠的SQL查询问题,解
  3. 函数递归使用
  4. MySQL系列-DDL语句
  5. MySQL系列-表是如何组成的?
  6. 那个做外包的程序员,最后去哪里了?(二)
  7. echarts地图下钻
  8. MySQL系列-DML语句
  9. MySQL系列-DML语句之select多表连接查询
  10. select使用方法