前言

从一个小插曲引入jks和keystore对比,之前打签名包时不大注意。在使用IDE( android studio 或者 Eclipse)进行签名apk 针对 .jks 和.keystore 不同的签名类型需要进行所使用的签名文件选择,否则会有异常,某些接入第三方的功能会有异常

如图:

Jks签名:

有两个选项(密钥对:公钥和私钥)

android JKS,keystore 以及密钥对生成与读取方法_数据

Keystore 签名:
有一个选项:公钥

android JKS,keystore 以及密钥对生成与读取方法_java_02

概述/jks 编辑

jks是数字证书库,可以在配置ssl的时候使用。
  在配置ssl时一般分为信任库和证书库。
  具体哪个是只个要看做什么用途,哪个是客户端。
  jks里有KeyEntry和CertEntry, 而且可以具有多个这些Entry. KeyEntry是必须包含PrivateKey和证书(当然也包含了PublicKey)。
  在库里的每个Entry都是靠别名来识别的。

引用网上较多的一种解释

JKS文件是一个java中的密钥管理库。

JKS文件就好像一个仓库,里面可以放很多的东西,这里只存放一类东西就是密钥,仓库当然会有一把锁,防范别人随便乱拿,
这个就是JKS文件的密码。里面存放的密钥也各有不同,每个密钥都有一个名字(在下面叫别名),一类就密钥对,一类叫公钥,
一类叫私钥,密钥对就是包含公钥和私钥的。这里的公钥只要你能进入仓库你就可以随便查看拿走,私钥则是有密码的,
只允许有权限的人查看拿走。

Keytool 是一个JAVA环境下的安全钥匙与证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore
的文件(受密码保护)中。

在keystore里,包含两种数据:
密钥实体(Key entity)——密钥(secretkey)又或者是私钥和配对公钥(采用非对称加密)
可信任的证书实体(trustedcertificate entries)——只包含公钥

2.使用android 自带keyTool 生成keyStore 文件

生成方式一:
方式一:android studio 和 Eclipse 进行apk签名,会自动弹出相应弹窗,跟着引导就可以生成制定的签名,这里不赘述

Android studio 方式 build—-Generate Signed APK
二、命令行生成keystore
dos下进入JDK的bin目录

运行如下命令:
C:\Program Files\Java\jdk1.8.0_92\bin>keytool -genkey -alias wyf1.keystore -keya
lg RSA -validity 20000 -keystore F:\nuoyuankeystore\jks\wechao.keystore

(-validity 20000代表有效期天数),命令完成后,bin目录中会生成wechao.keystore
查看命令keytool -list -keystore “wechao.keystore” 输入你设置的keystore密码

C:\Program Files\Java\jdk1.8.0_92\bin>keytool -genkey -alias wyf1.keystore -keya
lg RSA -validity 20000 -keystore F:\nuoyuankeystore\jks\wechao.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: yangweichao
您的组织单位名称是什么?
[Unknown]: nuoyuan
您的组织名称是什么?
[Unknown]: nuoyuankeji
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的省/市/自治区名称是什么?
[Unknown]: bj
该单位的双字母国家/地区代码是什么?
[Unknown]: 010
CN=yangweichao, OU=nuoyuan, O=nuoyuankeji, L=bj, ST=bj, C=010是否正确?
[否]: 是

输入 <wyf1.keystore> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:

C:\Program Files\Java\jdk1.8.0_92\bin>

生成jks 或者keystore 签名文件

3、提取公钥JKS

1)导出公钥到证书中(cer文件)

C:\Program Files\Java\jdk1.8.0_92\bin>keytool -exportcert -alias 别名-keystore  证书路径 -storepass 证书查看密码-file nuoyuan.cer

存储在文件

2)将服务端证书(公钥),导入客户端密钥库中

Keytool -import -alias nuoyuan -file F:\nuoyuankeystore\nuoyuan.cer -keystore F:\nuoyuankeystore\keystore\ceshi.jks -storepass 需要设置密钥库密码 **
(保存时,需要设置密钥库密码,且此时不能少于6位)

至此,私钥JKS、公钥JKS文件都已经生成好了,生成文件如下:

android JKS,keystore 以及密钥对生成与读取方法_android_03

这里推荐一个读取软件 名字叫 ​​portecle​​ , 链接 可以方便进行读取签名中信息

4、Java使用JKS文件,示例代码

1)使用私钥签名

//a. 创建针对jks文件的输入流
InputStream inputStream = new FileInputStream(cafile);
//CA 文件名 如: D:/ceshi.jks

//b. 创建KeyStore实例 (store_password密钥库密码)
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(inputStream,store_password.toCharArray());

//c. 获取私钥 (alias 为私钥别名,password为私钥密码)
PrivateKey pk = keyStore.getKey(alias,password.toCharArray());

//d. 用私钥对数据签名
//获取Signature实例,指定签名算法(本例使用MD5withRSA,可自选)
Signaturedsa = Signature.getInstance("MD5withRSA");
//加载私钥
dsa.initSign(privateKey);
//更新待签名的数据
dsa.update(data.getBytes());
//进行签名
byte[] sig = dsa.sign();
//转换成十六进制字符串,作为最终的签名数据
return byteToHex(sig);
备注:上述字节数组即签名后的数据,可将该字节数组转换成十六进制字符串,此处不再赘述

2)使用公钥验签

//a. 创建针对jks文件的输入流
同上

//b. 创建KeyStore实例
同上

//c. 获取公钥 (alias 为公钥别名)
PublicKey pubKey= keyStore.getCertificate(alias).getPublicKey();

//d. 公钥进行验签
//获取Signature实例,指定签名算法(与之前一致)
Signaturedsa = Signature.getInstance("MD5withRSA");
//加载公钥
dsa.initVerify(publicKey);
//更新原数据
dsa.update(orgData.getBytes());
//将签名数据从十六进制字符串转回字节数组
byte sig[] =hexToByte(signData);
//公钥验签(true-验签通过;false-验签失败)
return dsa.verify(sig);