发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,
这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,
接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。
数字签名的基础是公钥和私钥的非对称加密,发送者使用私钥加密消息摘要(签名),接收者使用公钥解密消息摘要以验证签名是否是某个人的。
基本步骤:
得到keyPairGenerator的实例对象,并调用其generateKeyPair()方法创建KeyPair对象。
调用KeyPair对象的getPrivate和getPublic方法,分别得到PrivateKey对象和PublicKey对象。
得到Signature的实例对象,调用其initSign()方法和指定PrivateKey对象,然后调用update方法和sign方法产生签名
调用Signature对象的initVerify()方法和指定PublicKey对象,然后调用update方法和verify()方法对原始数据的签名进行验证。
例子:
package com.study.security; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; /** * 数字签名 * 私钥签名公钥校验 * @author Administrator * */ public class DigitSign { public static void main(String[] args) throws Exception{ sign(); verify(); } //签名 private static void sign()throws Exception{ KeyPairGenerator generator=KeyPairGenerator.getInstance("RSA"); KeyPair keyPair=generator.generateKeyPair(); PublicKey publicKey=keyPair.getPublic(); PrivateKey privateKey=keyPair.getPrivate(); Signature signature=Signature.getInstance("MD5withRSA"); signature.initSign(privateKey); signature.update("hello java!".getBytes("UTF-8")); byte[] signedResult=signature.sign(); //保存数据与公钥 saveKey(publicKey, "sign_public.key"); saveData(signedResult, "sign_data.data"); } //校验 private static void verify()throws Exception{ byte[] data=readData("sign_data.data"); PublicKey publicKey=(PublicKey)readKey("sign_public.key"); Signature signature=Signature.getInstance("MD5withRSA"); signature.initVerify(publicKey); signature.update("hello java!".getBytes("UTF-8")); boolean isYourSign=signature.verify(data); System.out.println("校验的结果:"+isYourSign); } //保存数据的方法 public static void saveData(byte[] results,String dataName)throws Exception{ FileOutputStream fosData=new FileOutputStream(dataName); fosData.write(results); fosData.close(); } //恢复数据的方法 public static byte[] readData(String dataName)throws Exception{ FileInputStream fisDat= new FileInputStream(dataName); //读二进制数据 ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream(); int len=0; byte[] data=new byte[1024]; while((len=fisDat.read(data))!=-1){ arrayOutputStream.write(data, 0, len); } byte[] result=arrayOutputStream.toByteArray(); arrayOutputStream.close(); fisDat.close(); return result; } //保存密钥的方法 public static void saveKey(Key key,String keyName) throws Exception{ FileOutputStream foskey=new FileOutputStream(keyName); ObjectOutputStream oos=new ObjectOutputStream(foskey); oos.writeObject(key); oos.close(); foskey.close(); } //恢复密钥的方法 public static Key readKey(String keyName) throws Exception{ FileInputStream fiskey=new FileInputStream(keyName); ObjectInputStream oiskey=new ObjectInputStream(fiskey); Key key=(Key)oiskey.readObject(); oiskey.close(); fiskey.close(); return key; } }
相关推荐
【Java数字签名提供XML安全】 XML(eXtensible Markup Language)作为一种标准的数据交换格式,在软件开发和数据传输中扮演着重要角色。然而,随着XML的广泛应用,数据的安全性问题日益凸显。为了确保XML文件的完整...
Java数字签名是一种在Java编程环境中实现的网络安全技术,主要用于确保数据的完整性和发送者的身份验证。这个资源包含的代码示例应该提供了关于如何在Java中实施数字签名的详细步骤。 在计算机网络中,数字签名是一...
Java 数字签名是一种用于验证数据完整性和发送者身份的...总的来说,Java数字签名提供了强大的安全功能,确保了在网络通信中的数据安全和身份认证。理解并正确使用数字签名和相关工具是开发安全的Java应用程序的基础。
Java数字签名源程序是用于实现数据完整性、身份验证和非否认性的关键技术,它在网络安全中扮演着重要角色。本程序是使用JAVA编程语言编写的,遵循了计算机科学中关于密码学的基本原理。数字签名通常与公钥基础设施...
Java 数字签名是一种用于验证数据完整性和发送者身份的安全机制,它是基于公钥加密技术的。在 Java 平台上,我们可以使用内置的 Keytool 和 Jarsigner 工具来实现数字签名的操作。以下是对这个主题的详细讲解: 一...
Java 数字签名是一种用于验证数据完整性和发送者身份的安全机制,它是基于公钥加密技术的。在Java中,数字签名通常使用Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 提供的API来实现...
JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字签名JAVA数字...
以下是一个通用的Java数字签名和验证的步骤概述: 1. 导入所需的Java加密库: ```java import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; `...
Java 数字签名和数字证书是网络安全领域中的重要概念,它们在确保数据的完整性和来源的可信性方面扮演着关键角色。这份"Java 数字签名、数字证书生成源码"的压缩包提供了实现这些功能的代码示例,对于理解和应用Java...
这个“id_digital.rar”压缩包包含了与Java数字签名相关的源代码文件,可以帮助我们理解并实践这一技术。 首先,我们来看“GenerateKeyPair.java”。这个文件通常包含用于生成公钥和私钥对的代码。在数字签名中,...
"java数字签名和证书应用" 数字签名是指使用某种签名算法对某些内容进行数字签名后得到的数字凭证。证书(Certificate)是数字签名的一种特殊形式,是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的,...
Java数字签名是基于非对称加密算法(如RSA、DSA)的一种安全机制,用于确保数据的完整性和来源的不可否认性。在Java中,`java.security.Signature`类提供了数字签名的API。签名过程涉及使用私钥对数据进行操作,而...
Java 数字签名与数字证书是安全领域中的重要概念,它们在软件开发中起着至关重要的作用,尤其是在确保数据完整性和身份验证方面。本资源包含的Java代码工具包提供了生成数字签名和数字证书的源码,这有助于开发者...
总的来说,Java数字签名和证书加载是保障网络通信安全的重要手段,它们为数据交换提供了可靠的身份验证和完整性保护。本项目提供了一个实现这些功能的基础框架,开发者可以根据自身需求进行扩展和定制,以满足特定的...
总结,这个压缩包中的源代码提供了关于Java数字签名和数字证书的实战示例,是学习和实践Java安全编程的重要资源。通过学习和运用这些代码,开发者能够更好地理解和应用密码学原理,增强软件的安全特性。
Java 数字签名是一种用于验证数据完整性和发送者身份的安全机制,它是基于公钥加密技术的。在Java中,数字签名通常使用Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 提供的API来实现...
总之,Java数字签名是基于公钥加密技术的一种安全机制,它通过证书确保公钥的可信性,并通过签名验证数据的完整性和发送者的身份。在实际开发中,理解并正确使用这些概念对于构建安全的网络应用至关重要。