一段java加密代码不理解,求指点

Axing21cn 2017-09-16 08:42:17
加密的函数
public static String a(HashMap<String, String> paramHashMap, String paramString)
{
Object localObject1 = new LinkedHashMap();
Object localObject2 = paramHashMap.keySet().toArray();
Arrays.sort((Object[])localObject2);
int j = localObject2.length;
int i = 0;
for (;;)
{
if (i < j)
{
Object localObject3 = localObject2[i];
try
{
((LinkedHashMap)localObject1).put(localObject3.toString(), URLEncoder.encode(((String)paramHashMap.get(localObject3)).toString(), "UTF-8"));
i++;
}
catch (UnsupportedEncodingException localUnsupportedEncodingException)
{
for (;;)
{
localUnsupportedEncodingException.printStackTrace();
}
}
}
}
paramHashMap = new StringBuilder();
localObject2 = ((LinkedHashMap)localObject1).entrySet().iterator();
while (((Iterator)localObject2).hasNext())
{
localObject1 = (Map.Entry)((Iterator)localObject2).next();
if (paramHashMap.length() > 0) {
paramHashMap.append("&");
}
paramHashMap.append((String)((Map.Entry)localObject1).getKey());
paramHashMap.append("=");
paramHashMap.append((String)((Map.Entry)localObject1).getValue());
}
paramHashMap = MD5.md5(paramHashMap.toString().replace("*", "%2A").replace("%7E", "~").replace("+", "%20"));
localObject1 = new StringBuilder();
((StringBuilder)localObject1).append(paramHashMap);
((StringBuilder)localObject1).append("c7830e4a5ef70ce3573c1d330d435629");
((StringBuilder)localObject1).append(paramString);
return MD5.md5(((StringBuilder)localObject1).toString());
}

调用的函数
public RequestParams a(RequestParams paramRequestParams, String paramString)
{
RequestParams localRequestParams = new RequestParams();
localRequestParams.put("siteid", "10001");
localRequestParams.put("clientid", "1");
localRequestParams.put("ip", AppUtil.getLocalIP());
localRequestParams.put("system_name", "android");
localRequestParams.put("modules", paramString);
long l = System.currentTimeMillis();
localRequestParams.put("type", "android");
paramString = new HashMap(localRequestParams.getURLHashMap());
paramString.putAll(paramRequestParams.getURLHashMap());
localRequestParams.put("sign", a(paramString, l + ""));
localRequestParams.put("time", l + "");
return localRequestParams;
}


按照我的理解,加密的逻辑是 先把url中的参数排序依次,然后顺序用&符号拼接,产生一个字符串(拼接过程中把value进行urlencode)产生字符串A
比如:clientid=1&ip=10.0.2.15&modules=menu%3a1&siteid=10001&system_name=android&type=android

然后把得到的长字符串A进行一次MD5运算,得到结果B

接着,在字符串B的后面加上代码中的一个固定salt,以及一个时间戳,产生一个新的字符串C

最后,把字符串C进行一次MD5运算,就得到了最终结果 sign
通过抓包得到的有效数据:
sign=0c06a79057226b0609293277307a4ec7&clientid=1&time=1505490330305&system_name=android&siteid=10001&type=android&modules=menu:1&ip=10.0.2.15

但是,我自己按照以上逻辑始终不能得到正确的sign,不知道是我哪里理解错误了.希望各位Java大神能指点一下
...全文
242 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Axing21cn 2017-09-16
  • 打赏
  • 举报
回复
补充一下,MD5的类 package com.cmstop.ctmediacloud.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { public static final String md5(String paramString) { char[] arrayOfChar = new char[16]; char[] tmp8_6 = arrayOfChar; tmp8_6[0] = 48; char[] tmp13_8 = tmp8_6; tmp13_8[1] = 49; char[] tmp18_13 = tmp13_8; tmp18_13[2] = 50; char[] tmp23_18 = tmp18_13; tmp23_18[3] = 51; char[] tmp28_23 = tmp23_18; tmp28_23[4] = 52; char[] tmp33_28 = tmp28_23; tmp33_28[5] = 53; char[] tmp38_33 = tmp33_28; tmp38_33[6] = 54; char[] tmp44_38 = tmp38_33; tmp44_38[7] = 55; char[] tmp50_44 = tmp44_38; tmp50_44[8] = 56; char[] tmp56_50 = tmp50_44; tmp56_50[9] = 57; char[] tmp62_56 = tmp56_50; tmp62_56[10] = 97; char[] tmp68_62 = tmp62_56; tmp68_62[11] = 98; char[] tmp74_68 = tmp68_62; tmp74_68[12] = 99; char[] tmp80_74 = tmp74_68; tmp80_74[13] = 100; char[] tmp86_80 = tmp80_74; tmp86_80[14] = 101; char[] tmp92_86 = tmp86_80; tmp92_86[15] = 102; tmp92_86; try { Object localObject = paramString.getBytes(); paramString = MessageDigest.getInstance("MD5"); paramString.update((byte[])localObject); paramString = paramString.digest(); int k = paramString.length; localObject = new char[k * 2]; int j = 0; int i = 0; while (j < k) { int m = paramString[j]; int n = i + 1; localObject[i] = ((char)arrayOfChar[(m >>> 4 & 0xF)]); i = n + 1; localObject[n] = ((char)arrayOfChar[(m & 0xF)]); j++; } paramString = new java/lang/String; paramString.<init>((char[])localObject); } catch (Exception paramString) { for (;;) { paramString = null; } } return paramString; } private static String toHexString(byte[] paramArrayOfByte, String paramString) { StringBuilder localStringBuilder = new StringBuilder(); int j = paramArrayOfByte.length; for (int i = 0; i < j; i++) { localStringBuilder.append(Integer.toHexString(paramArrayOfByte[i] & 0xFF)).append(paramString); } return localStringBuilder.toString(); } public static String toMd5(byte[] paramArrayOfByte) { if (paramArrayOfByte == null) { paramArrayOfByte = ""; } for (;;) { return paramArrayOfByte; try { MessageDigest localMessageDigest = MessageDigest.getInstance("MD5"); localMessageDigest.reset(); localMessageDigest.update(paramArrayOfByte); paramArrayOfByte = toHexString(localMessageDigest.digest(), ""); } catch (NoSuchAlgorithmException paramArrayOfByte) { throw new RuntimeException(paramArrayOfByte); } } } }

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧