Java加密与解密的艺术~数字证书~证书使用keytool

证书工具

/*** 2009-5-20*/
package org.zlex.chapter10_1;import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;import javax.crypto.Cipher;/*** 证书组件* * @author 梁栋* @version 1.0*/
public abstract class CertificateCoder {/*** 类型证书X509*/public static final String CERT_TYPE = "X.509";/*** 由KeyStore获得私钥* * @param keyStorePath*            密钥库路径* @param alias*            别名* @param password*            密码* @return PrivateKey 私钥* @throws Exception*/private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,String alias, String password) throws Exception {// 获得密钥库KeyStore ks = getKeyStore(keyStorePath, password);// 获得私钥return (PrivateKey) ks.getKey(alias, password.toCharArray());}/*** 由Certificate获得公钥* * @param certificatePath*            证书路径* @return PublicKey 公钥* @throws Exception*/private static PublicKey getPublicKeyByCertificate(String certificatePath)throws Exception {// 获得证书Certificate certificate = getCertificate(certificatePath);// 获得公钥return certificate.getPublicKey();}/*** 获得Certificate* * @param certificatePath*            证书路径* @return Certificate 证书* @throws Exception*/private static Certificate getCertificate(String certificatePath)throws Exception {// 实例化证书工厂CertificateFactory certificateFactory = CertificateFactory.getInstance(CERT_TYPE);// 取得证书文件流FileInputStream in = new FileInputStream(certificatePath);// 生成证书Certificate certificate = certificateFactory.generateCertificate(in);// 关闭证书文件流in.close();return certificate;}/*** 获得Certificate* * @param keyStorePath*            密钥库路径* @param alias*            别名* @param password*            密码* @return Certificate 证书* @throws Exception*/private static Certificate getCertificate(String keyStorePath,String alias, String password) throws Exception {// 获得密钥库KeyStore ks = getKeyStore(keyStorePath, password);// 获得证书return ks.getCertificate(alias);}/*** 获得KeyStore* * @param keyStorePath*            密钥库路径* @param password*            密码* @return KeyStore 密钥库* @throws Exception*/private static KeyStore getKeyStore(String keyStorePath, String password)throws Exception {// 实例化密钥库KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());// 获得密钥库文件流FileInputStream is = new FileInputStream(keyStorePath);// 加载密钥库ks.load(is, password.toCharArray());// 关闭密钥库文件流is.close();return ks;}/*** 私钥加密* * @param data*            待加密数据* @param keyStorePath*            密钥库路径* @param alias*            别名* @param password*            密码* @return byte[] 加密数据* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath,String alias, String password) throws Exception {// 取得私钥PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias,password);// 对数据加密Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 私钥解密* * @param data*            待解密数据* @param keyStorePath*            密钥库路径* @param alias*            别名* @param password*            密码* @return byte[] 解密数据* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath,String alias, String password) throws Exception {// 取得私钥PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias,password);// 对数据加密Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥加密* * @param data*            待加密数据* @param certificatePath*            证书路径* @return byte[] 加密数据* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data, String certificatePath)throws Exception {// 取得公钥PublicKey publicKey = getPublicKeyByCertificate(certificatePath);// 对数据加密Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 公钥解密* * @param data*            待解密数据* @param certificatePath*            证书路径* @return byte[] 解密数据* @throws Exception*/public static byte[] decryptByPublicKey(byte[] data, String certificatePath)throws Exception {// 取得公钥PublicKey publicKey = getPublicKeyByCertificate(certificatePath);// 对数据加密Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 签名* * @param keyStorePath*            密钥库路径* @param alias*            别名* @param password*            密码* @return byte[] 签名* @throws Exception*/public static byte[] sign(byte[] sign, String keyStorePath, String alias,String password) throws Exception {// 获得证书X509Certificate x509Certificate = (X509Certificate) getCertificate(keyStorePath, alias, password);// 构建签名,由证书指定签名算法Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());// 获取私钥PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias,password);// 初始化签名,由私钥构建signature.initSign(privateKey);signature.update(sign);return signature.sign();}/*** 验证签名* * @param data*            数据* @param sign*            签名* @param certificatePath*            证书路径* @return boolean 验证通过为真* @throws Exception*/public static boolean verify(byte[] data, byte[] sign,String certificatePath) throws Exception {// 获得证书X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);// 由证书构建签名Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());// 由证书初始化签名,实际上是使用了证书中的公钥signature.initVerify(x509Certificate);signature.update(data);return signature.verify(sign);}}

证书示例

/*** 2009-5-20*/
package org.zlex.chapter10_2;import static org.junit.Assert.*;import org.apache.commons.codec.binary.Hex;
import org.junit.Test;/*** 证书校验* * @author 梁栋* @version 1.0*/
public class CertificateCoderTest {private String password = "123456";private String alias = "1";private String certificatePath = "d:/ca/certs/ca.cer";//E:\pdf\JAVA\javaSecurity\opensslprivate String keyStorePath = "d:/ca/certs/ca.p12";/*** 公钥加密——私钥解密* * @throws Exception*/@Testpublic void test1() {try {System.err.println("公钥加密——私钥解密");String inputStr = "Ceritifcate";byte[] data = inputStr.getBytes();// 公钥加密byte[] encrypt = CertificateCoder.encryptByPublicKey(data,certificatePath);// 私钥解密byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt,keyStorePath, alias, password);String outputStr = new String(decrypt);System.err.println("加密前:\n" + inputStr);System.err.println("解密后:\n" + outputStr);// 验证数据一致assertArrayEquals(data, decrypt);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();fail(e.getMessage());}}/*** 私钥加密——公钥解密* * @throws Exception*/@Testpublic void test2() {System.err.println("私钥加密——公钥解密");String inputStr = "sign";byte[] data = inputStr.getBytes();try {// 私钥加密byte[] encodedData = CertificateCoder.encryptByPrivateKey(data,keyStorePath, alias, password);// 公钥加密byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData, certificatePath);String outputStr = new String(decodedData);System.err.println("加密前:\n" + inputStr);System.err.println("解密后:\n" + outputStr);// 校验assertEquals(inputStr, outputStr);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();fail(e.getMessage());}}/*** 签名验证* * @throws Exception*/@Testpublic void testSign() {try {String inputStr = "签名";byte[] data = inputStr.getBytes();System.err.println("私钥签名——公钥验证");// 产生签名byte[] sign = CertificateCoder.sign(data, keyStorePath, alias,password,certificatePath);System.err.println("签名:\n" + Hex.encodeHexString(sign));// 验证签名boolean status = CertificateCoder.verify(data, sign,certificatePath);System.err.println("状态:\n" + status);// 校验assertTrue(status);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();fail(e.getMessage());}}}

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

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

相关文章

预测|十张图带你了解2018年机器人行业趋势与前景

来源:前瞻产业研究院3月15日,腾讯对外公布了其2018年在AI领域的三大核心战略,其中包括成立机器人实验室“Robotics X”。当然,腾讯并不是唯一一家展开行动的互联网巨头,“三巨头”中的另外两家——百度和阿里&#xff…

ASP.NET2.0-防止同一用户同时登陆

要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在。在这里使用一个cache存放已经登陆的用户名,但是还有一个问题就是要知道用户是什么时候离开系统的呢?这就要定期清除cache中的内容了&#…

python mro c3_Python 19 MRO和C3算法

1.python经典类的MRO经典类的MROclass A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): passenter description here2. python新式类的MRO, C3算法新式类的MROclass A:…

PowerCenter Designer小结

使用PowerCenter Designer一个月,断断续续的记录一下中间遇到的问题: 1、lookup组件在写sql时,可以有查询条件,但是不能有排序(lookup有默认排序,根据表主键和out port) 需要更改默认排序时&…

Java加密与解密的艺术~安全协议~模型分析

模型分析 1、协商算法 RNC:Random Number Client RNS:Random Number Server 2、验证证书 3、产生密钥 PMS:Pre-Master Secret(预备主密钥) MS:Master Secret(主密钥) 4、加密交互

漫天风口,一地泡沫,消费机器人四年跌宕史

来源:OFweek 作者:邹大湿提及科技浪潮,AI 和机器人是逃不过的。2018年,AI依旧很火,但几年前曾经燥热的机器人狂潮,似乎凉凉了?那个曾经宣称万亿市场的智能机器人,究竟怎么了&#…

urlconnection java_java成神之——HttpURLConnection访问api

HttpURLConnection访问get资源HttpURLConnection connection (HttpURLConnection)new URL("http://ip/test").openConnection();int responseCode connection.getResponseCode();InputStream inputStream;if (200 < responseCode && responseCode < …

Python操作RabbitMQ

来源&#xff1a;http://www.cnblogs.com/phennry/p/5713274.html 本篇博客主要介绍如何通过Python来操作管理RabbitMQ消息队列&#xff0c;大家在工作中可能遇到很多类似RabbitMQ这种消息队列的中间件&#xff0c;如&#xff1a;ZeroMQ、ActiveMQ、MetaMQ等&#xff0c;我们学…

分享-利用VPC防止病毒软件的进入你的windows电脑

作为一个软件爱好者时不时都会从网上下载一些软件使用&#xff0c;虽然&#xff0c;现在防病毒和木马软件做得很好&#xff0c;但也架不住众多病毒木马的攻击。 所以&#xff0c;我的经验是当我下载一个软件以后&#xff0c;无法判定是否是病毒木马的话&#xff0c;我会安装在虚…

无监督学习最新研究:通过简单的「图像旋转」预测便可为图像特征学习提供强大监督信号

作者&#xff1a;Spyros Gidaris、Praveer Singh、Nikos Komodakis「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA在过去的几年中&#xff0c;深度卷积神经网络&#xff08;ConvNets&#xff09;已经改变了计算机视觉的领域&#xff0c;这是由于它们具有学习高级语义…

Java加密与解密的艺术~安全协议~单向认证服务

1、准备工作 A、域名绑定 在hosts文件末尾追加 127.0.0.1 www.zlex.org B、证书导入 浏览器导入自签名证书文件zlex.cer C、服务器配置 配置SSL/TLS 单向认证 <Connectorport"443"SSLEnabled"true"clientAuth"false"maxThreads"150…

java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

Java使用3DES加密解密的流程①传入共同约定的密钥(keyBytes)以及算法(Algorithm)&#xff0c;来构建SecretKey密钥对象SecretKey deskey new SecretKeySpec(keyBytes&#xff0c; Algorithm);②根据算法实例化Cipher对象。它负责加密/解密Cipher c1 Cipher.getInstance(Algor…

解决spring和struts配合问题

最近因为做weboa系统,我采用了strutsspringhibernate的整体架构,我按照目前网上流行的这方面的配置文件在web.xml中加入了: <param-name>contextconfiglocation</param-name> 【程序编程相关:struts中配置过滤文件&#xff01;】 <context-param> 【推荐阅…

Python 并行分布式框架 Celery

Celery 官网&#xff1a;http://www.celeryproject.org Celery 官方文档英文版&#xff1a;http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版&#xff1a;http://docs.jinkan.org/docs/celery celery配置&#xff1a;http://docs.jinkan.org/docs/c…

java判断是否是路径_java判断是否是目录

java判断是否是目录&#xff1a;/*** 创建目录** param path*/public static void CreatFileDir(String path) {try {File file new File(path);if(file.getParentFile().isDirectory()){//判断上级目录是否是目录if(!file.exists()){ //如果文件目录不存在file.mkdirs(); //创…

中国数字化进程比发达国家快,小程序让我感到自豪 | IT领袖峰会

作者&#xff1a; 张驰2018年3月25日上午举办的第10届2018中国&#xff08;深圳&#xff09;IT领袖峰会上&#xff0c;腾讯公司董事会主席兼首席执行官发表了 “数字中国的机遇与探索” 主题演讲。在演讲中表示&#xff0c;不管什么产业都是需要科技来对它进行改造升级、转型。…

Java加密与解密的艺术~安全协议~双向认证服务

双向认证服务 1、准备工作 A、证书导入 导入ca.p12 导入client.p12 B、服务器配置 <Connectorport"443"SSLEnabled"true"clientAuth"true"maxThreads"150"protocol"HTTP/1.1"scheme"https"sec…

DataBinder.Eval的基本格式 效率 比较

<%#eval%>是单方向的资料连接 <%#bind%> 双方向的资料连接 <%#eval%>是只读的,你看到的那些无法更新数据的数据显示控件,可以用这个 <%#bind%> 不但可读,而且可写,那些可更新数据库的数据绑定控件,用这个 <%# DataBinder.Eval(Container.DataItem,&…

利用 Celery 构建 Web 服务的后台任务调度模块

来源&#xff1a;http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代&#xff0c;社交网站、搜索引擎的的迅猛发展对 Web 服务的后台管理系统提出了更高的需求。考虑几个常见的使用场景&#xff1a; 社交网站的用户在其主页发布了一组新…

java元素符号是什么_Java 代码中 @ 符号是什么意思?

展开全部annotation。Annotation&#xff0c;是Java5的新特性&#xff0c;下面是Sun的Tutorial的描述&#xff0c;因为是英文&#xff0c;这里我翻译下&#xff0c;希望能够比较清晰32313133353236313431303231363533e58685e5aeb931333264633435的描述一下Annotation的语法以及…