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

数字签名示例

    博客分类:
  • Java
 
阅读更多
示例:
1,用keytool生成私钥和公钥证书
生成密钥库:
    keytool -genkey -alias privatekeystore -keystore private.keystore -storetype JKS -keyalg rsa -dname "CN=China ,OU=fan Unit, O=fan, L=shanghai, S=shanghai, C=China" -storepass 123456 -keypass 111111 -validity 3650
     注: keypass 是私钥的密码
导出公钥证书
    keytool -export -file testpublic.cer -keystore private.keystore -storepass 123456 -alias privatekeystore 
 打印证书
    keytool -printcert -file testpublic.cer


2,Send.java
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Signature;
import org.apache.log4j.Logger;

/**
 * 数字签名
 * <li>模拟发送方
 *  
 * @author hongwei.fan
 * @version $Id: Send.java, v 0.1 2011-12-25 下午04:11:07 hongwei.fan Exp $
 */
public class Send {
    private static final Logger logger = Logger.getLogger(Send.class);

    /**
     * 签名并且发送
     * 
     * @param fname
     * @param password
     * @param privateKeyAlias
     */
    public void signAndSend(String fname, char[] keystorePassword, String privateKeyAlias,
                            char[] privateKeyPwd) {
        try {
            FileOutputStream fos = new FileOutputStream("test");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            //获取keyStore
            KeyStoreHandler keyStoreHandler = new KeyStoreHandler(fname, keystorePassword);
            KeyStore keyStore = keyStoreHandler.getKeyStore();

            //从keyStore中获取私钥
            PrivateKey privateKey = (PrivateKey) keyStore.getKey(privateKeyAlias, privateKeyPwd);

            //私钥签名
            Signature signature = Signature.getInstance("MD5withRSA");
            signature.initSign(privateKey);
            String data = "Signature Data";
            signature.update(data.getBytes());

            //输出需要签名的数据和签名数据
            oos.writeObject(data);
            oos.writeObject(signature.sign());

        } catch (Exception e) {
            logger.warn("数字签名-发送方签名异常", e);
        }
    }
}


3,Receive.java
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import org.apache.log4j.Logger;

/**
 * 数字签名
 * <li>模拟接收方
 * 
 * @author hongwei.fan
 * @version $Id: Receive.java, v 0.1 2011-12-25 下午04:33:19 hongwei.fan Exp $
 */
public class Receive {
    private static final Logger logger = Logger.getLogger(Receive.class);

    /**
     * 接收并验签
     * @param keystoreFile
     * @param keystorePassword
     * @param publicKeyAlias
     */
    public void receiveAndVerify(String keystoreFile, char[] keystorePassword, String publicKeyAlias) {
        try {
            //读取输入流
            String data = null;
            byte[] signatureData = null;
            FileInputStream fis = new FileInputStream("test");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object object = ois.readObject();
            try {
                data = (String) object;
            } catch (ClassCastException cce) {
                logger.warn("读取源数据异常", cce);
            }

            object = ois.readObject();
            try {
                signatureData = (byte[]) object;
            } catch (ClassCastException cce) {
                logger.warn("读取签名数据异常", cce);
            }

            //获取公钥
            //方法1:从keyStore获取
            /*KeyStoreHandler ksh = new KeyStoreHandler(keystoreFile, keystorePassword);
            KeyStore keyStore = ksh.getKeyStore();
            Certificate cer = keyStore.getCertificate(publicKeyAlias);*/
            
            //方法2:从cer文件获取
            FileInputStream cerFile = new FileInputStream(this.getClass().getClassLoader()
                .getResource("key/testpublic.cer").toURI().getPath());
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            Certificate cer = cf.generateCertificate(cerFile);
            
            PublicKey publicKey = cer.getPublicKey();

            //公钥验签
            Signature signature = Signature.getInstance("MD5withRSA");
            signature.initVerify(publicKey);
            signature.update(data.getBytes());
            if (signature.verify(signatureData)) {
                logger.info("验签通过,data=" + data + ",signatureData=" + new String(signatureData));
            } else {
                logger.info("验签失败,data=" + data + ",signatureData=" + new String(signatureData));
            }

        } catch (Exception e) {
            logger.warn("接收方处理异常", e);
        }
    }
}


4,KeyStoreHandler.java
import java.io.FileInputStream;
import java.security.KeyStore;
import java.util.Enumeration;
import org.apache.log4j.Logger;

/**
 *  KeyStore 管理
 * @author hongwei.fan
 * @version $Id: KeyStoreHandler.java, v 0.1 2011-12-25 下午03:55:45 hongwei.fan Exp $
 */
public class KeyStoreHandler {
    private static final Logger logger = Logger.getLogger(KeyStoreHandler.class);
    private KeyStore            keyStore;

    /**
     * 构造函数
     * 加载keyStore文件
     * @param fname  keyStore 完整路径
     * @param password  keyStore 密码
     */
    public KeyStoreHandler(String fname, char[] password) {
        try {
            keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

            FileInputStream fis = new FileInputStream(fname);
            keyStore.load(fis, password);
            if (logger.isInfoEnabled()) {
                logger.info("密钥库中共有" + keyStore.size() + "个别名,分别是:");
            }
            Enumeration<String> aliases = keyStore.aliases();
            while (aliases.hasMoreElements()) {
                if (logger.isInfoEnabled()) {
                    logger.info((String) aliases.nextElement() + " ");
                }
            }
        } catch (Exception e) {
            logger.warn("密钥库操作异常", e);
            throw new IllegalArgumentException(e.toString());
        }
    }

    /**
     * 获取keyStore
     * @return
     */
    public KeyStore getKeyStore() {
        return keyStore;
    }
}


5,测试类
    public static void main(String[] args) throws Exception {
        String keystoreFile = "key/private.keystore";
        keystoreFile = Test.class.getClassLoader().getResource(keystoreFile).toURI().getPath();
        char[] keystorePassword = "123456".toCharArray();
        String privateKeyAlias = "privatekeystore";
        char[] privateKeyPwd = "111111".toCharArray();
        
        Send send = new Send();
        send.signAndSend(keystoreFile, keystorePassword, privateKeyAlias,privateKeyPwd);

        Receive receive = new Receive();
        receive.receiveAndVerify(keystoreFile, keystorePassword, privateKeyAlias);
    }

0
0
分享到:
评论

相关推荐

    JAR数字签名格式解析示例

    标题“JAR数字签名格式解析示例”揭示了本文将深入探讨Java Archive (JAR) 文件的数字签名机制。在Java环境中,JAR文件用于打包类文件和其他资源,而数字签名是确保JAR文件完整性和来源可靠性的关键安全措施。它允许...

    digital-signature:一个简单的Java数字签名示例

    本示例将深入探讨如何在Java中实现数字签名,以确保传输的数据未被篡改,并确认消息来源的真实性。 首先,数字签名并非实际的物理签名,而是一种基于公钥加密技术的数学算法。它使用非对称密钥对,其中私钥用于创建...

    winform实现数字签名实例

    在IT领域,数字签名是一种用于验证数据完整性和发送者身份的技术。它在网络安全、软件发布以及电子文档签署等方面起着至关重要的作用。本实例将详细讲解如何使用C#语言和WinForm来实现数字签名功能。 首先,让我们...

    Java实现的数字签名算法RSA完整示例

    Java实现的数字签名算法RSA完整示例 Java实现的数字签名算法RSA是一种常用的数字签名算法,主要用于验证数据完整性、认证数据来源、抗否认。下面将详细介绍Java实现的数字签名算法RSA的相关概念、原理、实现方法及...

    基于RSA算法的数字签名系统 C#实现

    在压缩包中的"数字签名"文件可能包含了实现这些步骤的C#代码示例,包括密钥的生成、哈希计算、签名生成和验证等功能。通过对这些代码的学习和理解,开发者可以深入掌握如何在实际项目中运用RSA算法来构建安全的数字...

    获取数字签名信息

    在IT行业中,数字签名是一种重要的安全机制,用于验证软件或数据的完整性和来源。当我们谈论“获取数字签名信息”时,通常是指通过编程接口(如DLL接口)来访问和解析包含在可执行文件或库中的数字签名数据。下面将...

    Java加密和数字签名编程快速入门[整理].pdf

    下面是一个简单的数字签名示例: ```java import java.security.*; public class DigitalSignatureExample { public static void main(String[] args) throws Exception { String message = "This is a signed ...

    加密解密-Java加密和数字签名.doc

    以下是一个简单的RSA数字签名示例: ```java import java.security.*; import java.util.Base64; public class DigitalSignatureExample { public static void main(String[] args) throws Exception { // ...

    数字签名的Java实现

    本节将通过一个简单的Java Applet程序示例来介绍如何创建数字签名。该示例程序的功能是在客户端硬盘上创建一个名为`aaa.txt`的文件,并写入字符串`test`。 ```java import java.io.*; import java.lang.*; public ...

    Java加密解密和数字签名完整代码示例

    Java加密解密和数字签名完整代码示例 本资源主要介绍了Java加密解密和数字签名完整代码示例,涉及到多种加密算法和数字签名算法的应用,具有很高的参考价值。 一、加密算法 加密算法是指通过各种数学算法和技术来...

    验证文件的微软数字签名源码

    在IT行业中,数字签名是一种广泛应用于软件安全的关键技术,它为数据的完整性和来源提供了保证。微软数字签名是微软公司为了确保其发行的软件或开发者提交的程序未被篡改而采用的一种签名机制。本篇将详细介绍如何...

    计算机课程设计rsa数字签名实现

    【RSA数字签名实现详解】 RSA数字签名是一种广泛应用于网络安全中的加密技术,它是基于RSA公钥密码体制的一种非对称加密算法。在这个计算机课程设计中,我们将深入探讨如何使用MATLAB来实现RSA数字签名的生成与验证...

    filedsv 数字签名的软件

    在IT领域,数字签名是一种重要的...同时,"FileDigitalSignVerify"文件可能包含了一些示例或者工具,帮助用户实际操作和验证数字签名的效果。对于IT专业人士来说,掌握和运用这类工具是提升信息安全能力的重要一环。

    Java加密和数字签名编程快速入门.rar_Java加密_java 数字 签名_java 数字签名_数字 签名_数字签名

    5. **示例代码**:提供实际的Java代码示例,演示如何进行加密和数字签名的操作,帮助读者更好地理解和应用。 6. **安全实践**:强调在实际项目中使用加密和数字签名时应遵循的最佳实践,包括密钥管理、随机数生成、...

    数字签名工具和方法(示例源码)

    许多开发人员想利用自己编写的ActiveX直接嵌入IE中,来减少... 附件中包括了数字签名的详细方法和所需工具,以及教你如何实现插件默认为脚本安全(vb示例源码),从而在在IE的中级安全设置上,无需激活插件,直接下载。

    数字签名算法,c++实现,RSA的算法

    "shuziqianming"在中文中可以理解为“数字签名”,这可能包含了一些实际的代码示例或者教程,教导如何在C++环境中使用RSA算法进行数字签名操作。 在C++环境下实现这些算法通常涉及以下步骤: 1. 导入必要的库,如...

    使用iTextSharp.pdf进行数字签名的demo

    **使用iTextSharp.pdf进行数字签名的Demo详解** 在PDF文档的安全性方面,数字签名扮演着至关重要的角色。它能够确保文档的完整性和作者身份的验证。iTextSharp是一款广泛使用的开源库,专用于处理PDF文档,其中包括...

    非对称加密算法 数字签名算法

    同时,文件中的`非对称加密算法 数字签名算法——RSA - 信息安全 - ITeye知识库频道_files`可能包含更多示例代码和详细解释,有助于进一步学习和实践。 总之,非对称加密算法和数字签名是保障网络通信安全的重要...

    数字签名技术(C#)

    在给定的压缩包文件中,"数字签名技术.doc"可能包含了关于C#实现数字签名的详细步骤和示例代码。而"DigitalSignature"可能是演示代码或者结果文件。为了深入学习,你可以阅读文档,了解具体的实现细节,并参考代码...

Global site tag (gtag.js) - Google Analytics