`

使用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是什么啊?

相关推荐

    在WEB应用中使用基于数字证书的登录验证

    在WEB应用中使用基于数字证书的登录验证

    java简单的数字签名系统

    计算机和网络技术的发展将人类带入信息化社会,随之而来的是倍受关注的信息安全问题。...然后通过使用Windows和Java安全的相关内容实现数字签名在单机上的模拟来更加深刻地了解其过程。最后是对本论文的总结。

    Java加密技术介绍.docx

    Java加密技术(六)——数字签名算法DSA Java加密技术(七)——非对称加密算法最高级ECC Java加密技术(八)——数字证书 Java加密技术(九)——初探SSL Java加密技术(十)——单向认证 Java加密技术(十一)——...

    JAVA上百实例源码以及开源项目

     Java 数字签名、数字证书的相关实例。  关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据...

    JAVA上百实例源码以及开源项目源代码

     Java 数字签名、数字证书的相关实例。  关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据...

    C/S架构,验证签名(java)

    包里面的jar文件是我从IBM网站上下载...程序的功能就是,客户端输入一个字符串,并且用自己的私钥进行签名,服务器端用客户端的公钥进行验证签名和传送的舒服,判断该数据是否被篡改。代码写的不规范,只是实现了功能。

    论文研究-ERP工作流引擎中的数字签名技术.pdf

    论述了工作流引擎在企业资源规划(ERP)系统中的主要功能后,为了能解决工作流运行过程中可能遇到的网络安全、法律效力等问题,提出了结合数字证书与数字签名技术的B/S解决方案,并结合Java授权与认证服务(Java ...

    Java加密与解密的艺术

    带有数字签名的加密网络应用3189.7 小结319第三部分综合应用篇第10章终极武器—数字证书33210.1 数字证书详解33210.2 模型分析33510.3 证书管理33710.4 证书使用35110.5 应用举例36010.6 小结360第11章终极装备—...

    Java加密与解密的艺术配书源代码

    带有数字签名的加密网络应用318 9.7 小结319 第三部分综合应用篇 第10章终极武器—数字证书332 10.1 数字证书详解332 10.2 模型分析335 10.3 证书管理337 10.4 证书使用351 10.5 应用举例360 10.6 小结360 第11章...

    Java安全性编程实例(徐迎晓)

    # 第五章和第六章介绍基于摘要和签名技术的数字证书。这是Java安全中确定身份的主要技术。其中第五章介绍了数字证书的创建、签发、验证和维护等,第六章介绍了多个证书组成的证书链(CertPath)的创建和验证。 # 第...

    Java在线支付实战微信支付2021年12月新品

    10-支付安全-数字证书.mp4 11-支付安全-https中的数字证书.mp4 14-创建案例项目-介绍.mp4 19-创建案例项目-集成MyBatis-Plus.mp4 20-创建案例项目-集成MyBatis-Plus的补充.mp4 22-初识Vue-初始化Vue项目.mp4 24-创建...

    Java核心技术II(第8版)

    9.5 数字签名 9.5.1 消息摘要 9.5.2 消息签名 9.5.3 X.509证书格式 9.5.4 校验签名 9.5.5 认证问题 9.5.6 证书签名 9.5.7 证书请求 9.6 代码签名 9.6.1 JAR文件签名 9.6.2 软件开发者证书 9.7 加密 9.7.1 对称密码 ...

    Java在线微信支付开发实战

    09-支付安全-数字签名.mp4 10-支付安全-数字证书.mp4 11-支付安全-https中的数字证书.mp4 12-支付安全-总结.mp4 13-支付安全-微信支付中的证书密钥和签名.mp4 14-创建案例项目-介绍.mp4 15-创建案例项目-创建...

    keytool密钥和证书管理工具

    它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。

    计算机毕业设计 - 基于JAVA的RSA文件加密软件的设计与实现(源代码+LW),保证可靠运行,毕业LW范文可参考,免费资源下载

    网上交易加密连接、网上银行身份验证、各种信用卡使用的数字证书、智能移动电话和存储卡的验证功能芯片等,大多数使用RSA技术。 当今公钥加密更广泛应用于互联网身份认证,本课题将公钥加密算法RSA应用于小型文件...

    java applet 操作本地文件

    数字签名:采用加密技术来实现对签名者身份的认证和数据的完整性。简单的说就是你签字的文件别人知道是你签的,并且知道这个文件是否被修改过。 我们可以通过 数字签名 applet的jar文档来实现控制的策略。

    大型分布式网站架构与实践

     常见的一些安全算法,如数字摘要、对称加密、非对称加密、数字签名、数字证书等。  如何采用摘要认证方式防止信息篡改、通过数字签名验证通信双方的合法性,以及通过HTTPS协议保障通信过程中数据不被第三方监听和...

    一个基于Vue和springboot+mybatisplus实现的文件云盘管理系统+源代码+文档说明

    - 下载URL设置有效期(限制时间或限制下载次数),过期后禁止访问 【 *数字签名* *消息认证码* *Hash Extension Length Attack* *Hash算法与HMAC算法的区别与联系* 】 - 提供静态文件的散列值下载,供下载文件完成...

Global site tag (gtag.js) - Google Analytics