Android代码数字证书,有关Android中读取证书

最近在项目中遇到了读取证书中内容与读取keystore中对应公钥的需求,在此做一下笔记

读取证书

最近项目中遇到后台返回个byte[]数组类型的证书,需要从证书中获取相关内容,先看一下相关代码

BufferedInputStream mStream = null;

try {

String s = new String(cert);//cert为后台返回的byte[]数组

StringBuilder builder = new StringBuilder();

builder.append("-----BEGIN CERTIFICATE-----\n").append(s).append("\n-----END CERTIFICATE-----");

mStream = new BufferedInputStream(new ByteArrayInputStream(builder.toString().getBytes()));

//参数 x.509为证书类型,注意X.509 的 CertificateFactory 返回的证书必须是 java.security.cert.X509Certificate 的实例

CertificateFactory instance = CertificateFactory.getInstance("X.509");

X509Certificate certificate = (X509Certificate) instance.generateCertificate(mStream);

Principal sigAlgName = certificate.getSubjectDN();//主体名

// certificate.getSigAlgName();//签名算法

//certificate.getNotBefore();//有效期

//certificate.getIssuerDN();//签发者

} catch (CertificateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

if(mStream != null ){

mStream.close();

}

}

> 关于CertificateFactory类:

此类定义了用于从相关的编码中生成证书、证书路径 (CertPath) 和证书撤消列表 (CRL) 对象的 CertificateFactory 功能。

> 关于X.509:

X.509是一种基本的证书格式,x509证书由用户公共密钥和用户标识符组成。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。

开始时,我是直接将数组转为String进行读取,运行后报读取证书异常,检查代码无果后,打开本地证书与String进行格式比较后发现了关键就是代码中

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----

注:这两个字符串分别就是证书的开始标签与结束标签,只有开始与结束拼接上面两个字符串后,才会是个完整的证书(拼接时注意要加换行符,否则还不是个完整的证书)

读取到证书后就可获取需要的信息了。

读取Keystore中公钥

参考资料:传送门

读取Keystore公钥其实与上面类似,通过PackageInfo获取到本地证书后,进行读取,在读取证书时无需拼接以上两个标识符,读取到的就是完整证书。

在获取公钥时,获取到的公钥格式包括一些字符串等信息,需要自己进行截取处理一下。代码如下:

public void getPublicKey() {

String signcode = "";

try {

PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(),

PackageManager.GET_SIGNATURES);

//Signature需注意 该类导包时有两个包 一个为java.signature, 安卓中需要 android.content.pm.Signature包

Signature[] signs = packageInfo.signatures;

Signature sign = signs[0];

signcode = parseSignature(sign.toByteArray());

signcode = signcode.toLowerCase();//如有大写字符 都换为小写

//signcode 便是需要的公钥

} catch (Exception e) {

LogUtill.debug(e.getMessage());

}

}

private String parseSignature(byte[] signature) {

String sign = "";

try {

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");

X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));

String pubKey = cert.getPublicKey().toString();

String ss = subString(pubKey);

ss = ss.replace(",", "");

ss = ss.toLowerCase();

int aa = ss.indexOf("modulus");

int bb = ss.indexOf("publicexponent");

sign = ss.substring(aa + 8, bb);

} catch (CertificateException e) {

LogUtill.debug(e.getMessage());

}

return sign;

}

private String subString(String sub) {

Pattern pp = Pattern.compile("\\s*|\t|\r|\n");

Matcher mm = pp.matcher(sub);

return mm.replaceAll("");

}

如有问题,欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot中的高级配置文件管理

我们都知道Spring Boot中的配置文件管理及其为不同环境配置应用程序时提供的灵活性。 此功能的另一个强大方面是,在任何给定时间,我们都可以拥有多个活动配置文件。 这样做的好处是我们可以将部署环境配置文件与业务用例相关的配置文件混合在一起。 让我…

先装vs还是先装sql_【家装话题】装修师先装门还是先装地板?

装修先装门还是先装地板从成品保护角度说,先装门,成品保护相对容易,不管是发泡胶的滴落,玻璃胶的污染,安装门用的电动工具,包装垃圾,锯末,钻孔钉凿的冲击。直接在水泥地面上操作&…

python openpyxl模块追加数据_python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据...

当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作中查询(好记性不如烂笔头)…

android 百度开发论坛,Android 百度地图开发(一)

现在好多手机应用开发需要使用到百度地图,在使用百度地图的过程和遇到的问题整理一下方便以后使用申请密钥使用白度地图首先需要申请API Key,申请百度账户才能得到API Key. 登录 http://developer.baidu.com/map/ 点击申请密钥申请过程中需SHA1,使用Eclipse的同学应该很容易使用…

s905各种型号的区别_梯式桥架和槽式桥架的区别介绍

电缆桥架是我们日常生活中经常可以看到的一种既可以保护电缆电线不受外界因素损坏,并保障着我们用电安全的一种建筑材料。电缆桥架是由支架、托臂以及安装附件组成的,桥架既可独立架设安装,也可以敷设在建筑物和管廊支架上。对于电缆桥架型号…

shell中正则表达式详解_Linux中的正则表达式

点击上方Linux迷,关注我们正文来自:https://www.linuxmi.com/linux-zhengzebiaodashi.html正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列。拥有强大的字符搜索功能。也非常方便的搜索过滤出我们想要的内容。Linux系统&…

android 编辑9图片,Android基础入门教程——1.6 .9(九妹)图片怎么玩

Android基础入门教程——1.6 .9(九妹)图片怎么玩Android基础入门教程1.本节引言:可能有的一些疑问:1.什么是.9图片?答:图片后缀名前有.9的图片,如pic1.9.png这样的图片2. .9图片能干嘛?答: 在图片拉伸的时候…

Spring WebClient和Java日期时间字段

WebClient是Spring Framework的反应式客户端,用于进行服务到服务的调用。 WebClient已成为我的实用工具,但是最近我意外地遇到了一个问题,即它处理Java 8时间字段的方式使我绊倒了,本文对此进行了详细介绍。 快乐之路 首先是幸福…

2台电脑一根网线传文件_Iphone 和PC如何共享文件

iphone上有个隔空传送的功能,传文件非常方便,但是需要苹果全家桶才能使用,和个人pc如何传文件,特别是家里的主力台式机,需要传个视频文件,微信25m限制,插线也不太方便,能否和隔空传送…

如何将原图和json融合_双曲知识嵌入:如何将知识“融合”带入新空间?

知识图谱作为人类知识的结构化数据,是构建人工智能的基石。然而目前的知识图谱都是不完备的,所以需要将多个知识图谱融合以获得更完备的知识库。基于表示学习的知识关联作为知识图谱融合的新方法受到了许多关注。但知识关联模型面临着参数多、复杂性高、…

android viewgroup点击变色,Android ViewGroup事件分发

上篇文章已经分析了Android的Touch事件分发。如果没看的建议先看一下。Android View的Touch事件分发。接下来我们开始写几种场景,得出一个初步的执行顺序,然后我们按照这个顺序开始分析。首先我们自定义一个ViewGroup和一个View,然后重写相关…

qq数据泄露_真良心,腾讯这个app竟然能查账号泄露

最近有朋友都在分享腾讯手机管家,纷纷表示这是一个良心app,能查到自己账号泄露。仔细想一下,这么多年下来确实忘了自己都在什么平台或网站注册过账号,在黑客泛滥的今天,黑客很容易从一些平台窃取数据库,拿到…

vue 如何获取图片的原图尺寸_阳台洗衣机组合柜如何设计|尺寸规范|案例图片...

对于阳台装洗衣机来说,不只是简单的装修,还需要我们考虑水电、尺寸以及美观实用等问题,以免后期出现问题的时候会更加麻烦。接下来深圳装修网小编就为你们带来阳台洗衣机组合柜的案例赏析,以及装修的尺寸规范等内容,一…

print2flashwindows7旗舰版下载哪一个_JUJUMAO_MSDN原版 win 7 二合一 旗舰版32位 64位原版ISO镜像...

文件: F:\JUJUMAO_msdn_Win7_ultimate_x86_x64.iso大小:4.73G(5082120192 字节) MD5: AA4C7E80C52AC0DEDC757EF86CF8057BSHA1: 66505AD9424ED2D2B0DEDE7067917B708A67C7DDCRC32: 0E2FAB2C高速下载地址:https://jujumao.cowtransfer.com/s/3220a80131744fJUJUMAO_MSD…

lambda ::表达式_Lambda表达式和流API:基本示例

lambda ::表达式这篇博客文章包含基本Lambda表达式和Stream API示例的列表,我在2014年6月在Java用户组Politechnica Gedanensis (格但斯克技术大学)和Goyello的实时编码演示中使用了这些示例。 Lambda表达式 句法 最常见的示例: …

android readonly file system,安卓ROOT权限下“Read-only file sytem”解决办法

今天用安卓模拟器:BlueStacks,打开apk终端模拟器:Terminal,在shell操作命令的时候提示“Read-only file sytem”:第一种方法:在 Android 系统中,我们通过 adb 登录到 shell 进行操作时&#xff…

客制化键盘编程_客制化键盘劝退指南

客制化键盘劝退指南最近总感觉mac book pro的键盘不太好用,所以把家里用的杜伽K320拿到公司用了。这把键盘,樱桃的银轴,红轴的压力克数,更小的键程,用起来还是不错的。如此一来,家里的台式机没有键盘了&…

HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest

Manifest是用来做离线页面的,即使断网也能正常打开页面,用起来简单,但是在实际使用中存在以下问题:(1)如何自动缓存所有的页面的资源?因为manifest不能使用*通配符进行cache(2)如果网站资源更新,怎么让mani…

wallpaper怎么设置锁屏_Apple ID密码忘了怎么找回?丨如何让面容和指纹解锁立马失效?...

忘记Apple ID这种事肯定不少果粉都经历过,像小编也是如此,因为密码都比较复杂,如果太久没输入过密码,久而久之就忘了。哪一天突然需要用的时候,怎么想也想不起来。想不起来的话我们就别想了,直接重置密码就…

在Java中将时间单位转换为持续时间

java.util.concurrent.TimeUnit以给定的粒度单位表示Java中的持续时间,并提供了跨单位转换的实用方法。 java.util.concurrent.TimeUnit最早是在Java早期(1.5)引入的,但自那时以来已经被扩展了好几次。 在此博客文章中&#xff0c…