`

使用JAVA数字证书做数字签名认证

    博客分类:
  • pki
阅读更多

1.
keytool -genkey -keystore chinajavaworld.keystore -alias chinajavaworld

这个命令用来产生一个密匙库,执行完毕后会在当前操作目录中产生一个chinajavaworld.keystore的文件,在执行命令的时候还有提示你输入密匙库的密码,要记住,后面还要用到。

2.
keytool -export -keystore chinajavaworld.keystore -alias chinajavaworld -file chinajavaworld.cer

这个命令用来产生签名时所要用的证书。

3.在JAVA里操作,将Cer内容改为BASE64编码

Java代码 复制代码
  1. //从密钥库中读取CA证书   
  2. String storepass = "123456";//前面设置的密码   
  3. FileInputStream in = new FileInputStream("e:\\license\\a\\chinajavaworld.keystore");   
  4. KeyStore ks = KeyStore.getInstance("JKS");   
  5. ks.load(in, storepass.toCharArray());   
  6. //获取证书   
  7. java.security.cert.Certificate c1 = ks.getCertificate("chinajavaworld");   
  8. //BASE64编码   
  9. System.out.println(StringUtils.encodeBase64(c1.getEncoded()));//将chinajavaworld.cer内容改为这里输出的内容  
//从密钥库中读取CA证书
String storepass = "123456";//前面设置的密码
FileInputStream in = new FileInputStream("e:\\license\\a\\chinajavaworld.keystore");
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(in, storepass.toCharArray());
//获取证书
java.security.cert.Certificate c1 = ks.getCertificate("chinajavaworld");
//BASE64编码
System.out.println(StringUtils.encodeBase64(c1.getEncoded()));//将chinajavaworld.cer内容改为这里输出的内容



4.开始产生(测试)签名
     

Java代码 复制代码
  1. Signature signature;   
  2.        try  
  3.        {   
  4.            InputStream streamCert = new java.io.FileInputStream(   
  5.                        "e:\\license\\a\\test.cer");   
  6.            CertificateFactory factory = CertificateFactory.getInstance("X.509");   
  7.            Certificate cert = factory.generateCertificate(streamCert);   
  8.            System.out.println(StringUtils.encodeBase64(cert.getEncoded()));   
  9.            signature = Signature.getInstance("SHA1withDSA");   
  10.            signature.initVerify(cert.getPublicKey());   
  11.   
  12.             //要签名的指纹内容   
  13.            String sss = "Welcome to www.chinajavaworld.com,The java world for you forever.";   
  14.            //获取CA证书私钥   
  15.            PrivateKey priKey=(PrivateKey)ks.getKey("test",storepass.toCharArray());   
  16.            System.out.println("priKey:"+StringUtils.encodeHex(priKey.getEncoded()));   
  17.               
  18.            //用私钥签名   
  19.            sig = Signature.getInstance("SHA1withDSA");   
  20.            sig.initSign(priKey);   
  21.            ByteArrayOutputStream streamRaw0 = new ByteArrayOutputStream();   
  22.            DataOutputStream streamSig0 = new DataOutputStream(streamRaw0);   
  23.            streamSig0.writeUTF(sss);   
  24.            sig.update(streamRaw0.toByteArray());   
  25.            String signatureS = StringUtils.encodeHex(sig.sign());   
  26.            System.out.println("signature:  "+signatureS);   
  27.   
  28.            //用公钥做验证测试   
  29.            System.out.println("pubKey:"+StringUtils.encodeHex(cert.getPublicKey().getEncoded()));   
  30.            ByteArrayOutputStream streamRaw = new ByteArrayOutputStream();   
  31.            DataOutputStream streamSig = new DataOutputStream(streamRaw);   
  32.            streamSig.writeUTF(sss);   
  33.            signature.update(streamRaw.toByteArray());   
  34.            System.out.println("verify:   "+signature.verify(StringUtils.decodeHex(signatureS)));   
  35.        }   
  36.        catch(Exception e)   
  37.        {   
  38.            System.out.println(e);   
  39.        }  
 Signature signature;
        try
        {
            InputStream streamCert = new java.io.FileInputStream(
                        "e:\\license\\a\\test.cer");
            CertificateFactory factory = CertificateFactory.getInstance("X.509");
            Certificate cert = factory.generateCertificate(streamCert);
            System.out.println(StringUtils.encodeBase64(cert.getEncoded()));
            signature = Signature.getInstance("SHA1withDSA");
            signature.initVerify(cert.getPublicKey());
 
           	//要签名的指纹内容
            String sss = "Welcome to www.chinajavaworld.com,The java world for you forever.";
            //获取CA证书私钥
            PrivateKey priKey=(PrivateKey)ks.getKey("test",storepass.toCharArray());
            System.out.println("priKey:"+StringUtils.encodeHex(priKey.getEncoded()));
            
            //用私钥签名
            sig = Signature.getInstance("SHA1withDSA");
            sig.initSign(priKey);
            ByteArrayOutputStream streamRaw0 = new ByteArrayOutputStream();
            DataOutputStream streamSig0 = new DataOutputStream(streamRaw0);
            streamSig0.writeUTF(sss);
            sig.update(streamRaw0.toByteArray());
            String signatureS = StringUtils.encodeHex(sig.sign());
            System.out.println("signature:  "+signatureS);
 
            //用公钥做验证测试
            System.out.println("pubKey:"+StringUtils.encodeHex(cert.getPublicKey().getEncoded()));
            ByteArrayOutputStream streamRaw = new ByteArrayOutputStream();
            DataOutputStream streamSig = new DataOutputStream(streamRaw);
            streamSig.writeUTF(sss);
            signature.update(streamRaw.toByteArray());
            System.out.println("verify:   "+signature.verify(StringUtils.decodeHex(signatureS)));
        }
        catch(Exception e)
        {
            System.out.println(e);
        }



接下来,你就可以把chinajavaworld.cer和签名放在你的产品目录里了。认证的时候读取cer证书中的公钥,对签名内容进行认证就可以了。


  

Java代码 复制代码
  1. public static String encodeBase64(byte data[])   
  2.     {   
  3.         boolean lineSep = false;   
  4.         int sLen = data == null ? 0 : data.length;   
  5.         if(sLen == 0)   
  6.             return new String("");   
  7.         int eLen = (sLen / 3) * 3;   
  8.         int cCnt = (sLen - 1) / 3 + 1 << 2;   
  9.         int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0);   
  10.         char dArr[] = new char[dLen];   
  11.         int s = 0;   
  12.         int d = 0;   
  13.         int cc = 0;   
  14.         do  
  15.         {   
  16.             if(s >= eLen)   
  17.                 break;   
  18.             int i = (data[s++] & 0xff) << 16 | (data[s++] & 0xff) << 8 | data[s++] & 0xff;   
  19.             dArr[d++] = CA[i >>> 18 & 0x3f];   
  20.             dArr[d++] = CA[i >>> 12 & 0x3f];   
  21.             dArr[d++] = CA[i >>> 6 & 0x3f];   
  22.             dArr[d++] = CA[i & 0x3f];   
  23.             if(lineSep && ++cc == 19 && d < dLen - 2)   
  24.             {   
  25.                 dArr[d++] = '\r';   
  26.                 dArr[d++] = '\n';   
  27.                 cc = 0;   
  28.             }   
  29.         } while(true);   
  30.         int left = sLen - eLen;   
  31.         if(left > 0)   
  32.         {   
  33.             int i = (data[eLen] & 0xff) << 10 | (left != 2 ? 0 : (data[sLen - 1] & 0xff) << 2);   
  34.             dArr[dLen - 4] = CA[i >> 12];   
  35.             dArr[dLen - 3] = CA[i >>> 6 & 0x3f];   
  36.             dArr[dLen - 2] = left != 2 ? '=' : CA[i & 0x3f];   
  37.             dArr[dLen - 1] = '=';   
  38.         }   
  39.         return new String(dArr);   
  40.     }   
  41.        
  42.        
  43.     public static final String encodeHex(byte bytes[])   
  44.     {   
  45.         StringBuffer buf = new StringBuffer(bytes.length * 2);   
  46.         for(int i = 0; i < bytes.length; i++)   
  47.         {   
  48.             if((bytes[i] & 0xff) < 16)   
  49.                 buf.append("0");   
  50.             buf.append(Long.toString(bytes[i] & 0xff16));   
  51.         }   
  52.     
  53.         return buf.toString();   
  54.     }   
  55.        
  56.        
  57.     public static final byte[] decodeHex(String hex)   
  58.     {   
  59.         char chars[] = hex.toCharArray();   
  60.         byte bytes[] = new byte[chars.length / 2];   
  61.         int byteCount = 0;   
  62.         for(int i = 0; i < chars.length; i += 2)   
  63.         {   
  64.             int newByte = 0;   
  65.             newByte |= hexCharToByte(chars[i]);   
  66.             newByte <<= 4;   
  67.             newByte |= hexCharToByte(chars[i + 1]);   
  68.             bytes[byteCount] = (byte)newByte;   
  69.             byteCount++;   
  70.         }   
  71.     
  72.         return bytes;   
  73.     }  
分享到:
评论
1 楼 01jiangwei01 2012-07-21  
CA[i >>> 18 & 0x3f];  
这里的CA是什么啊?

相关推荐

    Certificate_java_java数字签名_java签名证书_数字证书_

    总之,Java数字证书和数字签名是构建安全网络应用的核心技术,这个源码模块提供了一种实际的实现方式,可以帮助开发者更好地理解和应用这些概念。通过深入学习和实践,你可以提升在网络安全领域的专业技能,为构建更...

    java获取数字证书信息

    在本篇文章中,我们将深入探讨如何使用Java来获取数字证书的信息,包括使用TOMCAT和JDK搭建SSL服务的过程、如何用OpenSSL签发证书以及如何支持第三方CA等内容。 #### 一、使用TOMCAT和JDK搭建SSL服务 ##### 1. ...

    Java实现浏览器CA证书的签名和验证

    本文利用Java技术实现客户端数字证书的签名和验证,关键在于理解数字签名的工作原理。数字签名是使用发送者的私钥对消息或文档进行加密的一种方式,接收者或其他人可以使用发送者的公钥来验证签名。这个过程确保了...

    JAVA 用代码生成数字证书源码

    在Java编程环境中,生成数字证书是一项关键的安全技术,主要用于数据加密、身份验证和签名等应用场景。数字证书通常包含了公钥和私钥对,以及证书持有者的相关信息,这些信息经过认证机构(CA)的签名,确保了证书的...

    Java 数字签名、数字证书生成源码

    Java 数字签名和数字证书是网络安全领域中的重要概念,它们在确保数据的完整性和认证信息来源的可靠性方面发挥着关键作用。在这个Java源码包中,我们可能找到了用于生成数字签名和数字证书的相关代码,这对于理解和...

    java安全通信数字证书

    本篇文章将深入探讨Java中如何实现安全通信、生成和使用数字证书。 首先,我们了解两个基础概念:消息摘要和消息验证码。消息摘要是一种算法,通过该算法对原始数据进行处理,生成一个固定长度的摘要值,类似于数据...

    java 实现数字证书的操作实现网络安全

    通过“Window” -&gt; “Preferences” -&gt; “Java” -&gt; “Installed JREs” -&gt; “Default VM arguments”添加Keystore路径和密码,以便在开发和测试过程中使用自定义的数字证书。 8. **数字证书与网络安全**: 数字...

    Java 数字签名和验证

    以上代码展示了Java中如何使用RSA、DSA和ECC实现数字签名和验证的基本流程。实际应用中,可能还需要考虑密钥的存储和管理、证书链的验证等复杂情况。在提供的`JavaSignVerify`压缩包文件中,可能包含了示例代码,...

    信息安全大作业-CA系统的设计和实现源码(电子认证服务系统-数字证书数字签名python语言)+项目详细说明.7z

    信息安全大作业_CA系统的设计和实现源码(电子认证服务系统_数字证书数字签名python语言)+项目详细说明.7z CA代表Certificate Authority。也就是电子认证服务或机构,为电子签名相关各方提供真实性和可靠性验证,是...

    java数字签名(可用)

    Java 数字签名是一种用于验证数据完整性和发送者身份的...总的来说,Java数字签名提供了强大的安全功能,确保了在网络通信中的数据安全和身份认证。理解并正确使用数字签名和相关工具是开发安全的Java应用程序的基础。

    java数字签名的讲解

    在 Java 平台上,我们可以使用内置的 Keytool 和 Jarsigner 工具来实现数字签名的操作。以下是对这个主题的详细讲解: 一、数字签名的概念 数字签名并非我们日常生活中的笔迹签名,而是一种电子形式的签名,它结合...

    java数字签名

    在提供的`java数字签名jar.rar`和`java数字签名.zip`文件中,可能包含了具体的示例代码,展示了如何使用Java实现这些步骤。通过查看和学习这些代码,你可以更好地理解Java中的数字签名工作原理,以及如何在实际项目...

    java实现数字签名

    - **JCA (Java Cryptography Architecture)**:提供了加密框架,支持证书管理、数字签名、消息摘要等功能。 - **JCE (Java Cryptography Extension)**:扩展了JCA的功能,提供了更丰富的加密算法、密钥管理和消息...

    数字证书签名很强大的算法

    在编程中,我们可以通过特定的类库实现这一功能,而在实际网络环境中,数字证书签名广泛应用在各种安全场景,如加密通信、软件认证和设备身份验证。理解并掌握这一技术对于保障网络安全至关重要。

    Openssl与数字证书

    综上所述,通过对加密算法、数字摘要、数字签名、数字证书的理解以及OpenSSL的实际操作,我们可以有效地保护数据的安全性和完整性,确保在线通信的安全可靠。同时,结合HTTPS和Tomcat7等技术的应用,能够进一步增强...

    使用java 进行数字签名

    本文将深入探讨如何使用Java进行数字签名操作,结合提供的标签"源码"和"工具",我们将关注实际的代码实现。 首先,理解数字签名的概念至关重要。数字签名并非是数字的简单签名,而是一个通过加密算法生成的、与原文...

    Java加密和数字签名编程快速入门

    4. 签名与证书:数字签名通常与X.509证书结合使用,证书包含公钥和颁发者的身份信息,确保公钥的来源可信。 三、示例代码 在学习过程中,通过编写实际的Java代码来练习加密和数字签名的使用,例如: - 创建一个简单...

Global site tag (gtag.js) - Google Analytics