`
jasonw68
  • 浏览: 149244 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数字证书JAVA 后台处理

    博客分类:
  • J2SE
阅读更多
package com.gg.test;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;



public class TestSecurity {

	public static void main(String[] args){
		String caName="c:\\certificate.crt";
		TestSecurity ts = new TestSecurity();
		System.out.println("****读出数字证书******");
		ts.readNormal(caName);
		System.out.println("*****以字符串形式读出证书中得所有信息*****");
		ts.readBin(caName);
		
	}
	
	//读出证书方法
	public int readNormal(String caName){
		try {
			CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); //载入证书类型
			InputStream is = new FileInputStream(caName);//输入文件
			X509Certificate x509certificate =(X509Certificate) certFactory.generateCertificate(is);//解释输入文件
			/*打印一系列信息*/
			System.out.println( "类型: "+x509certificate.getType());//类型,此处为X.509
			System.out.println( "版本: "+x509certificate.getVersion());//版本
			System.out.println( "标题: "+x509certificate.getSubjectDN().getName());//标题
			System.out.println( "得到开始的有效日期: "+x509certificate.getNotBefore().toString());//得到开始的有效日期
			System.out.println( "得到截止的日期: "+x509certificate.getNotAfter().toString());//得到截止的日期
			System.out.println( "得到序列号: "+x509certificate.getSerialNumber().toString(16));//得到序列号
			System.out.println( "得到发行者名: "+x509certificate.getIssuerDN().getName());//得到发行者名
			System.out.println( "得到签名算法: "+x509certificate.getSigAlgName());//得到签名算法
			System.out.println( "得到公钥算法: "+x509certificate.getPublicKey().getAlgorithm());//得到公钥算法
			
			is.close();//关闭流
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
		return 0;
	}
	
	//以字符串形式读出证书中得所有信息
	public int readBin(String caName){
		try {
			InputStream is = new FileInputStream(caName);
			DataInputStream dis = new DataInputStream(is);
			CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
			byte[] bytes = new byte[dis.available()];
			dis.readFully(bytes);
			ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
			while(bais.available()>0){
				X509Certificate cert = (X509Certificate) certFactory.generateCertificate(bais);
				
				System.out.println(cert.toString());
			}
			is.close();
			dis.close();
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
		return 0;	
	}
	/*
	 * 使用自签证书实例
	 */
	public static void crypt(byte[] cipherText,String file){
		try {
			//生成公钥
			KeyGenerator keyGen = KeyGenerator.getInstance("DES");
			keyGen.init(56);
			Key key = keyGen.generateKey();
			
			//生成DES的Cipher
			Cipher cdes =Cipher.getInstance("DES");
			cdes.init(Cipher.ENCRYPT_MODE, key);
			byte[] ct = cdes.doFinal(cipherText);
			
			try {
				//加密后的文件写回磁盘
				FileOutputStream out = new FileOutputStream(file);
				out.write(ct);
				out.close();
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	/*
	 * 把消息发送给CA进行消息签名,或者说生成数字证书
	 */
	public void signature(byte[] sigText,String file,String pswd,String keyStore,String alias){
		char[] kpass;
		int i;
		try {
			KeyStore ks = KeyStore.getInstance("JKS");
			
			//keyStore默认为名字为.keyStore得隐藏文件,在用户的主目录下
			BufferedInputStream ksbufin = new BufferedInputStream(new FileInputStream(keyStore));
			
			//访问keyStore的密码
			kpass = new char[pswd.length()];
			for(i=0;i<pswd.length();i++){
				kpass[i]= pswd.charAt(i);
			};
			ks.load(ksbufin,kpass);
			
			//取得CA得私钥来进行数字签名
			PrivateKey priv =(PrivateKey)ks.getKey(alias, kpass);
			Signature rsa = Signature.getInstance("MD5withRSA");
			rsa.initSign(priv);
			rsa.update(sigText);
			byte[] sig = rsa.sign();
			System.out.println("sig is done");
			try {
				FileOutputStream out = new FileOutputStream(file);
				out.write(sig);
				out.close();
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	/*
	 * 接收消息对数字证书进行验证
	 */
	public static void veriSignature(byte[] updateData,byte[] sigedText,String certName){
		try {
			CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
			FileInputStream fin = new FileInputStream(certName);
			X509Certificate cert = (X509Certificate) certFactory.generateCertificate(fin);
			
			//通过自签证书获得公钥
			PublicKey pub = cert.getPublicKey();
			Signature rsa = Signature.getInstance("MD5withRSA");
			rsa.initVerify(pub);
			rsa.update(updateData);
			//验证
			boolean verifies = rsa.verify(sigedText);
			System.out.println("verified "+ verifies);
			if(verifies){
				System.out.println("Verify is done!");
			}else{
				System.out.println("verify is not successful");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
}

 

分享到:
评论

相关推荐

    JAVA使用数字证书加密文件

    利用java读取PFX中的公钥和私钥对,采用RSA算法对文件进行加密解密。

    证书系统Java实现

    利用MS的CAPICOM控件与Java结合实现B/S系统中的数字签名 功能描述:  在前台利用CAPICOM读取USB盘中的证书与用户私钥,对明文求SHA1的摘要,并对摘要进行签名。  仅将签名后的密文与前台表单中的明文传到后台。

    功能全面的CA证书管理系统EJBCA6.2.0

    功能全面的CA证书管理系统,基于J2EE架构,自建认证中心的参考代码,很有价值

    合肥贞龙JAVA版本B2B电子商务平台

     荣誉证书、获奖资料在线上传展示  企业商铺站点栏目可自定义,支持多套模板选择站点风格  完备的供求发布、管理和对接体系,同时有询价和留言跟踪系统  无限级类别支持无限级类别,并支持类别排序功能  ...

    数字阅读资源共享小程序.zip

    系统实现了图书、摄影照片、电影资源、电台和读诗音频等数字阅读资源的共享,服务器部署使用腾讯云学生服务器,SSL证书在Tomcat8.5里部署,整个系统分为三个部分: 1.前端(CloudSpace)为小程序展示页面,使用微信...

    spring-cloud-digital-sign:在PDF文档中签署个人RSA2证书,使用编码,请不要使用

    spring-cloud-digital-sign Sign personal RSA2 certificate in PDF documents, under coding, ...调用封装好的签名算法,将数字证书签署在转换好的PDF合同上 How to use I am making big change, please don't use

    2009.6.19—30举办3S研讨会暨Google Earth与Google Map等仿真建模与共享及ARCGIS与遥感高级程序员培训班

    赠送所需的GOOGLE EARTH与当前其它遥感图像的共享软件及其自动数字化与后台自动转换地理矢量数据软件各1套;赠送网上三维建模软件及有关虚拟现实三维建模软件及其三个实例(.exe仿真交互式软件)及PPT;另赠送GOOGLE...

    NTKO文档在线编辑控件4.0.1.2

    NTKO OFFICE文档控件支持在线编辑,痕迹保留,手写签名,电子印章,全屏批注,电子签名[数字签名,数字证书签名],简单OCR等实用功能,支持PHP,ASP,JSP,C#,VB.NET,DOMINO等各种web编程语言和服务器。 NTKO OFFICE文档...

    NTKO文档在线编辑控件独立安装包4.0.6.5(适合TA2009\2010\2011版本)

    同时支持联合签名,证书吊销列表等功能。另外,NTKO OFFICE文档控件3.0版本还支持数字签名的信任程度显示。http://www.ntko.com --联机演示,OA系统开发的最佳选择组件!详细功能列表(带★为特色功能) ★ 所见即...

    ORACLE9i_优化设计与系统调整

    §11.2 后台进程与跟踪文件 128 §11.3 用户跟踪文件 128 §11.4 动态性能视图 129 §11.5 UTLBSTAT和UTLESTAT 129 §11.6 STATSPACK 129 §11.7 Oracle等待事件 129 §11.8 Oracle诊断和调整包 129 第12章 优化SQL...

    C#微软培训资料

    8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计...

Global site tag (gtag.js) - Google Analytics