最近初步接触了下Java加密和数字签名的相关内容,我学习的过程大概分五步:
1)消息摘要
2)私钥加密
3)公钥加密
4)数字签名
5)数字证书
下面的代码是第五部分:数字证书
比起前四部分,这部分就稍微麻烦点了,我想我有必要给刚刚接触数字证书的朋友们,把在本地跑通下面代码的前提说一下:
1此例是对“数字证书”文件的操作,所以,你先要在本地建立一个证书库
2建立证书库(密钥库)
cmd中输入:C:/>keytool -genkey -alias TestCertification -keyalg RSA -keysize 1024 -keystore BocsoftKeyLib -validity 365
意思是:在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用 RSA 算法生成,且指定密钥长度为1024,证书有效期为1年
建立库的过程中会询问问题,详见第5条
3将证书导出到证书文件TC.cer
在cmd中输入:C:/>keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib
意思是:将把证书库BocsoftKeyLib中的别名为TestCertification的证书导出到TC.cer证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开
4以上3步就基本上完成了证书的操作,下面操作是可选的
导出的证书文件无法用文本编辑器正确显示,可以输入如下命令,然后在以记事本形式打开TC.cer就能看了,看看传说中的证书里到底写的什么鬼东西~~~
C:\>keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib -storepass keystore -rfc
5在创建证书库时,系统会询问如下问题:
输入keystore密码: keystore(你证书库的密码)
您的名字与姓氏是什么?
[Unknown]: miaozhuang
您的组织单位名称是什么?
[Unknown]: csii
您的组织名称是什么?
[Unknown]: csii
您所在的城市或区域名称是什么?
[Unknown]: tianjin
您所在的州或省份名称是什么?
[Unknown]: tianjin
该单位的两字母国家代码是什么
[Unknown]: ch
CN=miaozhuang, OU=csii, O=csii, L=tianjin, ST=tianjin, C=ch 正确吗?
[否]:
上面的信息都是随便输入的,无关大局
此时输入: y 回车即可(别像我一样,输个yes……傻死了)
package security;
import java.security.*;
import java.security.PublicKey;
import java.io.*;
import java.util.*;
import java.security.*;
import java.security.cert.*;
import sun.security.x509.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
/**
* 此例是对“数字证书”文件的操作
* java平台(在机器上安装jdk)为你提供了密钥库(证书库),cmd下提供了keytool命令就可以创建证书库
*
* 在运行此例前:
* 在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用
* RSA 算法生成,且指定密钥长度为1024,证书有效期为1年
* 导出证书文件为TC.cer已存于本地磁盘C:/
* 密码是keystore
*/
public class DigitalCertificate {
public static void main(String[] args) {
try {
//前提:将证书库中的一条证书导出到证书文件(我写的例子里证书文件叫TC.cer)
//从证书文件TC.cer里读取证书信息
/*CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream in = new FileInputStream("C:/TC.cer");
//将文件以文件流的形式读入证书类Certificate中
Certificate c = cf.generateCertificate(in);
System.err.println("转换成String后的证书信息:"+c.toString());*/
//或者不用上面代码的方法,直接从证书库中读取证书信息,和上面的结果一摸一样
String pass="keystore";
FileInputStream in2=new FileInputStream("C:/BocsoftKeyLib");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in2,pass.toCharArray());
String alias = "TestCertification"; //alias为条目的别名
Certificate c=ks.getCertificate(alias);
System.err.println("转换成String后的证书信息:"+c.toString());
//获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法
X509Certificate t=(X509Certificate)c;
//从信息中提取需要信息
System.out.println("版本号:"+t.getVersion());
System.out.println("序列号:"+t.getSerialNumber().toString(16));
System.out.println("主体名:"+t.getSubjectDN());
System.out.println("签发者:"+t.getIssuerDN());
System.out.println("有效期:"+t.getNotBefore());
System.out.println("签名算法:"+t.getSigAlgName());
byte [] sig=t.getSignature();//签名值
PublicKey pk = t.getPublicKey();
byte [] pkenc=pk.getEncoded();
System.out.println("公钥:");
for(int i=0;i<pkenc.length;i++){
System.out.print(pkenc[i]+",");
}
System.err.println();
//证书的日期有效性检查,颁发的证书都有一个有效性的日期区间
Date TimeNow=new Date();
t.checkValidity(TimeNow);
System.out.println("证书的日期有效性检查:有效的证书日期!");
//验证证书签名的有效性,通过数字证书认证中心(CA)机构颁布给客户的CA证书,比如:caroot.crt文件
//我手里没有CA颁给我的证书,所以下面代码执行不了
/*FileInputStream in3=new FileInputStream("caroot.crt");
//获取CA证书
Certificate cac = cf.generateCertificate(in3);
//获取CA的公钥
PublicKey pbk=cac.getPublicKey();
//c为本地证书,也就是待检验的证书,用CA的公钥校验数字证书c的有效性
c.verify(pbk);*/
} catch(CertificateExpiredException e){//证书的日期有效性检查:过期
System.out.println("证书的日期有效性检查:过期");
} catch(CertificateNotYetValidException e){ //证书的日期有效性检查:尚未生效
System.out.println("证书的日期有效性检查:尚未生效");
} catch (CertificateException ce) {
ce.printStackTrace();
} catch (FileNotFoundException fe) {
fe.printStackTrace();
} /*catch (IOException ioe){
} catch (KeyStoreException kse){
}*/ catch (Exception e){
e.printStackTrace();
}
}
}
分享到:
相关推荐
通过阅读"Java加密和数字签名编程快速入门",无论是初学者还是有一定经验的开发者,都能掌握Java中加密和数字签名的基本原理和实际应用。"www.pudn.com.txt"可能是提供额外链接或资源的文本文件,而"Java加密和数字...
Java加密和数字签名编程是Java开发中的重要领域,主要用于数据安全和身份验证。在这个快速入门教程中,我们将探讨Java如何实现这些功能,并提供基础实践。 一、Java加密 1. 密码学基础:了解对称加密(如AES)和非...
下面将详细介绍这些算法以及它们在Java中的实现,以及如何进行数字签名和数字证书的验证。 1. **SM2算法**:SM2是一种基于椭圆曲线密码学(ECC)的公钥加密算法,用于非对称加密。它提供了密钥交换、签名和验证的...
本文将深入探讨如何使用Java语言结合RSA算法,通过数字证书实现文件的加密和解密操作。RSA是一种非对称加密算法,它的核心在于一对密钥:公钥和私钥。公钥可以公开给任何人,用于加密数据;而私钥必须保密,用于解密...
在Java编程环境中,数字证书和数字签名是网络安全和数据完整性的重要组成部分。这些概念与Java的加密库和证书处理机制紧密相关。在这个项目中,我们似乎有一个包含Java实现数字证书和数字签名功能的源码模块。 首先...
Java加密和数字签名是网络安全领域中的重要概念,用于保护数据的隐私和完整性。在Java中,这些技术得到了广泛的应用和支持。 1. **消息摘要**: 消息摘要是一种单向散列函数,用于生成消息的固定长度表示,通常...
Java 数字签名和数字证书是网络安全领域中的重要概念,它们在确保数据的完整性和来源的可信性方面扮演着关键角色。这份"Java 数字签名、数字证书生成源码"的压缩包提供了实现这些功能的代码示例,对于理解和应用Java...
Java 数字签名与数字证书是安全领域中的重要概念,它们在软件开发中起着至关重要的作用,尤其是在确保数据完整性和身份验证方面。本资源包含的Java代码工具包提供了生成数字签名和数字证书的源码,这有助于开发者...
Java 数字签名与数字证书是网络安全领域中的重要概念,它们在确保数据的完整性和来源的可信性方面扮演着关键角色。在这个"Java 数字签名、数字证书生成源码"压缩包中,包含了实现这些功能的源代码,对于理解Java安全...
Java代码生成数字证书涉及到几个关键概念和技术,包括Java的密钥和证书管理、RSA加密算法以及非交互式证书创建。在此,我们将深入探讨这些主题,以便理解如何在Java环境中生成和使用数字证书。 1. **数字证书**:...
在Java中,数字签名通常使用X.509证书来存储公钥和私钥对,这些证书用于实现非对称加密算法,如RSA或DSA。本项目是一个基于Java的数字签名、验签以及加密解密的开发工程,提供了直接进行二次开发和测试的基础。 ...
在IT领域,数字签名和数字证书...综上所述,数字签名和数字证书是保障网络通信安全的关键技术,Java提供了丰富的API支持这些操作的实现。在实际应用中,理解并正确使用这些概念和工具对于构建安全的网络系统至关重要。
"java数字签名和证书应用" 数字签名是指使用某种签名算法对某些内容进行数字签名后得到的数字凭证。证书(Certificate)是数字签名的一种特殊形式,是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的,...
- **JCA (Java Cryptography Architecture)**:提供了加密框架,支持证书管理、数字签名、消息摘要等功能。 - **JCE (Java Cryptography Extension)**:扩展了JCA的功能,提供了更丰富的加密算法、密钥管理和消息...
本文将深入探讨数字证书的基本概念,以及如何利用Java技术实现浏览器与服务器之间基于数字证书的安全通信,重点在于数字证书的签名和验证过程。 #### 数字证书及其重要性 数字证书是一种在网络上验证用户身份的...
5. 使用数字证书:在Java程序中,可以通过KeyStore类加载和使用证书,进行加密、解密、签名和验证签名操作。 例如,使用jarsigner工具给Applet签名,可以突破Applet的权限限制: ```bash jarsigner -keystore ...
在给定的压缩包"基于java的数字签名、数字证书生成源码.zip"中,可能包含了一些示例代码,例如如何使用Java API来实现数字签名的生成和验证,以及如何生成自签名的数字证书。这些源码可能涵盖了以下步骤: 1. 导入...
Java 数字签名和数字证书是网络安全领域中的重要概念,它们在确保数据的完整性和认证信息来源的可靠性方面发挥着关键作用。在这个Java源码包中,我们可能找到了用于生成数字签名和数字证书的相关代码,这对于理解和...