`

对内容进行签名的实例

阅读更多
package com.yonge.messagedigest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;

import org.apache.commons.codec.binary.Base64;

public class SignUtil {

    //加密算法
    private final static String SIGNATURE_ALGORITHM      = "DSA";

    private final static String MESSAGE_DIGEST_ALGORITHM = "MD5";

    private final static String PRIVATE_KEY_FILE_NAME    = "private.key";

    private final static String PUBLIC_KEY_FILE_NAME     = "public.key";

    private static Signature    signature                = null;

    static {
        try {
            //获取签名对象
            signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

    }

    /**
     * 利用DSA获取摘要,然后用base64进行编码
     * @param file 源文件
     * @return 返回摘要
     * @throws NoSuchAlgorithmException
     * @throws IOException
     */
    public static String getMessageDigest(File file) throws NoSuchAlgorithmException, IOException {
        MessageDigest messageDigest = null;
        FileInputStream fis = null;
        messageDigest = MessageDigest.getInstance(MESSAGE_DIGEST_ALGORITHM);
        byte[] buffer = new byte[1024];
        int length;
        fis = new FileInputStream(file);
        while ((length = fis.read(buffer)) > 0) {
            messageDigest.update(buffer, 0, length);
        }
        //将摘要进行base64编码
        return new String(Base64.encodeBase64(messageDigest.digest()));
    }

    /**
     * 利用DSA获取摘要,然后用base64进行编码
     * @param data
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static String getMessageDigest(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest messageDigest = MessageDigest.getInstance(MESSAGE_DIGEST_ALGORITHM);
        messageDigest.update(data);
        return new String(Base64.encodeBase64(messageDigest.digest()));
    }

    /**
     * 生成密钥对,并保存到文件中(公钥保存到public.key,私钥保存到private.key)
     * @return 是否生成成功
     * @throws NoSuchAlgorithmException
     * @throws IOException 
     */
    public static boolean generateKeyPair() throws NoSuchAlgorithmException, IOException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(SIGNATURE_ALGORITHM);
        //生成公钥、私钥对
        KeyPair keyPair = keyPairGenerator.genKeyPair();

        //获取私钥
        PrivateKey privateKey = keyPair.getPrivate();

        //获取公钥
        PublicKey publicKey = keyPair.getPublic();

        //将公钥、私钥保存到本地文件中
        FileOutputStream fos_private = new FileOutputStream(new File(PRIVATE_KEY_FILE_NAME));
        ObjectOutputStream oos_private = new ObjectOutputStream(fos_private);
        oos_private.writeObject(privateKey);
        fos_private.close();
        oos_private.close();

        FileOutputStream fos_public = new FileOutputStream(new File(PUBLIC_KEY_FILE_NAME));
        ObjectOutputStream oos_public = new ObjectOutputStream(fos_public);
        oos_public.writeObject(publicKey);
        fos_public.close();
        oos_public.close();
        return true;
    }

    /**
     * 根据私钥将数据生成签名
     * @param data
     * @return 返回加密后的字节数组
     * @throws IOException 
     * @throws ClassNotFoundException 
     * @throws InvalidKeyException 
     * @throws SignatureException 
     */
    public static byte[] signByPrivateKey(byte[] data) throws IOException, ClassNotFoundException,
                                                      InvalidKeyException, SignatureException {
        PrivateKey privateKey = getPrivateKey();

        //初始化签名对象
        signature.initSign(privateKey);
        //签名操作
        signature.update(data);
        //将签名结果返回到数组中
        return signature.sign();
    }

    /**
     * 验证签名
     * @param data 
     * @param sign 签名
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws InvalidKeyException
     * @throws SignatureException
     */
    public static boolean verifyByPublicKey(byte[] data, byte[] sign) throws IOException,
                                                                     ClassNotFoundException,
                                                                     InvalidKeyException,
                                                                     SignatureException {
        PublicKey publicKey = getPublicKey();
        signature.initVerify(publicKey);
        signature.update(data);
        return signature.verify(sign);
    }

    /**
     * 获取私钥对象
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static PrivateKey getPrivateKey() throws IOException, ClassNotFoundException {
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        PrivateKey privateKey = null;
        try {
            //加载私钥文件
            fis = new FileInputStream(new File(PRIVATE_KEY_FILE_NAME));
            ois = new ObjectInputStream(fis);
            //读取对象
            privateKey = (PrivateKey) ois.readObject();
        } finally {
            //关闭流
            if (fis != null) {
                fis.close();
            }
            if (ois != null) {
                ois.close();
            }
        }
        return privateKey;
    }

    /**
     * 获取公钥对象
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static PublicKey getPublicKey() throws IOException, ClassNotFoundException {

        FileInputStream fis = null;
        ObjectInputStream ois = null;
        PublicKey publicKey = null;
        try {
            //加载公钥文件
            fis = new FileInputStream(new File(PUBLIC_KEY_FILE_NAME));
            ois = new ObjectInputStream(fis);
            //读取对象
            publicKey = (PublicKey) ois.readObject();
        } finally {
            //关闭流
            if (fis != null) {
                fis.close();
            }
            if (ois != null) {
                ois.close();
            }
        }
        return publicKey;
    }
}

 

1
1
分享到:
评论

相关推荐

    PHP+JS+jSignature在线手写电子签名实例

    **PHP+JS+jSignature在线手写电子签名实例详解** 在这个技术实例中,我们将探讨如何使用PHP、JavaScript(JS)和jSignature库来实现一个在线手写电子签名的功能。jSignature是一个轻量级的JavaScript库,它允许用户...

    winform实现数字签名实例

    在给定的"winform实现数字签名实例"项目中,DSAExample.sln是Visual Studio 2008的解决方案文件,包含了项目的配置和依赖关系。DSAExample.suo是用户的特定设置文件,通常不包含在版本控制中。下载必读.txt可能是...

    从客户端调用capicom控件签名实例

    标题中的“从客户端调用capicom控件签名实例”指的是使用CAPICOM(Cryptographic API Component Object Model)控件在客户端进行数字签名的一种技术实践。CAPICOM是微软提供的一套安全组件,它允许开发者在应用程序...

    JAVA签名实例

    Java签名是一个过程,通过使用私钥对JAR文件中的每个类文件进行数字签名,以证明代码的来源和完整性。这个过程涉及到三个主要元素:私钥、公钥和证书。私钥由开发者持有,用于签名;公钥则可以公开,用于验证签名;...

    JaVA实例学会数字签名

    在Java应用程序中,尤其是在涉及到Applet或Web应用时,为了确保代码的安全性,开发者需要对jar包进行数字签名。本实例将指导初学者如何进行这个过程。 首先,理解数字签名的概念。数字签名是一种非对称加密技术的...

    加密 RSA 数字签名 数字证书 实例

    数字签名并非手写的签名,而是通过一个算法对消息进行哈希运算,然后用私钥对哈希值进行加密,形成数字签名。接收方可以用发送方的公钥对数字签名进行解密,再对比原文的哈希值,如果一致,则证明信息未被篡改且确实...

    RSA签名算法实例

    RSA签名算法实例,使用RSA的SignHash和VerifyHash可以同样做到SignData和VerifyData,事实上还有一种方法进行公钥加密的签名 认证。就是.NET中的AsymmetricSignatureFormatter和AsymmetricSignatureDeformatter。直 ...

    MD5数字签名实例

    在提供的压缩包文件中,我们可以看到以下内容: - **main.c**:这是程序的主文件,可能包含了调用MD5算法的代码,用于计算文件或字符串的MD5值。 - **md5.c**:这是MD5算法的具体实现文件,包含了MD5函数的源代码。...

    基于CryptoAPI 实现基于本地证书的签名实例

    **基于CryptoAPI实现基于本地证书的签名实例** 在IT领域,数字签名是保障信息安全和数据完整性的关键技术。本文将深入探讨如何利用Windows操作系统提供的CryptoAPI(加密应用程序接口)来实现基于本地证书的签名...

    py源码实例实例艺术签名生成器

    本篇内容将详细介绍使用Python编写一个艺术签名生成器的原理和实现方法。...而根据提供的内容,如果想要下载并使用这个艺术签名生成器的Python代码,需要访问提供的百度网盘分享链接,并按照分享说明进行操作。

    不对称加密及数字签名的实例应用

    接着,发送者使用自己的私钥对消息的哈希值进行数字签名,这个签名会附在加密后的消息一起发送。接收者接收到消息后,先用发送者的公钥验证签名,确认消息来源无误后再用私钥解密信息,确保数据的机密性和完整性。 ...

    Java开发的数字证书、数字签名模块实例.rar

    Java开发的数字证书、数字签名模块实例,主要应用 于一些支付及安全性审核较高的场合。本示例将从文件中读取数字证书,获取一个处理X.509证书的证书工厂,生成文件输入流,输入文件为c:/mycert.cer,生成数字签名: ...

    Python 实例 - 艺术签名生成器 Python源码

    Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码...

    Java与.NET RSA加密解密(签名,验签)实例代码

    - **验签**:接收方使用发送方的公钥对签名进行验证,确认数据完整性。 5. **与支付宝POS对接**: 在与支付宝POS对接过程中,RSA的使用保证了交易数据的安全性。支付请求可能由商家(Java环境)生成并加密,然后...

    python项目实例源码 实例-19 艺术签名生成器

    在本项目实例中,我们将探讨如何使用Python编程语言创建一个艺术签名生成器。这个工具能够将用户输入的普通文本转化为富有艺术感的签名图形。艺术签名不仅在个人品牌、设计领域,甚至在日常生活中都有广泛的应用。...

    Python源码实例-艺术签名生成器.zip

    这个工具能够根据用户输入的名字,自动生成具有一定艺术风格的签名图像,非常适合那些对图形设计或者Python编程有兴趣的人士学习和使用。通过分析这个实例,我们可以深入了解Python在图像处理和自动化方面的应用。 ...

    用Java实现数字签名一例

    创建数字签名的步骤包括选择一个合适的算法(如SHA256withRSA),生成密钥对,使用私钥对数据进行签名操作。以下是一个简单的Java代码示例: ```java import java.security.*; import javax.crypto.*; public ...

    响应式(自适用)手机、浏览器 电子签名 实例 生成图片

    通过浏览器或者手机屏幕进行手写自由绘画,实现电子签名,支持多浏览器兼容、多手机类型兼容。纯手工代码

    Elgamal数字签名

    - 验证时,同样创建签名实例,使用公钥初始化,更新数据,然后调用`Signature.verify()`进行验证。 6. **安全性考虑**: - Elgamal签名的安全性依赖于计算离散对数的难度,这是一个被认为是困难的数学问题。 - ...

    安卓手绘图片处理画板相关-ElectronicSignatureAndroid电子签名实例.rar

    ElectronicSignatureAndroid电子签名实例.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

Global site tag (gtag.js) - Google Analytics