摘要认证原理
随着技术的不断发展,网络中的数据安全变得极为重要。为了能够保障数据不被篡改,可以通过摘要认证的方式进行对数据的保护。摘要认证首先是客户端将参数按照双方约定的序列进行排序,并在参数的后面加上secret,按照约定的摘要算法生成数字摘要传递到服务端。服务端在接收到摘要和参数后将参数按照一定的序列进行排序并加上秘钥secret生成数字摘要,将生成的数字摘要与传递过来的摘要进行比较,判断参数的完整性。在服务端在处理完业务后将生成的响应按照一定的策略排序并加上secret生成数字摘要,将参数与数字摘要一同发送到客户端。客户端在收到响应后依然需要对响应进行验证。
摘要认证实现
1、客户端参数摘要生成
将客户端传输的参数按照两端指定的顺序进行排序,并在参数串的末尾加上secret生成待摘要字符串,通过摘要算法对字符串进行摘要运算,将正文和摘要一同发送到服务端。
private static String getDigest(Map<String,String> params){
String secret = "ancdwiwi";
Set<String> keySet = params.keySet();
TreeSet<String> sortSet = new TreeSet<String>();
sortSet.addAll(keySet);
String content = "";
Iterator<String> iterator = sortSet.iterator();
while(iterator.hasNext()){
String key = iterator.next();
String value = params.get(key);
content +=key + value;
}
content+=secret;
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] input = base64Decoder.decoderBuffer(content);
byte[] bytes = MessageDigest.getInstance("MD5").digest(input);
String base64Str = base64Decoder.encode(bytes);
}
2、服务端参数校验
服务端在接收到客户端信息后,将正文参数按照约定的参数排序并在末尾加上secret生成待摘要的字符串,通过摘要算法对字符串进行摘要运算,生成摘要,与传输过来的摘要进行比较,判断数据的完整性。
private static boolean getDigest(Map<String,String> params,String digest){
String secret = "ancdwiwi";
Set<String> keySet = params.keySet();
TreeSet<String> sortSet = new TreeSet<String>();
sortSet.addAll(keySet);
String content = "";
Iterator<String> iterator = sortSet.iterator();
while(iterator.hasNext()){
String key = iterator.next();
String value = params.get(key);
content +=key + value;
}
content+=secret;
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] input = base64Decoder.decoderBuffer(content);
byte[] bytes = MessageDigest.getInstance("MD5").digest(input);
String base64Str = base64Decoder.encode(bytes);
if(digest.equals(base64Str)){
return true;
}else {
return false;
}
}
3、服务端响应生成
在服务端处理完业务数据,将响应按照约定的参数排序并加上secret进行摘要,将摘要和响应数据一同发送到客户端。
private String getDigest(String content){
String secret = "ancdwiwi";
content +=secret;
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] input = base64Decoder.decoderBuffer(content);
byte[] bytes = MessageDigest.getInstance("MD5").digest(input);
String base64Str = base64Decoder.encode(bytes);
return base64Str;
}
4、客户端响应校验
客户端在收到响应后,按照同样的规则进行判断数据的完整性。
private boolean getDigest(String content,String digest){
String secret = "ancdwiwi";
content +=secret;
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] input = base64Decoder.decoderBuffer(content);
byte[] bytes = MessageDigest.getInstance("MD5").digest(input);
String base64Str = base64Decoder.encode(bytes);
if(base64Str.equals(digest)){
return true;
}else{
return false;
}
}