public boolean validateSign(Map<String, Object> map,String sign) throws Exception{
String s="";
Iterator ir=map.keySet().iterator();//获取hashMap的键值,并进行遍历
while(ir.hasNext()){//千万不要用map.keyset,无序的set你懂得,再次打乱你的排序
String key= ir.next().toString();
s+=key;
s+="=";
s+=map.get(key);
}
Token token=tokenDao.findByCode(map.get("companyCode")+"_"+map.get("equipmentCode"));
s+="token="+token.getToken();
MessageDigest md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64=new BASE64Encoder();
String string=base64.encode(md5.digest(s.getBytes("utf-8")));
if(string.equals(sign)){
return true;
}
else {
return false;
}
String s="";
Iterator ir=map.keySet().iterator();//获取hashMap的键值,并进行遍历
while(ir.hasNext()){//千万不要用map.keyset,无序的set你懂得,再次打乱你的排序
String key= ir.next().toString();
s+=key;
s+="=";
s+=map.get(key);
}
Token token=tokenDao.findByCode(map.get("companyCode")+"_"+map.get("equipmentCode"));
s+="token="+token.getToken();
MessageDigest md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64=new BASE64Encoder();
String string=base64.encode(md5.digest(s.getBytes("utf-8")));
if(string.equals(sign)){
return true;
}
else {
return false;
}
}
客户端将参数排序进行MD5加密后,得到sign。 服务端再次将你的参数排序进行MD5加密,比较两次得到的值,相同校验成功。为了防止抓包,然后不停发送攻击的包,可以把
时间戳当做参数加入其中。
public boolean validateTimeStamp(String TimeStamp) throws Exception{
Date dt=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
Date timestamp = sdf.parse(TimeStamp);
if((dt.getTime()-timestamp.getTime())/60000>5){//验证时间戳是否超过五分钟
return false;
}
else{
return true;
}
}