证书工具

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

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

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

    证书工具 /*** 2009-5-20*/ package org.zlex.chapter10_2;import java.io.FileInputStream; import java.secur ...

  2. Java加密与解密的艺术~数字证书详解

    数字证书具备常规加密/解密必要的信息,包含签名算法,可用于网络数据加密/解密交互,标识网络用户(计算机)身份.数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载体.依靠数字证 ...

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

    OpenSSL功能远胜于KeyTool,可用于根证书,服务器证书和客户证书的管理 这里使用的是Win32OpenSSL_Light-1_0_1e.exe http://www.slproweb.com ...

  4. Java加密与解密的艺术~数字证书~模型分析

    1.证书签发     数字证书需要经由认证机构签发,其流程如图:   数字证书的颁发流程可简述为如下过程: 1).由数字证书需求方产生自己的密钥对. 2).由数字证书需求方将算法.公钥和证书申请者身份 ...

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

    证书管理 keytool命令 echo 生成本地数字证书1 keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -val ...

  6. 安卓逆向_25 --- 密码学 之 《Java加密与解密的艺术》

    <Java加密与解密的艺术>中文 PDF版 :https://www.jb51.net/books/65048.html 1. 密码学应用 :https://www.bilibili.co ...

  7. Java加密与解密的艺术~AES-GCM-NoPadding实现

    来源:Java AES加密和解密_一名可爱的技术搬运工-CSDN博客 高级加密标准 (AES,Rijndael)是一种分组密码加密和解密算法,是全球使用最广泛的加密算法. AES使用128.192或2 ...

  8. Java加密与解密的艺术~RSA实现

    RSA 实现 /*** 2008-6-11*/ package org.zlex.chapter08_2;import java.security.Key; import java.security. ...

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

    1.准备工作 A.域名绑定 在hosts文件末尾追加 127.0.0.1  www.zlex.org B.证书导入 浏览器导入自签名证书文件zlex.cer C.服务器配置 配置SSL/TLS 单向认 ...

最新文章

  1. SpringMVC底层数据传输校验的方案(修改版)
  2. 字符串面试题(一)— 字符串逆序
  3. 【tensorflow】Sequential 模型方法 compile, model.compile
  4. 1020. Tree Traversals (25) PAT甲级真题
  5. python文件读写用到的库_Python使用pyshp库读取shapefile信息的方法
  6. MySQL中根据A表画更新B表
  7. BN层详解(含有公式推导过程)
  8. CMOS集成电路设计基础(孙肖子版)第二章课后答案
  9. 海量数据处理:经典实例分析
  10. 启发式搜索解决八数码问题
  11. 全球机场与航空公司准点率数据报告,为五一小长假做足准备
  12. 你不了解的 @reduxjs/toolkit 中的createApi
  13. 将数据集做成VOC2007格式用于Faster-RCNN训练
  14. 支付服务代码设计(策略模式,可扩展,接入方便)
  15. Centos7 二进制安装 Kubernetes 1.13
  16. 会计 制造费用转生产成本
  17. axure实现搜索功能_用Axure实验搜索原型
  18. docker: Error response from daemon: driver failed programming external connectivity on endpoint
  19. 文正机械电子工程专业课_详解 | 机械电子工程专业学习内容与就业前景
  20. 发明三国杀游戏的计算机天才楼天城回母校杭十四中(楼教主orz)

热门文章

  1. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之启动另一个Activity
  2. Reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are
  3. 国科金:共融机器人基础理论与关键技术研究重大研究计划
  4. 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些
  5. 有关启动图片Launch的设置
  6. 《戏说网络二三事》序1
  7. 3.6数对 (Python)
  8. mysql怎么禁止远程连接_mysql如何设置禁止远程连接
  9. springboot 引入jdbc驱动_SpringBoot+MyBatis+Druid整合demo
  10. 桌面图标设计里的计算机是灰色的,小技巧教您如何将Windows 10上的桌面图标设置中的回收站为灰色!...