⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sslsignature_record.java

📁 身份认证和数字签名在实际应用中是通过以数字证书为核心的公开密钥基础结构(PKI)来实现的
💻 JAVA
字号:
/****************************************************************
* 软件:Java签名协议扩展 (Java Signature Protocol Extension, JSPE)
* 版本:V1.0
* 软件功能:实现SSL签名协议
* 模块:公共类SSLsignature_record
*-----------------------------------------------------------------
*                                 版权所有:中山大学软件研究所 2002
*                          Programmed by 佛山张峰岭 fszfl@21cn.com
*                                              2002.4 - 2002.5
*****************************************************************/
package com.zsusoft.zfl;
import java.io.*;
import java.util.*;
/********************************************
*  类SSLsignature_record的对象实例保存一次完整SSL签名过程的所有记录信息
* 包括签名请求消息,签名响应消息,签名请求者的证书,签名响应者的证书。
* 类中有把自身对象保存到文件和从文件中恢复的方法;把成员内容输出成可视字符串的方法。
* 这个类的对象产生的文件可以作为支持不可否认性的证据,
* 类中的main方法就支持在命令行解释SSLsignature_record对象格式的文件。.
********************************************/
public class SSLsignature_record implements Serializable
{
	private boolean IamRequester;
	/**
	* 随机数,可以用于索引
	**/
	public SSLRandom random;
	/**
	* 签名请求信息
	**/    
	public Signature_request signature_request;
	/**
	* 签名回应
	**/   
	public Signature_reply signature_reply;
	/**
	* 本方的X509证书
	**/       
	public java.security.cert.Certificate my_certificate;
	/**
	* 对方的X509证书
	**/  
	public javax.security.cert.Certificate partner_certificate;  
   /**
   *  本构造函数为请求者调用
   *  (注:做成两个生成函数因为partner的证书从SSL Session(会话)中取得
   *  从SSL session中取得的证书类型与从Java Key Store加载的不兼容,这个问题等候Sun解决)
   *  理论上签名涉及的双方都要保存签名记录作为不可否认的证据
   **/
    public SSLsignature_record(Signature_request S_request,Signature_reply S_reply,java.security.cert.Certificate requester,
           javax.security.cert.Certificate replier){
           random=S_request.random;
           signature_request = S_request;
           signature_reply = S_reply;
           my_certificate = requester;
           partner_certificate = replier;
           IamRequester = true;
    }
   /**
   *  本构造函数为响应者调用
   **/
    public SSLsignature_record(Signature_request S_request,Signature_reply S_reply,javax.security.cert.Certificate requester,
           java.security.cert.Certificate replier){
           random=S_request.random;
           signature_request = S_request;
           signature_reply = S_reply;
           partner_certificate = requester;
           my_certificate = replier;
           IamRequester = false;  //我是响应者
    }
   /**
   *  从文件中恢复SSLsignature_record对象实例
   *  filename是保存SSLsignature_record对象的文件名
   *  
   **/ 
    public static SSLsignature_record restore_from_file(String filename)
    {
    	SSLsignature_record S_record = null;
    	try {
    		ObjectInputStream Objectfile = new ObjectInputStream(
    		   new FileInputStream(filename));
    		S_record = (SSLsignature_record) Objectfile.readObject();
    		Objectfile.close();
    	} catch(Exception e){
    		System.err.println("无法从文件"+filename+"中恢复SSLsignature_record对象。原因:"+ e.getMessage());
    		e.printStackTrace();
        }
          return S_record;
    }
   /**
   *  把本SSLsignature_record对象保存到文件中
   *  filename是文件名
   *  成功返回true
   **/
     public boolean save_to_file(String filename)
     {
     	try {
     		ObjectOutputStream Objectfile = new ObjectOutputStream(
     		   new FileOutputStream(filename));
     		Objectfile.writeObject(this);
     		Objectfile.close();
     		return true;
     	} catch(Exception e){
    		System.err.println("保存SSLsignature_record对象到文件"+filename+"出错。原因:"+ e.getMessage());
    		e.printStackTrace();
    		return false;
        }
     }
   /**
   *  保存到缺省文件中
   *  缺省文件取名方式  日期_时间.请求者Subject Distinguished Name中的CN_响应者Subject Distinguished Name中的CN
   *    文件名格式:YYYY_MM_DD_HH_MM_SS.AAABBB_CCCDDD  
   *         AAABBB表示请求者Subject Distinguished Name中的CN
   *         CCCDDD表示响应者Subject Distinguished Name中的CN
   **/
     public boolean save_to_file()
     {
     	String my_SubjectDN = null;
     	String partner_SubjectDN = null;
     	String my_SubjectDN_CN = null;
     	String partner_SubjectDN_CN = null;
     	my_SubjectDN = ((java.security.cert.X509Certificate)my_certificate).
     			   getSubjectDN().getName();
     		       {
     			int begin=my_SubjectDN.indexOf("CN=");    //定位CN域头
                 	int end=my_SubjectDN.indexOf(",",begin);  //定位CN域尾
                 	if(end<0){
                   		my_SubjectDN_CN=my_SubjectDN.substring(begin+3);
                 	}
                 	else{
                   		my_SubjectDN_CN=my_SubjectDN.substring(begin+3,end);
                 	}
                       }
        partner_SubjectDN = ((javax.security.cert.X509Certificate)partner_certificate).
     			   getSubjectDN().getName();
     		      {
     			int begin=partner_SubjectDN.indexOf("CN=");    //定位CN域头
                 	int end=partner_SubjectDN.indexOf(",",begin);  //定位CN域尾
                 	if(end<0){
                   		partner_SubjectDN_CN=partner_SubjectDN.substring(begin+3);
                 	}
                 	else{
                   		partner_SubjectDN_CN=partner_SubjectDN.substring(begin+3,end);
                 	}
                      }
        Date date = new Date(random.gmt_unix_time);
        String filename = null;
        if ( IamRequester ) filename = Integer.toString(date.getYear()+1900) + "_" +
              Integer.toString(date.getMonth()+1) + "_" + Integer.toString(date.getDate()) + "_" +
              Integer.toString(date.getHours()) + "_" + Integer.toString(date.getMinutes()) + "_" +
              Integer.toString(date.getSeconds()) +
              "."+my_SubjectDN_CN+"_"+partner_SubjectDN_CN;
        else
            filename = Integer.toString(date.getYear()+1900) + "_" +
              Integer.toString(date.getMonth()+1) + "_" + Integer.toString(date.getDate()) + "_" +
              Integer.toString(date.getHours()) + "_" + Integer.toString(date.getMinutes()) + "_" +
              Integer.toString(date.getSeconds()) +
              "."+partner_SubjectDN_CN+"_"+my_SubjectDN_CN;
        return save_to_file(filename);
     }
   /**
   *   本SSLsignature_record对象的内容转换成可视的字符串
   **/ 
     public String toString()
     {
     	String return_str = "交易时间:"+(new Date(random.gmt_unix_time)).toString()+"\r\n";
     	if (IamRequester) //我是请求者
     	{
     	 return_str +="请求者证书:\r\n";
     	 return_str += my_certificate.toString()+"\r\n";
     	 return_str += "签名请求的内容:\r\n";
     	 return_str += signature_request.toString()+"\r\n";
     	 return_str += "响应者证书:\r\n";
     	 return_str += partner_certificate.toString()+"\r\n";
     	 return_str += "签名响应的内容:\r\n";
     	 return_str += my_certificate.toString()+"\r\n";
	}
	else
	{
     	 return_str +="请求者证书:\r\n";
     	 return_str += partner_certificate.toString()+"\r\n";
     	 return_str += "签名请求的内容:\r\n";
     	 return_str += signature_request.toString()+"\r\n";
     	 return_str += "响应者证书:\r\n";
     	 return_str += my_certificate.toString()+"\r\n";
     	 return_str += "签名响应的内容:\r\n";
     	 return_str += signature_reply.toString()+"\r\n";
     	}
     	return return_str;
     }
  /**
  *  main:解释一个签名记录文件
  *  用法:java com.zsusoft.zfl.SSLsignature_record 文件名
  **/
  public static void main(String args[])
   {
   	if ( args.length != 1){
   		System.err.println("用法:java com.zsusoft.zfl.SSLsignature_record 文件名");
   		System.exit(-1);
   	}
   	SSLsignature_record record = SSLsignature_record.restore_from_file(args[0]);
   	if ( record != null ){
   		System.out.println(record.toString());
   	}
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -