Rsa加密验证数据有效性
import com.alibaba.fastjson.*; import java.text.*; import java.util.*; import org.apache.commons.codec.binary.Base64; import java.security.spec.*; import java.security.*; public class RSA_Test { static String ak; static String sk; static String pk; // @Override public static JSONObject transform(final JSONObject json) { // try { final JSONArray dataArray = new JSONArray(); dataArray.add(json); final Double random = Math.random() * 10000.0; final String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); final String sign = sign(XML2JSON_MD5.sk, XML2JSON_MD5.ak, XML2JSON_MD5.pk, random.intValue(), date, dataArray.toString()); final JSONObject requestData = new JSONObject(); requestData.put("ak", XML2JSON_MD5.ak); requestData.put("pk", XML2JSON_MD5.pk); requestData.put("number", random.intValue()); requestData.put("date", date); requestData.put("sign", sign); requestData.put("dataContent", dataArray.toString()); requestData.put("token", "admin"); return requestData; } catch (Exception e) { } finally { } return null; } public static String sign(final String privateKey, final String publicKey, final String pk, final int number, final String date, final String... otherParam) { final String signSrc = orgSignSrc(publicKey, pk, number, date, otherParam); final byte[] privateByte = Base64.decodeBase64(privateKey); final PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateByte); try { final KeyFactory keyFactory = KeyFactory.getInstance("RSA"); final PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); final Signature signature = Signature.getInstance("MD5withRSA"); signature.initSign(privateK); signature.update(signSrc.getBytes()); return Base64.encodeBase64String(signature.sign()); } catch (Exception e) { e.printStackTrace(); return null; } } private static String orgSignSrc(final String publicKey, final String pk, final int number, final String date, final String[] otherParam) { final StringBuffer src = new StringBuffer(); src.append("AK=" + publicKey + "&"); src.append("PK=" + pk + "&"); src.append("Number=" + number + "&"); src.append("Date=" + date + "&"); src.append("Data="); for (final String param : otherParam) { src.append(param); } return src.toString(); } static { XML2JSON_MD5.ak = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJPaQpqEIbIF9QSscMJooquZeXAfcCzikzvBLNK6XTStAIlbcN3+FtVlRn+n/5Wxnfxw6vEyLYPT8Cyzi9DiF+ECAwEAAQ=="; XML2JSON_MD5.sk = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAk9pCmoQhsgX1BKxwwmiiq5l5cB9wLOKTO8Es0rpdNK0AiVtw3f4W1WVGf6f/lbGd/HDq8TItg9PwLLOL0OIX4QIDAQABAkBLvAdV4sznxclmJXZ0/ugkgi8EUfZB56WHfEIbhz7rFdF5COc/nOHEP6ZzZEfRuKcHddZ8kumIHXd2lrq9wUABAiEA4wgq50sqFClc55v9YP93f24p2kULo0O+vdjydAraPwECIQCmt8HiUb+EUXUMjXk1vxz/hIZvt860YgpuneQxMci44QIhAIQ4hYQe6mrDjC/3USHkppu4dPeBrr1u/u9iIhIjH+gBAiEAkht63HgeKr0konKd5n9tz3T6SJBCpA1D7TuMj5x8t6ECIDEYoLFUgtFE8ukr4CWgg3+iy8u9FfD8D3qZV9djS5LQ"; XML2JSON_MD5.pk = "e197098e84cb49b19e9e5fa6f6afa35f"; } public static boolean verify(String sign, String publicKey, String pk, int number, String date, String... otherParam) { // 签名原文 String signSrc = orgSignSrc(publicKey, pk, number, date, otherParam); byte[] keyBytes = Base64.decodeBase64(publicKey); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); try { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicK = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initVerify(publicK); signature.update(signSrc.getBytes()); return signature.verify(Base64.decodeBase64(sign)); } catch (Exception e) { e.printStackTrace(); } return false; } public static boolean verify(JSONObject postJson) { String ak = getValue(postJson,"ak",""); String pk = getValue(postJson, "pk", ""); String sign = getValue(postJson, "sign", ""); String date = getValue(postJson, "date", ""); int number = Integer.valueOf(getValue(postJson, "number", null).toString()); String data = getValue(postJson, "dataContent", ""); return verify(sign, ak, pk, number, date, data); } public static <T> T getValue(JSONObject jobj, String propertyName, T defaultValue) { if (jobj == null || !jobj.containsKey(propertyName)) { return defaultValue; } Object o = jobj.get(propertyName); if (o == null) { return defaultValue; } return (T) o; } public static void main(String[] args) { String content=""; content="{\"currencyType\":\"RMB\",\"exchangerate\":\"1.00 \",\"channel\":\"9999009A012\",\"remark\":\"0\",\"billDate\":\"20190619\",\"tax\":\"0.00 \",\"baseCurrency\":\"RMB\",\"wareHouse\":\"SHACWH\",\"taxStandardMoney\":\"0.00 \",\"amountStandardMoney\":\"0.00 \",\"vbeln\":\"8002400031\",\"totalTaxPrice\":\"0.00 \",\"whareaType\":\"SL001\",\"details\":[{\"owner\":\"999902A012\",\"taxRate\":\"0.00 \",\"singleProduct\":\"95737703-22XLCN\",\"amount\":\"0.000 \",\"quantity\":\"12\",\"taxStandardMoney\":\"0.00 \",\"amountStandardMoney\":\"0.00 \",\"price\":\"0.00 \",\"totalTaxPrice\":\"0.00 \",\"tax\":\"0.00 \",\"totalTaxPriceStandardMoney\":\"0.00 \"},{\"owner\":\"999902A012\",\"taxRate\":\"0.00 \",\"singleProduct\":\"95737703-2LCN\",\"amount\":\"0.000 \",\"quantity\":\"2\",\"taxStandardMoney\":\"0.00 \",\"amountStandardMoney\":\"0.00 \",\"price\":\"0.00 \",\"totalTaxPrice\":\"0.00 \",\"tax\":\"0.00 \",\"totalTaxPriceStandardMoney\":\"0.00 \"},{\"owner\":\"999902A012\",\"taxRate\":\"0.00 \",\"singleProduct\":\"95737703-2MCN\",\"amount\":\"0.000 \",\"quantity\":\"11\",\"taxStandardMoney\":\"0.00 \",\"amountStandardMoney\":\"0.00 \",\"price\":\"0.00 \",\"totalTaxPrice\":\"0.00 \",\"tax\":\"0.00 \",\"totalTaxPriceStandardMoney\":\"0.00 \"},{\"owner\":\"999902A012\",\"taxRate\":\"0.00 \",\"singleProduct\":\"95737703-2XLCN\",\"amount\":\"0.000 \",\"quantity\":\"21\",\"taxStandardMoney\":\"0.00 \",\"amountStandardMoney\":\"0.00 \",\"price\":\"0.00 \",\"totalTaxPrice\":\"0.00 \",\"tax\":\"0.00 \",\"totalTaxPriceStandardMoney\":\"0.00 \"}],\"totalTaxPriceStandardMoney\":\"0.00 \",\"businessType\":\"QTRK\",\"bsType\":\"101\"}"; JSONObject json=JSON.parseObject(content); String str=transform(json).toString(); System.out.println(str); boolean result=verify(JSON.parseObject(str)); System.out.println(result); } }
通过rsa加密,可以检验数据的完整性,中途没被别人篡改。后台可以只接受合法的请求数据。
如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步