JAVA 实现 基于RSA算法的签名验签
基本步骤
签名方:
1用sha1算出原文的摘要
2用私钥对摘要进行加密
3对密文进行BASE64编码
验证方:
1对密文进行BASE64解码
2用公钥对解码后的密文解密
3用sha1对原文计算摘要并和解密后的明文比对
上干货
//参数字符串
String userId="2312sd";
String orderId="232djfj";
String price="12312";
//用于签名和传输的字符串
StringBuffer bufferStr =new StringBuffer();
bufferStr.append("userId=").append(userId)
.append("&orderId=").append(orderId)
.append("&price=").append(price);
//随机生成秘钥对
//指定算法为RSA
KeyPairGenerator kpg =KeyPairGenerator.getInstance("RSA");
//初始化
kpg.initialize(1024);
//获取秘钥对
KeyPair keyPair =kpg.generateKeyPair();
//数字签名开始
//第一步,对原文进行sha1
String localStr =bufferStr.toString();
MessageDigest md =MessageDigest.getInstance("SHA");
byte[] shaDigest=md.digest(localStr.getBytes("utf-8"));
//第二部,使用私钥对原文进行加密
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//ENCRYPT_MODE表示为加密模式
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
//加密
byte[] rsaBytes = cipher.doFinal(shaDigest);
//base64编码
byte[] base64Str = Base64.getEncoder().encode(rsaBytes);
String base64enCode=new String(base64Str);
//签名加密完成数据传输到客户端
//客户端验证签名开始
//解码base64
//获取原文
String receiveStr=localStr;
byte[] bese64Decoded =Base64.getDecoder().decode(base64enCode.getBytes());
//用公钥进行解密
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher2.init(Cipher.DECRYPT_MODE, keyPair.getPublic());
byte[] rsadecode= cipher2.doFinal(bese64Decoded);
String sha1=Base64.getEncoder().encodeToString(rsadecode);
String sha2=Base64.getEncoder().encodeToString(md.digest(receiveStr.getBytes("utf-8")));
if(sha1.equals(sha2))
System.out.println("验签成功");
else
System.out.println("验签失败");
说明: 这里只是简单的实现了在本地的单向签名,后面见陆续实现,双向签名,基于HTTPS的跨域签名验签。
转载于:https://blog.51cto.com/nimalegebi/1828893