/* * COPYRIGHT. ShenZhen JiMi Technology Co., Ltd. 2017. * ALL RIGHTS RESERVED. * * No part of this publication may be reproduced, stored in a retrieval system, or transmitted, * on any form or by any means, electronic, mechanical, photocopying, recording, * or otherwise, without the prior written permission of ShenZhen JiMi Network Technology Co., Ltd. * * Amendment History: * * Date By Description * ------------------- ----------- ------------------------------------------- * 2017年4月5日 yaojianping Create the class * http://www.jimilab.com/ */ package com.bonus.data; import java.io.IOException; import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Map; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * @FileName CodeUtils.java * @Description: 服务器签名工具类 * * @Date 2017年4月5日 下午4:59:06 * @author yaojianping * @version 1.0 */ public class SignUtils { public static String signTopRequest(Map params, String secret, String signMethod) throws IOException { // 第一步:检查参数是否已经排序 String[] keys = params.keySet().toArray(new String[0]); Arrays.sort(keys); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); if ("md5".equals(signMethod)) { query.append(secret); } for (String key : keys) { String value = params.get(key); if (StringUtil.areNotEmpty(key, value)) { query.append(key).append(value); } } // 第三步:使用MD5/HMAC加密 query.append(secret); byte[] bytes = encryptMD5(query.toString()); // 第四步:把二进制转化为大写的十六进制 return byte2hex(bytes); } public static byte[] encryptHMAC(String data, String secret) throws IOException { byte[] bytes = null; try { SecretKey secretKey = new SecretKeySpec(secret.getBytes("utf-8"), "HmacMD5"); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); bytes = mac.doFinal(data.getBytes("utf-8")); } catch (GeneralSecurityException gse) { throw new IOException(gse.toString()); } return bytes; } public static byte[] encryptMD5(String data) throws IOException { return encryptMD5(data.getBytes("utf-8")); } private static byte[] encryptMD5(byte[] bytes) throws IOException { MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new IOException(e.toString()); } return md.digest(bytes); } public 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(); } }