摘要认证

Posted youzhongmin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摘要认证相关的知识,希望对你有一定的参考价值。

摘要认证原理

随着技术的不断发展,网络中的数据安全变得极为重要。为了能够保障数据不被篡改,可以通过摘要认证的方式进行对数据的保护。摘要认证首先是客户端将参数按照双方约定的序列进行排序,并在参数的后面加上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;
		}
	}

以上是关于摘要认证的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 HTTP 摘要认证

Groovy 摘要认证

CakePHP 3 下的摘要认证

如何在 Flutter 中使用 http 进行摘要认证?

以下代码片段的时间复杂度是多少?

常用的加密算法--摘要认证和签名认证的实现