java-信息安全(六)-基于RSA理解数字签名示例
概述
java-信息安全(四)-数据签名、数字证书
java-信息安全(五)-非对称加密算法RSA
RSA工具类
使用java-信息安全(五)-非对称加密算法RSA项目中RSACoder
数字签名理解
// 以下指示方便理解,并非真实场景 // 银行【公钥,私钥】----个人【银行的公钥】 // 一、个人→银行【RSA公钥加密】 // 1.个人发给银行密码,使用银行公钥进行加密,发给银行 // 2.银行读取解密后,准备回馈个人信息 // 二、银行→个人【银行数字签名】 // 注:由于个人没有公钥,私钥,银行也就没法用个人的公钥进行数据加密,但是为了确保信息是银行发的,使用数字签名 // 1.银行将要反馈给个人的数据进行,数字摘要【MD5,sha】等,将数字摘要用私钥加密, // 2.此时,银行将要发数据与私钥加密后的sign一起发给用户 // 3.用户收到数据与签名,用公钥对签名进行解密,解密成功,说明信息是银行发的 // 4.用户将数据用与银行约定好的数字摘要算法,进行数字摘要,对比解密后的签名与此签名是否一致,一致即数据完整 // 补充1,为了防止,别人伪造银行,所以需要使用数字证书,对公钥进行认证,就不会被伪造
示例代码
package com.jd.order.util.encryption; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Map; import org.junit.Before; import org.junit.Test; public class RSACoderTest { private String publicKey; private String privateKey; @Before public void setUp() throws Exception { Map<String, Object> keyMap = RSACoder.initKey(); publicKey = RSACoder.getPublicKey(keyMap); privateKey = RSACoder.getPrivateKey(keyMap); System.err.println("公钥: \n\r" + publicKey); System.err.println("私钥: \n\r" + privateKey); } @Test public void testSignVerify() throws Exception { String responseMsg = "abc"; System.err.println("私钥签名——公钥验证签名"); // 银行产生签名 String sign = RSACoder.sign(responseMsg.getBytes(), privateKey); System.err.println("签名:\r" + sign); // 客户验证签名 boolean status = RSACoder.verify(responseMsg.getBytes(), publicKey, sign); System.err.println("状态:\r" + status); assertTrue(status); } }