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;
}
}
分享到:
相关推荐
**PHP+JS+jSignature在线手写电子签名实例详解** 在这个技术实例中,我们将探讨如何使用PHP、JavaScript(JS)和jSignature库来实现一个在线手写电子签名的功能。jSignature是一个轻量级的JavaScript库,它允许用户...
在给定的"winform实现数字签名实例"项目中,DSAExample.sln是Visual Studio 2008的解决方案文件,包含了项目的配置和依赖关系。DSAExample.suo是用户的特定设置文件,通常不包含在版本控制中。下载必读.txt可能是...
标题中的“从客户端调用capicom控件签名实例”指的是使用CAPICOM(Cryptographic API Component Object Model)控件在客户端进行数字签名的一种技术实践。CAPICOM是微软提供的一套安全组件,它允许开发者在应用程序...
Java签名是一个过程,通过使用私钥对JAR文件中的每个类文件进行数字签名,以证明代码的来源和完整性。这个过程涉及到三个主要元素:私钥、公钥和证书。私钥由开发者持有,用于签名;公钥则可以公开,用于验证签名;...
在Java应用程序中,尤其是在涉及到Applet或Web应用时,为了确保代码的安全性,开发者需要对jar包进行数字签名。本实例将指导初学者如何进行这个过程。 首先,理解数字签名的概念。数字签名是一种非对称加密技术的...
数字签名并非手写的签名,而是通过一个算法对消息进行哈希运算,然后用私钥对哈希值进行加密,形成数字签名。接收方可以用发送方的公钥对数字签名进行解密,再对比原文的哈希值,如果一致,则证明信息未被篡改且确实...
RSA签名算法实例,使用RSA的SignHash和VerifyHash可以同样做到SignData和VerifyData,事实上还有一种方法进行公钥加密的签名 认证。就是.NET中的AsymmetricSignatureFormatter和AsymmetricSignatureDeformatter。直 ...
在提供的压缩包文件中,我们可以看到以下内容: - **main.c**:这是程序的主文件,可能包含了调用MD5算法的代码,用于计算文件或字符串的MD5值。 - **md5.c**:这是MD5算法的具体实现文件,包含了MD5函数的源代码。...
**基于CryptoAPI实现基于本地证书的签名实例** 在IT领域,数字签名是保障信息安全和数据完整性的关键技术。本文将深入探讨如何利用Windows操作系统提供的CryptoAPI(加密应用程序接口)来实现基于本地证书的签名...
本篇内容将详细介绍使用Python编写一个艺术签名生成器的原理和实现方法。...而根据提供的内容,如果想要下载并使用这个艺术签名生成器的Python代码,需要访问提供的百度网盘分享链接,并按照分享说明进行操作。
接着,发送者使用自己的私钥对消息的哈希值进行数字签名,这个签名会附在加密后的消息一起发送。接收者接收到消息后,先用发送者的公钥验证签名,确认消息来源无误后再用私钥解密信息,确保数据的机密性和完整性。 ...
Java开发的数字证书、数字签名模块实例,主要应用 于一些支付及安全性审核较高的场合。本示例将从文件中读取数字证书,获取一个处理X.509证书的证书工厂,生成文件输入流,输入文件为c:/mycert.cer,生成数字签名: ...
Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码Python 实例 - 艺术签名生成器 Python源码...
- **验签**:接收方使用发送方的公钥对签名进行验证,确认数据完整性。 5. **与支付宝POS对接**: 在与支付宝POS对接过程中,RSA的使用保证了交易数据的安全性。支付请求可能由商家(Java环境)生成并加密,然后...
在本项目实例中,我们将探讨如何使用Python编程语言创建一个艺术签名生成器。这个工具能够将用户输入的普通文本转化为富有艺术感的签名图形。艺术签名不仅在个人品牌、设计领域,甚至在日常生活中都有广泛的应用。...
这个工具能够根据用户输入的名字,自动生成具有一定艺术风格的签名图像,非常适合那些对图形设计或者Python编程有兴趣的人士学习和使用。通过分析这个实例,我们可以深入了解Python在图像处理和自动化方面的应用。 ...
创建数字签名的步骤包括选择一个合适的算法(如SHA256withRSA),生成密钥对,使用私钥对数据进行签名操作。以下是一个简单的Java代码示例: ```java import java.security.*; import javax.crypto.*; public ...
通过浏览器或者手机屏幕进行手写自由绘画,实现电子签名,支持多浏览器兼容、多手机类型兼容。纯手工代码
- 验证时,同样创建签名实例,使用公钥初始化,更新数据,然后调用`Signature.verify()`进行验证。 6. **安全性考虑**: - Elgamal签名的安全性依赖于计算离散对数的难度,这是一个被认为是困难的数学问题。 - ...
ElectronicSignatureAndroid电子签名实例.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。