25岁的时候他还如此的浮躁,就好像一壶烧开的热水,在跟世界炫耀:看我能咕咚咕咚冒白烟!—亚当爱自拍
关于证书的那些事儿
从技术上讲,证书其实包含三部分,用户的信息,用户的公钥,还有CA中心对该证书里面的信息的签名。
1. CA中心:
又称CA机构,即证书授权中心(Certificate Authority ),或称证书授权机构,作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
2. 证书举例:
可以用chrome来访问www.goolge.com.hk,或者访问login.taobao.com,点击地址栏的最左边的小锁头,仔细找找就能发现该网站的证书,这个证书可以证明该网站是经过CA认证的可信的网站,该证书使用过https协议穿到浏览器端的(所以在地址栏里边你可以看到https://的字样)。
3. 找到chrome的设置选项->显示高级设置->HTTPS/SSL 管理证书->Trusted Root Certification Authorities里边,可以看到有许多许多root CA,这些CA是比较权威的,也是google信任的。在chrome安装时,这些证书被安装到浏览器中,作为验证证书链的公钥。
4. 证书组成:
version v3 //遵循X509 V3版本协议
valid from 2014.1.1
valid to 2015.6.1
issue from Verisign CA
issue to my company
public key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
... ...
CA signature xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CA SHA1 xxxxxxxxxxxxxxxxxxxxxxxxxxx
5. 在验证证书的有效性的时候,会验证签名,有效期,公钥长度等等。
KeyStore操作
- 下载KeyStore EXplorer 5.1.2 [下载地址:]http://www.keystore-explorer.org/
- 安装:走默认安装就可以
- 新建密钥库–>选择新建一个密钥库–>密钥库类型–>BKS–>点击OK
4.创建密钥对儿(你也可以使用原先有的)–>红圈部分为程序需要提前识别的,其他按着步骤来就可以了。如图:
选择签名算法,在程序中我们需要根据签名算法来解析。
5.如下部分说明你已经成功的创建一对儿密钥:
证书描述如下
其中你可以导入自己原有的密钥对儿或者证书也可以导出你想要的公钥、私钥或证书
6.右击想要导出的证书保存,OK含有证书完成。
7.保存到app工程
代码实现
*从秘钥库中获取证书*(也可以从其他地方获取证书)
X509Certificate x509Certificate = null;
try {
x509Certificate = (X509Certificate) EncrytUtils.getCertFromKStore(alias, keyStore);
} catch (KeyStoreException e) {
e.printStackTrace();
}
*私钥签名*(当然私钥是不可公开的,可以用Keystore Explorer 导出你想要的)
Signature signature = null;
try {
signature = Signature.getInstance("SHA256WITHRSA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
signature.initSign(privateKey);
} catch (InvalidKeyException e) {
e.printStackTrace();
}
try {
signature.update(source.getBytes("UTF-8"));
} catch (SignatureException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] sign = new byte[0];
try {
sign = signature.sign();
} catch (SignatureException e) {
e.printStackTrace();
}
System.out.println("签名plain:" + source);
System.out.println("签名后数据:" + StringUtils.byte2Hex(sign));
*验证*
try {
Signature.initVerify(x509Certificate.getPublicKey());
} catch (InvalidKeyException e) {
e.printStackTrace();
}
try {
Signature.update(source.getBytes("UTF-8"));
} catch (SignatureException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
boolean b = false;
try {
b = Signature.verify(sign);
} catch (SignatureException e) {
e.printStackTrace();
}
System.out.println("验签结果:" + b);
参考资料
证书与签名:https://www.douban.com/note/342724099
关于加密的一些思考:http://blog.sina.com.cn/s/blog_888269b20100zpdi.html
结束语
如果只是单方面采用非对称性加密算法,其实有两种方式,用于不同用处.
第一种是签名,使用私钥加密,公钥解密,用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改.但是不用来保证内容不被他人获得.
第二种是加密,用公钥加密,私钥解密,用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得.
如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的公钥加密这段数据,再用自己的私钥加密这段加密后的数据.最后再发给乙,这样确保了内容即不会被读取,也不会被篡改