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日)
相关推荐
delphi RSA签名与验签】支持三种方式签名与验签(SHA1WithRSA、SHA256WithRSA和MD5WithRSA),秘钥格式支持PKCS8和PKCS1,支持两种字符集选择(UTF-8和GBK),D7~XE10可用
示例代码中实现了在.net端进行签名,java端进行验证,以及java端加密,.net端解密的完整过程
支付宝签名、验签、RSA、RSA2公钥、私钥一键生成等工具
delphi标准RSA签名验签工具,方便测试RSA的签名和验证与其他语言之间的签名正确性
支付宝最新版的签名验签工具 支持RSA RSA2 MD5 ,生成 效验秘钥等
Java 实现RSA 签名/验签与加密解密
支付宝官方提供的RSA2签名验签工具,可以生成公匙和私匙并保存到本地。 支付宝支付开发不可或缺的工具。 很好用,最好复制保存在本地的文件里面的密匙,避免弄错。
支付宝提供一键生成工具便于开发者生成一对RSA密钥。下载该工具后,解压打开文件夹,运行“RSA签名验签工具.bat”(WINDOWS)
RSA签名可以确定唯一性,本项目是基于JAVA语言的项目,功能有RSA签名的生成,验签等,是一个MAVEN项目,
支付宝官方RSA加密签名验签工具
C#RSA加密解密签名和验证签名的小例子,代码都加了注释,可以很容易看懂.如果应用到消息收发,发送方用公钥加密,接收方用私钥解密.如果是应用到软件注册方面,则需要客户端保留公钥,程序开发者保留私钥.使用签名和验证...
适用于.net framework 框架, rsa256 签名工具类,亲测有效适用于alipay global对接支付
使用Openssl实现RSA的加密和解密过程;使用Openssl实现签名和验签过程;SHA256WithRSA签名验签过程;封装很好,一看就懂,直接使用!
RSA签名验签工具
Android之RSA加密解密签名验签,亲测可用,不能用退分!
可执行jar文件,需要jdk环境,谢谢!RSA加密、解密、签名、验证签名工具。
> 一个适用于微信小程序的RSA签名库。 RSA签名的小程序DEMO:https://github.com/zhangzhaopds/WeixinApp_RSA_Signature.git 使用 1、引入文件 var RSA = require('../../utils/wxapp_rsa.js') 2、调用 var private...
ios端实现RSA2加签验签。包括签名方法和验签方法。包括签名方法和验签方法。
一款很不错的加密,签名,验签工具。超级好用,推荐给大家