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

链接地址的签名生成过程

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

签名的作用

校验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;
    }
}

相关文章

Java transient关键字使用小记

Java transient关键字使用小记

1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。 2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被tran...

多线程依次顺序轮询执行方案

多线程依次顺序轮询执行方案

多线程轮询执行问题解决方案: 比如有三个线程 thread1 ,thread2, thread3。 规则:thread1运行 -> thread2运行 -> thread3 -> t...

leetcode - 2两数相加

leetcode - 2两数相加

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

发表评论

访客

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