当前位置:首页 > 算法 > 正文内容

链接地址的签名生成过程

淙嶙7年前 (2018-08-16)算法1220

签名的作用

校验url中对外暴露的参数传输过程中是否被篡改。生成url的时候,通过对其中的[全部或部分]参数+私钥进行MD5加密处理生成一个签名,将生成的签名一起放入url中,这样一个带有签名的url生成了。在需要校验url的时候,取出加密是所用的参数,将这些参数+私钥再次生成一个签名,对比签名是否一致,一致即url没有被篡改。【能实现的根本原因就是有一个他人获取不到的私钥】。

签名的生成

1.url地址:http://[ip]:[port]/method?pid=1233&uid=9344&price=99 2.参数列表:pid=1233&uid=9344&price=99&time_stamp=1532333455 3.加入key[自己生成的私钥]: pid=1233&uid=9344&price=99&time_stamp=1532333455&key=DEE334FGEER4 4.参数排序:sort(pid=1233&uid=9344&price=99&key=DEE334FGEER4&time_stamp=1532333455); 5.MD5加密[使用盐值更安全]:sign = md5(pid=1233&uid=9344&price=99&key=DEE334FGEER4&time_stamp=15323334554);

简单代码实现

    public static void main(String[] args) {
        HashMap<String,String> paramMap = new HashMap<>(8);
        paramMap.put("pid","1233");
        paramMap.put("uid","9344");
        paramMap.put("price","99");
        paramMap.put("time_stamp","1532333455");
        paramMap.put("key","DEE334FGEER4");
        String sign = SignUtil.getSignContent(paramMap);
        System.out.println(SignUtil.getMD5Str(sign));
    }


public class SignUtil {
    public static String getSignContent(Map<String, String> sortedParams) {
        StringBuffer content = new StringBuffer();
        ArrayList keys = new ArrayList(sortedParams.keySet());
        Collections.sort(keys);
        int index = 0;
        for(int i = 0; i < keys.size(); ++i) {
            String key = (String)keys.get(i);
            String value = sortedParams.get(key);
            if(StringUtils.isNotBlank(key)) {
                content.append("&" + key + "=" + value);
            }
        }
        return content.substring(1);
    }

    public static String getMD5Str(String str) {
        MessageDigest messageDigest;
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(str.getBytes("UTF-8"));
            byte[] byteArray = messageDigest.digest();
            StringBuffer md5StrBuff = new StringBuffer();
            for (int i = 0; i < byteArray.length; i++) {
                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
                else
                    md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
            }
            return md5StrBuff.toString().toUpperCase();
        } catch (NoSuchAlgorithmException e) {
          //  logger.error("NoSuchAlgorithmException caught!",e);
         //   System.exit(-1);
        } catch (UnsupportedEncodingException e) {
            //  logger.error("UnsupportedEncodingException",e);
        }
        return null;
    }
}

相关文章

leetcode - 3无重复字符的最长子串

leetcode - 3无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例1: 输入: “abcabcbb”输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入:...

leetcode - 1.两数之和

leetcode - 1.两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示...

leetcode - 2两数相加

leetcode - 2两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。