序列图

流程图

源码

SignUtils

package com.hnu.sign;import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
/*** @description:* @author: yuanhx* @create: 2020/12/23*/
public class SignUtils {/*** @Description: 生成sign* @Param:  * @params : map集合参数* @param @appSecret appSecret* @return: 返回sign* @Author: yuanhx* @date: 2020/12/23*/public static String generateSign(Map<String, Object> params, String appSecret) throws UnsupportedEncodingException {Set<String> keysSet = params.keySet();Object[] keys = keysSet.toArray();Arrays.sort(keys);StringBuilder temp = new StringBuilder();boolean first = true;for (Object key : keys) {Object value = params.get(key);String valueString = "";if (null != value && "" != value) {valueString = key + String.valueOf(value);}temp.append(valueString);}temp.append(appSecret);
//        StringBuilder temp2 = new StringBuilder();
//        temp2.append(appSecret);
//        temp2.append(temp);return MD5Util.md5Encrypt32Upper(temp.toString()).toUpperCase();//        MessageDigest md = MessageDigest.getInstance("SHA-1");
//        return byte2hex(md.digest(sb.toString().getBytes("UTF-8")));}private static String byte2hex(byte[] bytes) {StringBuilder sign = new StringBuilder();for (int i = 0; i < bytes.length; i++) {String hex = Integer.toHexString(bytes[i] & 0xFF);if (hex.length() == 1) {sign.append("0");}sign.append(hex.toUpperCase());}return sign.toString();}/*** @Description: map转string结果* @Params:  * @param null :* @return:* @Author: yuanhx* @date: 2020/12/23*/public static String mapToString(Map<String, Object> params){Set<String> keysSet = params.keySet();// 参数按照ANSII排序Object[] keys = keysSet.toArray();Arrays.sort(keys);StringBuilder temp = new StringBuilder();boolean first = true;for (Object key : keys) {if (first) {first = false;} else {temp.append("&");}temp.append(key).append("=");Object value = params.get(key);String valueString = "";if (null != value) {valueString = String.valueOf(value);}temp.append(valueString);}return temp.toString();}
}

MD5Util

package com.hnu.sign;import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 1.MD5加密字符串(32位大写)* 2.MD5加密字符串(32位小写)* <p>* MD5在线加密:https://md5jiami.51240.com/* 3.将二进制字节数组转换为十六进制字符串* 4.Unicode中文编码转换成字符串*/
public class MD5Util {/*** MD5加密字符串(32位大写)** @param string 需要进行MD5加密的字符串* @return 加密后的字符串(大写)*/public static String md5Encrypt32Upper(String string) {byte[] hash;try {//创建一个MD5算法对象,并获得MD5字节数组,16*8=128位hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));} catch (NoSuchAlgorithmException e) {throw new RuntimeException("Huh, MD5 should be supported?", e);} catch (UnsupportedEncodingException e) {throw new RuntimeException("Huh, UTF-8 should be supported?", e);}//转换为十六进制字符串StringBuilder hex = new StringBuilder(hash.length * 2);for (byte b : hash) {if ((b & 0xFF) < 0x10) hex.append("0");hex.append(Integer.toHexString(b & 0xFF));}return hex.toString().toUpperCase();}/*** MD5加密字符串(32位小写)** @param string 需要进行MD5加密的字符串* @return 加密后的字符串(小写)*/public static String md5Encrypt32Lower(String string) {byte[] hash;try {//创建一个MD5算法对象,并获得MD5字节数组,16*8=128位hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));} catch (NoSuchAlgorithmException e) {throw new RuntimeException("Huh, MD5 should be supported?", e);} catch (UnsupportedEncodingException e) {throw new RuntimeException("Huh, UTF-8 should be supported?", e);}//转换为十六进制字符串StringBuilder hex = new StringBuilder(hash.length * 2);for (byte b : hash) {if ((b & 0xFF) < 0x10) hex.append("0");hex.append(Integer.toHexString(b & 0xFF));}return hex.toString().toLowerCase();}/*** 将二进制字节数组转换为十六进制字符串** @param bytes 二进制字节数组* @return 十六进制字符串*/public static String bytesToHex(byte[] bytes) {StringBuffer hexStr = new StringBuffer();int num;for (int i = 0; i < bytes.length; i++) {num = bytes[i];if (num < 0) {num += 256;}if (num < 16) {hexStr.append("0");}hexStr.append(Integer.toHexString(num));}return hexStr.toString().toUpperCase();}/*** Unicode中文编码转换成字符串*/public static String unicodeToString(String str) {Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");Matcher matcher = pattern.matcher(str);char ch;while (matcher.find()) {ch = (char) Integer.parseInt(matcher.group(2), 16);str = str.replace(matcher.group(1), ch + "");}return str;}
}

HttpUtil

package com.hnu.sign;/*** @description:* @author: yuanhx* @create: 2020/12/23*/
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;/*** http 工具类*/
public class HttpUtil {public static String post(String requestUrl, String accessToken, String params)throws Exception {String contentType = "application/x-www-form-urlencoded";return HttpUtil.post(requestUrl, accessToken, contentType, params);}public static String post(String requestUrl, String accessToken, String contentType, String params)throws Exception {String encoding = "UTF-8";if (requestUrl.contains("nlp")) {encoding = "GBK";}return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);}public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)throws Exception {String url = requestUrl + "?access_token=" + accessToken;return HttpUtil.postGeneralUrl(url, contentType, params, encoding);}public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)throws Exception {URL url = new URL(generalUrl);// 打开和URL之间的连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");// 设置通用的请求属性connection.setRequestProperty("Content-Type", contentType);connection.setRequestProperty("Connection", "Keep-Alive");connection.setUseCaches(false);connection.setDoOutput(true);connection.setDoInput(true);// 得到请求的输出流对象DataOutputStream out = new DataOutputStream(connection.getOutputStream());out.write(params.getBytes(encoding));out.flush();out.close();// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> headers = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : headers.keySet()) {System.err.println(key + "--->" + headers.get(key));}// 定义 BufferedReader输入流来读取URL的响应BufferedReader in = null;in = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));String result = "";String getLine;while ((getLine = in.readLine()) != null) {result += getLine;}in.close();System.err.println("result:" + result);return result;}
}

Demo

package com.hnu.sign;import java.util.HashMap;
import java.util.Map;/*** @description:* @author: yuanhx* @create: 2020/12/23*/
public class Demo {/** appKey **/static String appKey = "123456";/** appSecret**/static String appSecret = "youreAppSecret";static String nonce = "1211111";static String url = "http://XXX.api.XXX.cn/API/XXX?username=abc&password=bbc&product=XXXX";public static void main(String[] args) throws Exception {Map<String, Object> paramMap = new HashMap();long timestamp =System.currentTimeMillis();/*验签必须3数*/paramMap.put("timestamp",timestamp);paramMap.put("nonce", nonce);paramMap.put("appKey", appKey);paramMap.put("url", "http://XXX.api.XXX.cn/API/XXX");paramMap.put("username", "abc");paramMap.put("password", "bbc");paramMap.put("version", "1.2.0");paramMap.put("method", "");// body体数据对象paramMap.put("params", "{\"assignNo\":\"TEST018\"}");String sign = SignUtils.generateSign(paramMap,appSecret);System.out.println("sign:"+sign);
//        Map map = new HashMap();
//        map.put("timestamp",timestamp);
//        map.put("sign",sign);
//        String params = SignUtils.mapToString(map);
//        String result = HttpUtil.postGeneralUrl(url,"application/x-www-form-urlencoded;charset=UTF-8",
//                params, "UTF-8");
//        System.out.println(result);}
}

sign签名验签方案及代码相关推荐

  1. 图解PKCS#1——第四部分 签名验签方案

    8.1 RSASSA-PSS签名验签方案 采用EMSA-PSS编码方案 + RSASP/RSAVP签名验签 整个签名/验签流程与加解密流程非常相似. RSASSA-PSS-SIGN (K, M) (§ ...

  2. 开放平台签名验签方案

    开放平台鉴权方案 公共参数 客户端签名 服务端鉴签 服务端appId与appSecret生成方式 1.公共参数 参数名 类型 含义 appId string appId nonce string 随机 ...

  3. js rsa验签_js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  4. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...

  5. 密码技术应用--SM2文件签名验签

    记录一下对一些稍大文件进行SM2签名验签的实现,这里只列出了核心代码,其他不涉及的代码或者有任何疑问可以查看我之前写的密码技术专题博客 /* 函数名: sm2Signsm2 签名算法实现对文件的签名 ...

  6. springboot接口签名统一效验_Python如何接入开放平台?签名验签、加密解密、授权认证测试实战...

    当前大型top企业都有非常成熟的开放平台业务,比如微信开放平台.新浪微博开放平台.支付宝开放平台等.开放平台的发展为第三方个人或企业提供了巨大的机遇.开发者想要接入各大开放平台,必须要遵从开放平台的安 ...

  7. 数据安全管理:RSA加密算法,签名验签流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...

  8. 公钥 私钥_公钥 私钥 签名 验签 说的啥?

    公钥 私钥 签名 验签 说的啥? 公钥加密,私钥解密 私钥签名,公钥验签 散列算法 散列算法,也叫做哈希函数,是从一个任何一种数据中创建小的数字方法,散列函数把消息或者数据压缩成摘要,有时候也叫做摘要 ...

  9. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

最新文章

  1. NYOJ 847 S + T
  2. 基于webpack的PC端和mobile端开发以及生产环境的搭建
  3. 1.django 开发环境搭建
  4. 学习Python第二天
  5. Spring Cloud与微服务学习总结(3)——认证鉴权与API权限控制在微服务架构中的设计与实现(一)
  6. JQuery安装与下载教程
  7. 服务器远程预览本地设备视频, 预览多个,打不开视频流
  8. cool edit pro 2.1中文版未定义外部错误怎么解决
  9. 微软服务器工程师认证,微软认证的系统工程师(MCSE)
  10. 饿了么api接口 php,饿了么接口:php
  11. JZOJ4991. Skyfall
  12. VS Code 常用必备插件
  13. 修炼成高薪Java程序猿——从优秀的Java命名规范开始
  14. 初级前端自学react-native,必备知识点(ES6+ReactJS+flexbox)
  15. Logstash报错:[ERROR][logstash.agent ] Failed to execute action {...
  16. 合成孔径雷达原理-绪论
  17. [OpenGL]计算机图形学:明暗处理的基本算法
  18. 12个爆款 Java 开源项目
  19. plc中int数据类型范围_PLC数据类型
  20. 一个不错的免费二级域名,可以自己解析A记录 CNAME等,而且是备案的域名。

热门文章

  1. postfix+dovecot+openldap+extmail+spamassassin+M...
  2. 《MySQL数据库用户模块需求分析》
  3. 金蝶EAS BOS开发固定报表流程
  4. php卡片式排版显示,卡片式设计思考
  5. 初学者如何学好编程?
  6. 一名职业3D建模师的学习经历,月薪28K依然焦虑
  7. 【读书笔记】薛兆丰经济学讲义——人人都要掌握的经济学思维
  8. python简单小游戏代码-python基础练习之几个简单的游戏
  9. Linux内存管理(二十六):slub 分配器初始化
  10. 上海大学2021年博士研究生招生简章