`
234390216
  • 浏览: 10232907 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462622
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775515
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398352
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395022
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679981
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530892
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183946
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467908
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151385
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68148
社区版块
存档分类
最新评论

RSA签名与验签

阅读更多

RSA签名与验签

RSA算法除了可以进行加解密以外,还可以用来签名与验签。RSA用来进行签名与验签时是使用私钥进行签名,公钥进行验签的。这点与加解密的时候刚好相反。加解密时使用公钥加密,私钥解密。签名和验签是通过Signature对象进行的。

签名

以下是一个使用Signature进行签名的示例。初始化Signature时指定将使用的签名算法是MD5withRSA,除了该算法外,Signature还支持很多其它的算法,如SHA256withRSA,更多的算法可以参考官方文档

	/**
	 * 测试签名
	 * @throws Exception
	 */
	@Test
	public void testSign() throws Exception {
		byte[] sign = this.sign("Hello World");
		String result = Base64.getEncoder().encodeToString(sign);
		System.out.println(result);
	}
	
	/**
	 * 私钥签名
	 * @param data
	 * @return
	 * @throws Exception
	 */
	private byte[] sign(String data) throws Exception {
		//读取储存的私钥字节数组
		byte[] privateKeyCode = Files.readAllBytes(Paths.get(PRIVATE_KEY_PATH));
		//包装私钥字节数组为一个KeySpec
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyCode);
		KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
		//通过KeyFactory生成私钥
		PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
		Signature signature = Signature.getInstance("MD5withRSA");//签名的算法
		//通过私钥初始化Signature,签名时用
		signature.initSign(privateKey);
		//指定需要进行签名的内容
		signature.update(data.getBytes());
		//签名
		byte[] result = signature.sign();
		return result;
	}

验签

以下是一个利用Signature进行验签的示例。验签时使用的是公钥。在初始化Signature时使用的是initVerify,而签名时使用的是initSign,这跟Cipher进行加解密有点类似。

	/**
	 * 测试公钥验签
	 * @throws Exception
	 */
	@Test
	public void testVerifySign() throws Exception {
		String data = "Hello World";
		byte[] sign = this.sign(data);
		Signature signature = Signature.getInstance("MD5withRSA");
		byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH));
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode);
		KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
		PublicKey publicKey = keyFactory.generatePublic(keySpec);
		//以验签的方式初始化Signature
		signature.initVerify(publicKey);
		//指定需要验证的签名
		signature.update(data.getBytes());
		//进行验签,返回验签结果
		boolean result = signature.verify(sign);
		Assert.assertTrue(result);
	}

完整代码 以下是上述示例的完整代码。

public class RSATest {

	private static final String ALGORITHM = "RSA";
	private static final String PRIVATE_KEY_PATH = "D:\\rsa_private.isa";
	private static final String PUBLIC_KEY_PATH = "D:\\rsa_public.isa";
	
	/**
	 * 测试签名
	 * @throws Exception
	 */
	@Test
	public void testSign() throws Exception {
		byte[] sign = this.sign("Hello World");
		String result = Base64.getEncoder().encodeToString(sign);
		System.out.println(result);
	}
	
	/**
	 * 私钥签名
	 * @param data
	 * @return
	 * @throws Exception
	 */
	private byte[] sign(String data) throws Exception {
		//读取储存的私钥字节数组
		byte[] privateKeyCode = Files.readAllBytes(Paths.get(PRIVATE_KEY_PATH));
		//包装私钥字节数组为一个KeySpec
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyCode);
		KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
		//通过KeyFactory生成私钥
		PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
		Signature signature = Signature.getInstance("MD5withRSA");//签名的算法
		//通过私钥初始化Signature,签名时用
		signature.initSign(privateKey);
		//指定需要进行签名的内容
		signature.update(data.getBytes());
		//签名
		byte[] result = signature.sign();
		return result;
	}
	
	/**
	 * 测试公钥验签
	 * @throws Exception
	 */
	@Test
	public void testVerifySign() throws Exception {
		String data = "Hello World";
		byte[] sign = this.sign(data);
		Signature signature = Signature.getInstance("MD5withRSA");
		byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH));
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode);
		KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
		PublicKey publicKey = keyFactory.generatePublic(keySpec);
		//以验签的方式初始化Signature
		signature.initVerify(publicKey);
		//指定需要验证的签名
		signature.update(data.getBytes());
		//进行验签,返回验签结果
		boolean result = signature.verify(sign);
		Assert.assertTrue(result);
	}
	
}

(注:本文由Elim写于2017年5月22日)

0
2
分享到:
评论

相关推荐

    Delphi RSA签名与验签【支持SHA1WithRSA、SHA256WithRSA和MD5WithRSA,秘钥PKCS8和PKCS1】D7~XE10可用

    delphi RSA签名与验签】支持三种方式签名与验签(SHA1WithRSA、SHA256WithRSA和MD5WithRSA),秘钥格式支持PKCS8和PKCS1,支持两种字符集选择(UTF-8和GBK),D7~XE10可用

    Delphi RSA签名与验签库

    Delphi RSA签名与验签库 简介 本开源仓库提供了一个Delphi库,用于实现RSA签名与验签功能。该库支持三种签名与验签方式(SHA1WithRSA、SHA256WithRSA和MD5WithRSA),并且支持PKCS8和PKCS1两种秘钥格式。此外,还...

    RSA签名验签工具windows_V1.4.zip_rsa_rsa2生成签名_rsa签名工具_工具_验签

    这个名为“RSA签名验签工具windows_V1.4.zip”的压缩包包含了一个适用于Windows操作系统的工具,版本为V1.4,专门用于RSA和RSA2算法的签名与验证过程。 RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和...

    .net与java中的互操作(rsa签名与验签、加密与解密)

    这些代码演示了.NET与Java间如何正确地进行RSA签名验证和加密解密。确保在实际应用中,安全地处理和存储密钥,遵循最佳实践,以防止密钥泄露导致的安全风险。 通过理解这些基本步骤,开发者可以在.NET和Java之间...

    RSA签名验签工具

    RSA签名验签工具是安全支付领域中不可或缺的一部分,主要用于确保数据传输的安全性和完整性。这个工具支持RSA和RSA2算法,以及MD5哈希算法,能够帮助开发者生成验证密钥对,进行签名和验签操作。在本文中,我们将...

    标准RSA签名验签工具

    在本压缩包文件"RSA签名验签工具"中,我们主要关注的是RSA在数字签名和验证方面的应用。数字签名不仅用于加密数据,还用于确保消息的完整性和发送者的身份认证。在RSA体系下,签名过程通常涉及以下步骤: 1. **私钥...

    RSA加密签名验签工具

    总的来说,RSA签名验签工具是一款强大的实用工具,能够满足用户在日常工作中对数据安全的各种需求。其易用性和高效性使其成为IT专业人员必备的安全辅助软件。通过熟练掌握和运用这款工具,用户可以更好地保护敏感...

    签名RSA验签工具

    4. **支持不同平台**:提供的"RSA签名验签工具windows_V1.4"表明该工具适用于Windows操作系统,可能还有其他版本适应不同的操作系统环境。 5. **用户友好的界面**:工具通常会提供图形用户界面(GUI),使得非技术...

    支付宝RSA签名验签工具windows_V1.4

    支付宝RSA签名验签工具是为了解决在与支付宝接口交互时的安全问题而设计的。RSA是一种非对称加密算法,广泛应用于数据加密、数字签名等领域。在这个Windows版本V1.4的工具中,开发者可以方便地生成RSA密钥对,进行...

    RSA签名验签工具windows

    在标题"RSA签名验签工具windows"中,提到的是一个专门用于RSA签名和验证的Windows平台应用程序。这个工具的主要功能包括生成RSA密钥对(公钥和私钥),这些密钥对通常以字符串的形式存在,可以用于加密和解密数据,...

    Delphi RSA签名与验签 国密sm2签名和验签 工具

    最近工作上安排了一个支付接口的项目,我看其中涉及到了RSA签名加解密,提供了Java的代码,delphi RSA算法不会搞, 于是调用Java代码的实现,速度慢不说,出参和入参都不方便,遂项目上线后继续寻找Rsa在delphi下的...

    Delphi RSA 加密解密签名验签控件 RSA_Component(1.0.0.0).rar

    但是没有提供Delphi使用的RSA支持,delphi开发者使用起来还是有些麻烦,特别是RSA加解密及签名验证等等,因此我们开发了这个RSA控件,秩序简单的几个API就可以立即实现RSA的加解密及签名验证等功能。

    RSA加密、解密、签名、验签小工具

    可执行jar文件,需要jdk环境,谢谢!RSA加密、解密、签名、验证签名工具。

    mbedtls RSA PSS加密验签.pdf

    这些关键字可能是指向源代码文件、可执行文件、密钥文件或其他与RSA PSS签名验签过程相关的文件和程序。 由于文章是通过OCR扫描得到的,某些字符可能出现错误或丢失,但基本可以判断内容涉及的文件和程序都是mbed...

    RSA签名验签工具windows_V1.4.rar

    RSA签名验签工具是支付宝官方为了方便开发者进行RSA2安全签名与验证操作而推出的一款实用软件,主要适用于Windows操作系统。这个工具的核心在于RSA2算法,一种广泛应用于信息安全领域的非对称加密技术。RSA2是在RSA...

    支付宝RSA加密签名验签工具

    - 签名与验签:对请求数据生成RSA签名,并验证支付宝返回的签名。 - 文件操作:可能支持对证书和私钥文件的导入导出。 5. **使用步骤** - 安装工具:解压文件并安装在Windows环境下。 - 导入公钥和私钥:商户...

    Java 实现RSA 签名/验签与加密解密

    6. 压缩包中的`signature`文件可能包含的是一个示例程序,演示了如何在Java中使用RSA进行签名、验签、加密和解密。这个程序可能会包括以下关键部分: - 导入必要的安全库 - 创建并初始化`KeyPairGenerator` - ...

    MAVEN RSA签名生成验签

    在实际应用中,RSA签名常用于防止数据被篡改,比如在支付场景中,服务器可能会对交易请求生成RSA签名,客户端接收到响应后,使用服务器的公钥进行验签,以确认请求的完整性。因此,"payrsasign"可能是该项目中的核心...

Global site tag (gtag.js) - Google Analytics