java 参数加密,数据推送

我们项目要给别的系统的接口推送数据安全要求要求加密传输,要求如下;

sign生成规则

key: 00000000000

secret: 123123

(1)把参数(Map<String,Object>类型)按字典排序 ksort 得到param_str

(2)参数map中加入key ,然后按字典排序转化为字符串用&连接,md5加密secret得到md5_secret_str

(3)拼接param_str和 md5_secret_str,然后对拼接出来的字符串md5加密

(4)对最终加密串转化为大写

:空值不参与加密、sign/sign_type不参与加密,secret不作为参数传递,所以在(1)中的参数不包含secret

传参为param_str+"&key="+UtilKsort.KEY+"&sign="+sign

接收参数的接口根据param_str也生成sign和接收到的sign比对,再比对key如果都相等则通过

工具类如下:

public class UtilKsort {
	public final static Logger logger = LoggerFactory.getLogger(UtilKsort.class);
	public final static String KEY="00000000000";
	public final static String SECRET="123123";
	//dizi
	//public final static String BASEURL="";

	 /**
     * 使用 Map按key进行排序
     * @param map
     * @return
     */
    public static Map<String, Object> sortMapByKey(Map<String,Object> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map<String, Object> sortMap = new TreeMap<String, Object>(
                new MapKeyComparator());
        sortMap.putAll(map);
        return sortMap;
    }
    /**
	 *
	 * map转str
	 * @param map
	 * @return
     * @throws UnsupportedEncodingException 
	 */
	public static String getMapToString(Map<String,Object> map) throws UnsupportedEncodingException{
		Set<String> keySet = map.keySet();
		//将set集合转换为数组
		String[] keyArray = keySet.toArray(new String[keySet.size()]);
		//给数组排序(升序)
		Arrays.sort(keyArray);
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < keyArray.length; i++) {
			// 参数值为空,则不参与签名 这个方法trim()是去空格
			if (map.get(keyArray[i]).toString().length() > 0) {
				sb.append(keyArray[i]).append("=").append(URLEncoder.encode(map.get(keyArray[i]).toString(),"UTF-8"));
				if(i != keyArray.length-1){
					sb.append("&");
				}
			}
			
		}
		return sb.toString();
	}
	/**
	 * 得到sign
	 * @throws UnsupportedEncodingException 
	 */
	public static String MapgetSign(Map<String,Object> map) throws UnsupportedEncodingException{
        //二进制图片视频不参与要删除
		Set<String> keySet = map.keySet();
		map.put("key", KEY);
		//将set集合转换为数组
		String[] keyArray = keySet.toArray(new String[keySet.size()]);
		//给数组排序(升序)
		Arrays.sort(keyArray);
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < keyArray.length; i++) {
			// 参数值为空,则不参与签名 这个方法trim()是去空格
			if (map.get(keyArray[i]).toString().trim().length() > 0) {
					sb.append(keyArray[i]).append("=").append(URLEncoder.encode(map.get(keyArray[i]).toString().trim(),"UTF-8"));
					if(i != keyArray.length-1){
						sb.append("&");
					}
			}
			
		}
		//System.out.println(sb);
		String secret = DigestUtils.md5Hex(SECRET.getBytes());
		String sign=sb.toString()+secret;
		//System.out.println(sign);
		return DigestUtils.md5Hex(sign.getBytes()).toUpperCase();
	}
	
	public static String StringgetSign(String parm){
		String secret = DigestUtils.md5Hex(SECRET.getBytes());
		String sign=parm+secret;
		return DigestUtils.md5Hex(sign.getBytes()).toUpperCase();
	}
    public static String md5(String text, String key) throws Exception {
        //加密后的字符串
        String encodeStr=DigestUtils.md5Hex((text + key).getBytes());
        System.out.println("MD5加密后的字符串为:encodeStr="+encodeStr);
        return encodeStr;
    }

    /**
     * MD5验证方法
     * 
     * @param text 明文
     * @param key 密钥
     * @param md5 密文
     * @return true/false
     * @throws Exception
     */
    public static boolean verify(String text, String key, String md5) throws Exception {
        //根据传入的密钥进行验证
        String md5Text = md5(text, key);
        if(md5Text.equalsIgnoreCase(md5))
        {
            System.out.println("MD5验证通过");
            return true;
        }

            return false;
    }
	public static String request(String httpUrl,String parm) {
		BufferedReader reader = null;
	   	String result = null;
	   	StringBuffer sbf = new StringBuffer();
	   	try {
            URL url=new URL(httpUrl);
		   	HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		    connection.setDoOutput(true);  
            connection.setDoInput(true);  
            // 设置通用的请求属性
            // POST方法
            connection.setRequestMethod("POST");
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
   
	    	connection.connect();
	    	OutputStreamWriter out = new OutputStreamWriter(  
	                    connection.getOutputStream(), "UTF-8");
	        out.write(parm);
	    	out.flush(); 
	        out.close(); 
	    	InputStream is = connection.getInputStream();
	    	reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
	    	String strRead = null;
	    	while ((strRead = reader.readLine()) != null) {
		    	sbf.append(strRead); sbf.append("\r\n");
		    }
		    reader.close();
		    result = sbf.toString();
		 } catch (Exception e) { 
			 e.printStackTrace();
			 return result;
		 }
		 return result;
	}
}
class MapKeyComparator implements Comparator<String>{

    @Override
    public int compare(String str1, String str2) {
        
        return str1.compareTo(str2);
    }
}

 使用类:

        String parm=null;
		String sign=null;
		try {
			logger.info(map.toString());//参数
			parm = UtilKsort.getMapToString(map);//参数排序
			sign = UtilKsort.MapgetSign(map);;//得到sign
			BufferedReader reader = null;
		   	String result = null;
		   	StringBuffer sbf = new StringBuffer();
            URL url=new URL(UtilKsort.BASEURL+httpUrl);
		   	HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		    connection.setDoOutput(true);  
            connection.setDoInput(true);  
            // 设置通用的请求属性
            // POST方法
            connection.setRequestMethod("POST");
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            connection.connect();
	    	OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8缂栫爜
	        out.write(parm+"&key="+UtilKsort.KEY+"&sign="+sign);
	    	out.flush(); 
	        out.close(); 
	    	InputStream is = connection.getInputStream();
	    	reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
	    	String strRead = null;
	    	while ((strRead = reader.readLine()) != null) {
		    	sbf.append(strRead); sbf.append("\r\n");
		    }
		    reader.close();
		    result = sbf.toString();
		    Map<String, Object>  mapres =JSONObject.parseObject(result);
		    logger.info(result);
			if(null!=mapres){
				String code =mapres.get("code").toString();
				String message =null!=mapres.get("message").toString()? 
                         mapres.get("message").toString():"";
			    logger.info(code+"----"+message);
			}else{
				logger.info("推送失败");
			}
			return returnDate.success(ExceptionEnum.SUCCESS);
		} catch (Exception e) { 
			e.printStackTrace();
			logger.info("推送失败");

		}

 

Java中建立MQTT长连接推送数据,通常需要使用MQTT客户端库来实现。Paho是Eclipse基金会的一个项目,提供了Java的MQTT客户端实现,支持MQTT 3.1和3.1.1协议。以下是使用Paho MQTT Java客户端建立长连接的基本步骤: 1. 添加依赖:首先需要将Paho MQTT客户端的依赖添加到你的Java项目中。如果你使用Maven进行项目管理,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> <!-- 请检查并使用最新版本 --> </dependency> ``` 2. 创建连接选项:在建立连接之前,需要创建一个`MqttConnectOptions`实例,并配置相应的参数,例如服务器地址、端口、客户端ID、用户名和密码等。 ```java MqttConnectOptions options = new MqttConnectOptions(); options.setServerURIs(new String[]{"tcp://broker.hivemq.com:1883"}); // 使用HiveMQ公共MQTT服务器示例 options.setCleanSession(false); // 设置为false以保持会话,实现长连接 options.setAutomaticReconnect(true); // 自动重连 ``` 3. 创建MQTT客户端并连接:使用配置好的连接选项创建一个`MqttClient`实例,并通过`connect`方法连接到MQTT代理服务器。 ```java MqttClient client = new MqttClient(options.getServerURIs()[0], "ClientID"); // 客户端ID需唯一 client.connect(options); ``` 4. 订阅主题和发布消息:连接成功后,可以订阅感兴趣的主题,以及向主题发布消息。 ```java // 订阅主题 client.subscribe("your/topic", new IMqttMessageListener() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理接收到的消息 } }); // 发布消息 MqttMessage message = new MqttMessage("Hello MQTT".getBytes()); client.publish("your/topic", message); ``` 5. 断开连接:在不再需要连接时,应该调用`disconnect`方法来断开与MQTT代理的连接。 ```java client.disconnect(); ``` 确保在实际应用中处理异常,并适当管理资源,例如在关闭应用程序时,应当断开MQTT连接。此外,对于生产环境,建议使用安全连接(例如使用TLS/SSL加密连接)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值