`
yuankai
  • 浏览: 105940 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

javascript与Capicom实现显示证书信息

阅读更多
首先介绍下什么是Capicom:
Capicom是Windows操作系统为我们提供了先进的加密体系模型CryptAPI,同时该模型也提供了丰富的函数供第三方开发使用。但使用CryptAPI完成一些通常的操作(如:加密、签名)仍然是相当复杂的。幸好MS同时提供了CAPICOM组件,封装了上述的复杂操作,使你只需要调用一两个函数,就可以完成指定的功能。CAPICOM是一个COM模型的组件,可以在Windows环境下各种语言中使用。而且,CAPICOM中的大多数接口都是“脚本安全”的,这意味着你可以在浏览器网页脚本中安全地使用这些接口所提供的功能。

Capicom官方API地址:
http://msdn.microsoft.com/en-us/library/aa380256(VS.85).aspx
下面介绍下怎么使用这个例子(浏览器必须是IE,还有IE中需要有数字证书):
1.把附件的例子下载到本地后,打开可以看到一个叫cert的文件夹,这个里面包含了一个证书,这个是一个HongKong Post Cert,把这个证书导如到你的IE浏览器中(点工具->Internet 选项->内容->证书->导入,接下来就一步步操作,选择证书,然后输入密码,证书的密码为12345678)。
2.找到GDCA_CAPICOM.HTM这个文件,右键选择打开方式为IE,然后IE会弹出一个是否允许运行ActiveX插件,允许就可以了。
3.如果你的IE中有证书的话,在页面会显示你证书的信息,然后选择你要查看的证书,点击显示选定证书信息按钮,就会在下面显示你当前选择的证书信息(这个显示证书信息的做得比较寒酸,就在当前也没加了一个层,然后显示在了这个层的里面  ).
4.收工。
4
1
分享到:
评论
2 楼 tuoxie007 2010-08-19  
请教,我想在前台用js签名,后台用java验证,但是校验不能成功,我发现了以下现象:
1. 你的签名里用了当前时间做干扰,那么我不知道如何用java来校验了,所以我就把时间干扰去掉了,但依然不能校验成功;
2. 我发现你在签名的时候,有几个下拉框,让选择哪种算法,但是js里貌似并没有读取这个select的值,所以这个Hash算法的选择是没有起到作用的;
3. 既然是没有选择使用哪种Hash算法,那么在签名的时候会不会隐式的使用了某种Hash算法呢?我不得而知;
4. 如果隐式的使用了默认的Hash算法,信息摘要的长度就是固定的,则签名的长度也应该是固定的,但我发现并不是这样的,签名的长度和明文的长度有关系,但不是正比例关系,而是一种一次线性关系;
5. 我试图用java对相同的文本做一次签名,从而对比一下和js产生的签名值是否是一样的,但是我却发现页面上js签名出来的值比java签名出来的长很多,无论我在java里使用了哪种签名算法都是这样,我实在不知道那个是合理的。

这里贴一下我后台的一点主要代码
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * Servlet implementation class PersonShowServlet
 */
public class PersonShowServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	private String signatureAlgorithm = "SHA1withRSA";

    /**
     * @see HttpServlet#HttpServlet()
     */
    public PersonShowServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    
//在这里后台做签名与js相比较
	public static void main(String[] args) throws ServletException,
			IOException, KeyStoreException, NoSuchAlgorithmException,
			CertificateException, UnrecoverableKeyException {
		PersonShowServlet pss = new PersonShowServlet();
		byte[] bytes = "Hello 1".getBytes("UTF-8");//pss.digest("Hello 1");
		byte[] signedBytes = pss.doSign(bytes, CertificateUtil.loadPrivateKey("E:/tmp/pki-crt/mark.jks"));
		String signedB64 = new BASE64Encoder().encode(signedBytes);
		System.out.println(signedB64);
		
		Resource resource = new ClassPathResource("/com/apusic/portal/ldap/demo/spring-ldap.xml");
		BeanFactory factory = new XmlBeanFactory(resource);
		UserDao userDao = (UserDao) factory.getBean("userDao");
		String dn = "cn=mark";
		Person person = userDao.getPersonByDn(dn);
		PublicKey publicKey = CertificateUtil.loadCertificate(person).getPublicKey();
		boolean result = pss.doVerify(bytes, publicKey,  new BASE64Decoder().decodeBuffer(signedB64));
		System.out.println(result);
	}

//在这里校验js生成的签名
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String text = request.getParameter("loginMsgText");
		String security = request.getParameter("loginMsgSecurity");
		System.out.println(security.length());
		byte[] signed = new BASE64Decoder().decodeBuffer(security);
		Resource resource = new ClassPathResource("/com/apusic/portal/ldap/demo/spring-ldap.xml");
		BeanFactory factory = new XmlBeanFactory(resource);
		UserDao userDao = (UserDao) factory.getBean("userDao");
		String dn = "cn=mark";
		Person person = userDao.getPersonByDn(dn);
		try {
		    byte[] digest = text.getBytes();//digest(text);
		    PublicKey publicKey = CertificateUtil.loadCertificate(person).getPublicKey();
		    if(doVerify(digest, publicKey, signed)){
		    	response.getWriter().println("verified, it's OK");
		    }else{
		    	response.getWriter().println("verified, it's Invalid");
		    }
		} catch (CertificateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    
    private byte[] doSign(byte[] digest, PrivateKey priKey){
        // do sign for the message digest
        java.security.Signature signature = null;
        try {
            signature = java.security.Signature.getInstance(signatureAlgorithm);
        } catch (NoSuchAlgorithmException e) {
        }
        try {
            signature.initSign(priKey);
        } catch (InvalidKeyException e) {
        }
        try {
            signature.update(digest);
        } catch (java.security.SignatureException e) {
            //could not happen after the initialization
        }
        byte[] signed = null;
        try {
            signed = signature.sign();
        } catch (java.security.SignatureException e) {
        }
        return signed;
    }

    private boolean doVerify(byte[] digest, PublicKey pubKey, byte[] signedInfo) {
        // do verify
        java.security.Signature signature = null;
        try {
            signature = java.security.Signature.getInstance(signatureAlgorithm);
        } catch (NoSuchAlgorithmException e) {
            return false;
        }
        try {
            signature.initVerify(pubKey);
        } catch (InvalidKeyException e) {
            return false;
        }
        
        try {
            signature.update(digest);
        } catch (java.security.SignatureException e) {
            return false;
        }
        try {
            return signature.verify(signedInfo);
        } catch (java.security.SignatureException e) {
            return false;
        }
    }

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


我现在是陷入绝境了,实在没办法了,兄台要是有时间,还望帮我看看,谢谢了!
1 楼 tuoxie007 2010-08-11  
太强了,多谢

相关推荐

Global site tag (gtag.js) - Google Analytics