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

证书工具

/*** 2009-5-20*/
package org.zlex.chapter10_2;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";/*** 密钥库类型PCKS12*/private static final String STORE_TYPE = "PKCS12";/*** 由KeyStore获得私钥* * @param keyStorePath*            密钥库路径* @param alias*            别名* @param password*            密码* @return PrivateKey 私钥* @throws Exception*/public 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*/public static PublicKey getPublicKeyByCertificate(String certificatePath)throws Exception {// 获得证书Certificate certificate = getCertificate(certificatePath);// 获得公钥return certificate.getPublicKey();}/*** 获得Certificate* * @param certificatePath*            证书路径* @return Certificate 证书* @throws Exception*/private static X509Certificate getCertificate(String certificatePath)throws Exception {// 实例化证书工厂CertificateFactory certificateFactory = CertificateFactory.getInstance(CERT_TYPE);// 取得证书文件流FileInputStream in = new FileInputStream(certificatePath);// 生成证书Certificate certificate = certificateFactory.generateCertificate(in);// 关闭证书文件流in.close();return (X509Certificate) certificate;}/*** 获得KeyStore* * @param keyStorePath*            密钥库路径* @param password*            密码* @return KeyStore 密钥库* @throws Exception*/private static KeyStore getKeyStore(String keyStorePath, String password)throws Exception {// 实例化密钥库KeyStore ks = KeyStore.getInstance(STORE_TYPE);// 获得密钥库文件流FileInputStream in = new FileInputStream(keyStorePath);// 加载密钥库ks.load(in, password.toCharArray());// 关闭密钥库文件流in.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, String certificatePath) throws Exception {// 获得证书X509Certificate x509Certificate = getCertificate(certificatePath);// 构建签名,由证书指定签名算法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/496476.shtml

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

相关文章

Run-time system与虚拟机

Run-time system与虚拟机 一个Run-time系统,由一个执行引擎(Execution Engine)、一个机器级的调试器(Debugger)、一个汇编器(Assembler)和与之配套的开发工具(Tools)组成…

最近火了的自动驾驶全球产业链全景图

来源:传感器技术摘要:目前自动驾驶已经发展的很快,除了特斯拉和奥迪以外,很多豪车都引进了自动驾驶技术。下面来盘点一下自动驾驶产业链:首先看一下自动驾驶的等级标准:1、英特尔:Mobileye Alt…

java get set 注解_java技能提升,用Lombok甩掉get和set,让代码变得更简洁

前言前几天有个新来的同事(实习生)惊讶的对我说:我们的代码里好多错误,我的程序本地都启动不了。我一脸懵逼的质问他:目前线上的代码,怎么会有问题吗?他不服气的说:你来看嘛,就是有问题&#xf…

.pfx 证书和 .cer 证书

证书系列: 1:.pfx 证书和 .cer 证书 2:导入pfx证书 通常情况下,作为文件形式存在的证书一般有三种格式: 第一种:带有私钥的证书,由Public Key Cryptography Standards #12,PKCS#1…

HTML5、CSS、CSS3、SCSS (SASS) 相关教程

1、HTML5 教程 W3School HTML5 教程:http://www.w3school.com.cn/html5/index.asp 菜鸟网站 HTML5教程:http://www.runoob.com/html/html5-intro.html 知乎 零基础如何迅速学习HTML:https://www.zhihu.com/question/27018083 请问如何从头…

连接查询_左连接/右连接/全连接的区别

介绍表连接,更确切的说是inner joins內连接. 內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。 为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表…

java getclass 相等_java使用反射比较两个bean对象属性值是否相等

import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import org.apache.log4j.Logger;public class DomainEquals {/*** 日志操作类*/private static Logger logger Logger.getLogger(DomainEquals.class);publi…

生命起源之谜:RNA世界假说将迎来终结?

○ 流行的理论认为,生命起源于物质丰富的化学汤,而 RNA 是化学汤中最初的自我复制单元。但是,多肽和RNA混合起来或许会更高效。 | 图片来源:Novikov Aleksey来源:科学出版社 撰文:Jordana Cepelewicz 翻…

PHP 学习路线

PHP 官网文档(中文):https://www.php.net/manual/zh/langref.php ThinkPhp (官方手册、入门教程):https://sites.thinkphp.cn/1556331 ​W3School PHP 教程:http://www.w3school.com.cn/php/index.asp w3cschool (在线教程&技术文档)&am…

jQuery 对话框 jQuery.plugin

jQuery 对话框 jQuery.plugin 强烈推荐对话框插件jquery.weebox.js,本站开源账务管理系统中使用的对话框组件,各种形式的对话框:确认、成功、警告、错误等 ………… 如下图的右下角: 账务管理系统(个人版)演示 图的右下角的框架就…

java 微信 sha1_【微信开发-JavaWeb】SHA1算法

微信开发-SHA1算法public static String getSha1(String str){if(str null || str.length()0){return null;}char hexDigits[]{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f};try {MessageDigest mdTemp MessageDigest.getInstance("SHA1");mdTemp.update(str.getBytes("…

Java加密与解密的艺术~数字证书~证书管理openssl

OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理 这里使用的是Win32OpenSSL_Light-1_0_1e.exe http://www.slproweb.com/products/Win32OpenSSL.html 1,构建根证书 构建根证书前,需要构建随机数文件&#xff0…

2018年聊天机器人状态报告

来源: 199IT互联网数据中心根据Drift、SurveyMonkey Audience、Salesforce和myclever的“2018年聊天机器人状态报告”,聊天机器人预计能够24小时为简单任务提供即时服务,但不是进行复杂查询的最佳渠道。聊天机器人尚未在消费者中找到广泛的吸…

PHP、MySQL 注入

Welcome to the NetSPI SQL Injection Wiki:https://sqlwiki.netspi.com/ 因为需要了解下 SQL 注入,就使用 PHP 自己写了一个只有一个网页的网站测试下,现在记录下过程。。。 直接使用的 KALI系统 (KALI官网:Kali Linux | Penetr…

在asp.net 2.0中使用SqlBulkCopy类迁移数据[转]

我们经常要在一个表中将数据迁移到另一个表,当然,用的方法十分多了。在.net 2.0中,提供了一个sqlbulkcopy类,也可以实现如下的操作,下面简单介绍下。比如一个表如下CREATE TABLE Person3(PersonID int IDENTITY(1,1) P…

jdk1.8 base64注意事项

由于jdk1.7和jdk1.8内置的Base64遵守的RFC协议不一致,jdk1.7按照照RFC1521实现的,jdk1.8是按照rfc4648和rfc2045两个协议来实现的。具体可以从类注释中查询到。由于协议的不同可能导致jdk1.8的解码jdk1.7编码的数据时抛出java.lang.IllegalArgumentExcep…

争自动驾驶领头羊还是确保技术安全?欧美选择不同

来源:发掘新视界摘要:对于那些未知或有潜在危险的技术,欧洲更倾向于保护民众,而非是引领创新与进步。自优步自动驾驶汽车致人死亡事件发生之后,欧洲与美国对于技术的态度差异再度凸显,欧洲更倾向于加强监管…

菜鸟教程 之 JavaScript 教程

From:菜鸟教程 JavaScript:https://www.runoob.com/ W3School JavaScript 教程:http://www.w3school.com.cn/js/index.asp https://www.w3cschool.cn/javascript/ 廖雪峰官网 JavaScript 教程:https://www.liaoxuefeng.com/w…

关于Actionscript 3中给Flash传参数方法(一)

关于Actionscript 3中给Flash传参数方法(一) 今天在测试一个为Audi做Flash AD的时候,发现Audi提供的clicktag是Actionscript 2的代码,在Actionscript 3中是不被支持的,所以有去翻了Adobe Docs了。 在2.0中的clicktag代…

java byte num =1 3_java中把byte[]{1,2,3}通过怎样的转换,可以让其最终在TextView中显示为123...

展开全部string 转 byte[]byte[] midbytesisoString.getBytes("UTF8");//为UTF8编码byte[] isoret srt2.getBytes("ISO-8859-1");//为ISO-8859-1编码其中ISO-8859-1为单字节的编码2.byte[]转stringString isoString new String(bytes,"ISO-8859-1&q…