`
jiayj198609
  • 浏览: 147445 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
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编码
//从密钥库中读取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.开始产生(测试)签名
     
 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证书中的公钥,对签名内容进行认证就可以了。


  
public static String encodeBase64(byte data[])
    {
        boolean lineSep = false;
        int sLen = data == null ? 0 : data.length;
        if(sLen == 0)
            return new String("");
        int eLen = (sLen / 3) * 3;
        int cCnt = (sLen - 1) / 3 + 1 << 2;
        int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0);
        char dArr[] = new char[dLen];
        int s = 0;
        int d = 0;
        int cc = 0;
        do
        {
            if(s >= eLen)
                break;
            int i = (data[s++] & 0xff) << 16 | (data[s++] & 0xff) << 8 | data[s++] & 0xff;
            dArr[d++] = CA[i >>> 18 & 0x3f];
            dArr[d++] = CA[i >>> 12 & 0x3f];
            dArr[d++] = CA[i >>> 6 & 0x3f];
            dArr[d++] = CA[i & 0x3f];
            if(lineSep && ++cc == 19 && d < dLen - 2)
            {
                dArr[d++] = '\r';
                dArr[d++] = '\n';
                cc = 0;
            }
        } while(true);
        int left = sLen - eLen;
        if(left > 0)
        {
            int i = (data[eLen] & 0xff) << 10 | (left != 2 ? 0 : (data[sLen - 1] & 0xff) << 2);
            dArr[dLen - 4] = CA[i >> 12];
            dArr[dLen - 3] = CA[i >>> 6 & 0x3f];
            dArr[dLen - 2] = left != 2 ? '=' : CA[i & 0x3f];
            dArr[dLen - 1] = '=';
        }
        return new String(dArr);
    }
    
    
    public static final String encodeHex(byte bytes[])
    {
        StringBuffer buf = new StringBuffer(bytes.length * 2);
        for(int i = 0; i < bytes.length; i++)
        {
            if((bytes[i] & 0xff) < 16)
                buf.append("0");
            buf.append(Long.toString(bytes[i] & 0xff, 16));
        }
 
        return buf.toString();
    }
    
    
    public static final byte[] decodeHex(String hex)
    {
        char chars[] = hex.toCharArray();
        byte bytes[] = new byte[chars.length / 2];
        int byteCount = 0;
        for(int i = 0; i < chars.length; i += 2)
        {
            int newByte = 0;
            newByte |= hexCharToByte(chars[i]);
            newByte <<= 4;
            newByte |= hexCharToByte(chars[i + 1]);
            bytes[byteCount] = (byte)newByte;
            byteCount++;
        }
 
        return bytes;
    }

分享到:
评论
4 楼 beihan007 2010-11-27  
楼主最近很活跃喔。
3 楼 caoyangx 2010-11-27  
我是来看原作者出面指责楼主的。
2 楼 zheng12tian 2010-11-27  
弄个demo上来看看
1 楼 pikenlike_123 2010-11-26  
你最近发的帖子真多,这两天我都看过你三篇帖子了啊。
    是不是转载过来的,如果转载过来的请注明哦;

相关推荐

    java数字签名(签名生成,用证书验证签名)

    java数字签名是指使用公钥加密技术,通过证书认证和签名验证来确保数据的安全和可靠性。数字签名的生成和验证过程 涉及到证书的申请、颁发和验证等多个方面。 在数字签名过程中,证书扮演着非常重要的角色。证书是...

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

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

    java简单的数字签名系统

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

    java https ssl 实例 例子

    keytool 是一个 Java 工具,用于生成、管理和使用数字证书。keytool 可以生成自签名证书、请求证书和导入证书等。 十一、Java sslSocket 聊天实例 Java sslSocket 聊天实例是使用 Java 的 SSL SOCKET 编程来实现...

    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 对称密码 ...

    SSL Socket双向认证的实现.doc

    SSL 协议采用数字证书及数字签名进行双端实体认证,用非对称加密算法进行密钥协商,用对称加密算法将数据加密后进行传输以保证数据的保密性,并且通过计算数字摘要来验证数据在传输过程中是否被篡改和伪造,从而为...

    Java在线微信支付开发实战

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

    keytool密钥和证书管理工具

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

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

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

Global site tag (gtag.js) - Google Analytics