日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2023/12/2 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android代码数字证书,有关Android中读取证书 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在項(xiàng)目中遇到了讀取證書(shū)中內(nèi)容與讀取keystore中對(duì)應(yīng)公鑰的需求,在此做一下筆記

讀取證書(shū)

最近項(xiàng)目中遇到后臺(tái)返回個(gè)byte[]數(shù)組類(lèi)型的證書(shū),需要從證書(shū)中獲取相關(guān)內(nèi)容,先看一下相關(guān)代碼

BufferedInputStream mStream = null;

try {

String s = new String(cert);//cert為后臺(tái)返回的byte[]數(shù)組

StringBuilder builder = new StringBuilder();

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

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

//參數(shù) x.509為證書(shū)類(lèi)型,注意X.509 的 CertificateFactory 返回的證書(shū)必須是 java.security.cert.X509Certificate 的實(shí)例

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

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

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

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

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

//certificate.getIssuerDN();//簽發(fā)者

} catch (CertificateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

if(mStream != null ){

mStream.close();

}

}

> 關(guān)于CertificateFactory類(lèi):

此類(lèi)定義了用于從相關(guān)的編碼中生成證書(shū)、證書(shū)路徑 (CertPath) 和證書(shū)撤消列表 (CRL) 對(duì)象的 CertificateFactory 功能。

> 關(guān)于X.509:

X.509是一種基本的證書(shū)格式,x509證書(shū)由用戶(hù)公共密鑰和用戶(hù)標(biāo)識(shí)符組成。此外還包括版本號(hào)、證書(shū)序列號(hào)、CA標(biāo)識(shí)符、簽名算法標(biāo)識(shí)、簽發(fā)者名稱(chēng)、證書(shū)有效期等信息。

開(kāi)始時(shí),我是直接將數(shù)組轉(zhuǎn)為String進(jìn)行讀取,運(yùn)行后報(bào)讀取證書(shū)異常,檢查代碼無(wú)果后,打開(kāi)本地證書(shū)與String進(jìn)行格式比較后發(fā)現(xiàn)了關(guān)鍵就是代碼中

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

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

注:這兩個(gè)字符串分別就是證書(shū)的開(kāi)始標(biāo)簽與結(jié)束標(biāo)簽,只有開(kāi)始與結(jié)束拼接上面兩個(gè)字符串后,才會(huì)是個(gè)完整的證書(shū)(拼接時(shí)注意要加換行符,否則還不是個(gè)完整的證書(shū))

讀取到證書(shū)后就可獲取需要的信息了。

讀取Keystore中公鑰

參考資料:傳送門(mén)

讀取Keystore公鑰其實(shí)與上面類(lèi)似,通過(guò)PackageInfo獲取到本地證書(shū)后,進(jìn)行讀取,在讀取證書(shū)時(shí)無(wú)需拼接以上兩個(gè)標(biāo)識(shí)符,讀取到的就是完整證書(shū)。

在獲取公鑰時(shí),獲取到的公鑰格式包括一些字符串等信息,需要自己進(jìn)行截取處理一下。代碼如下:

public void getPublicKey() {

String signcode = "";

try {

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

PackageManager.GET_SIGNATURES);

//Signature需注意 該類(lèi)導(dǎo)包時(shí)有兩個(gè)包 一個(gè)為java.signature, 安卓中需要 android.content.pm.Signature包

Signature[] signs = packageInfo.signatures;

Signature sign = signs[0];

signcode = parseSignature(sign.toByteArray());

signcode = signcode.toLowerCase();//如有大寫(xiě)字符 都換為小寫(xiě)

//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("");

}

如有問(wèn)題,歡迎指正。

總結(jié)

以上是生活随笔為你收集整理的Android代码数字证书,有关Android中读取证书的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。