摘要认证的实现
摘要认证实现主要包含四个方面:客户端参数摘要生成、服务端参数摘要检验、服务端响应摘要生成和客户端响应摘要检验。
1、客户端参数摘要生成过程:
a、请求参数;
b、参数排序;
c、将参数串接起来,加上secret,生成待摘要字符串;
d、使用MD5等摘要算法生成摘要字符串;
e、摘要串。
/**
* @param params 需要传递到服务端的参数
* @return
* @throws Exception
*/
private String getDigest(Map<String,String> params) throws Exception {
String secret = "abcdefjhigklmn";
Set<String> keySet = params.keySet();
//使用treeset进行排序
TreeSet<String> sortSet = new TreeSet<String>();
sortSet.addAll(keySet);
String keyvalueStr = "";
Iterator<String> it = sortSet.iterator();
while (it.hasNext()) {
String key = it.next();
String value = params.get(key);
keyvalueStr += key+value;
}
keyvalueStr += secret;
String bs64Str = byte2base64(getMD5(keyvalueStr));
return bs64Str;
}
/**
* 实现MD5的加密
*
* @param con
* 需要加密的字符串
* @return
* @throws Exception
*/
private static byte[] getMD5(String con) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(con.getBytes("utf-8"));
return bytes;
}
/**
* base64 解码
* @param bytes
* @return
*/
private static String byte2base64(byte[] bytes) {
BASE64Encoder bse = new BASE64Encoder();
return bse.encode(bytes);
}
}
2、服务端参数摘要校验过程:
a、请求参数;
b、参数排序;
c、将参数串接起来,加上secret,生成摘要字符串;
d、使用MD5等摘要算法生成摘要串;
e、服务端生成的摘要串与客户端通过header传递过来的摘要串进行比较;
f、参数是否被篡改。
/**
* 服务端参数摘要检验
* @param params
* @param digest
* @return
* @throws Exception
*/
private boolean validate (Map params,String digest) throws Exception {
String secret = "abcdefjhigklmn";
Set<String> keySet = params.keySet();
//使用treeset进行排序
TreeSet<String> sortSet = new TreeSet<String>();
sortSet.addAll(keySet);
String keyvalueStr = "";
Iterator<String> it = sortSet.iterator();
while (it.hasNext()) {
String key = it.next();
String[] values = (String[]) params.get(key);
keyvalueStr += key + values[0];
}
keyvalueStr += secret;
String bs64Str = byte2base64(getMD5(keyvalueStr));
if (bs64Str.equals(digest)) {
return true;
}else {
return false;
}
}
/**
* 实现MD5的加密
*
* @param con
* 需要加密的字符串
* @return
* @throws Exception
*/
private static byte[] getMD5(String con) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(con.getBytes("utf-8"));
return bytes;
}
/**
* base64 解码
* @param bytes
* @return
*/
private static String byte2base64(byte[] bytes) {
BASE64Encoder bse = new BASE64Encoder();
return bse.encode(bytes);
}
3.服务端响应摘要生成过程
a、响应内容;
b、在响应内容后面加上secret,生成待摘要的字符串;
c、使用MD5等摘要算法生成摘要串;
d、响应摘要串。
private String getDigest(String con) throws Exception {
String secret = "abcdefjhigklmn";
con += secret;
String bs64Str = byte2base64(getMD5(con));
return bs64Str;
}
/**
* 实现MD5的加密
*
* @param con
* 需要加密的字符串
* @return
* @throws Exception
*/
private static byte[] getMD5(String con) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(con.getBytes("utf-8"));
return bytes;
}
/**
* base64 解码
* @param bytes
* @return
*/
private static String byte2base64(byte[] bytes) {
BASE64Encoder bse = new BASE64Encoder();
return bse.encode(bytes);
}
4.客户端响应摘要校验过程
a、服务端响应内容;
b、客户端接收到响应内容后,在后面加上secret,生成待摘要串;
c、使用MD5等摘要算法生成摘要串;
d、客户端生成的摘要串与服务器通过header传递过来的摘要串进行比较;
e、响应是否被篡改。
private boolean validate (String resCon,String digest) throws Exception {
String secret = "abcdefjhigklmn";
byte[] bytes = getMD5(resCon+secret);
String resDigest = byte2base64(bytes);
if (resDigest.equals(resCon)) {
return true;
}else {
return false;
}
}
/**
* 实现MD5的加密
*
* @param con
* 需要加密的字符串
* @return
* @throws Exception
*/
private static byte[] getMD5(String con) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(con.getBytes("utf-8"));
return bytes;
}
/**
* base64 解码
* @param bytes
* @return
*/
private static String byte2base64(byte[] bytes) {
BASE64Encoder bse = new BASE64Encoder();
return bse.encode(bytes);
}
签名认证的实现
签名认证的优势:加密的时候使用私钥,解密的时候使用公钥。
签名认证的实现包含四个方面:客户端参数签名生成、服务端参数签名校验、服务端响应签名生成和客户端响应参数校验。
1.客户端参数签名生成过程
a、请求参数;
b、参数排序;
c、将参数串接起来,生成待摘要字符串;
d、使用MD5等摘要算法生成摘要字符串;
e、使用客户端的私钥对摘要串加密;
f、数字签名。
2.服务端参数签名校验过程
a、请求参数;
b、参数排序;
c、将参数串接起来生成待摘要串;
d、使用MD5等算法进行摘要加密;
e、使用客户端的公钥对接受到的数字签名进行解密,得到客户端传递的摘要串;
f、比较解密的客户端摘要串与服务端生成的摘要串比较;
g、客户端的身份内容是否被篡改。
3.服务端响应签名生成过程
a、响应内容;
b、响应内容作为待摘要串;
c、使用MD5等摘要算法生成摘要串;
d、使用服务端的私钥对摘要串加密;
e、数字签名。
4.客户端响应签名校验过程
、响应内容;
、响应内容作为待摘要串;
、使用MD5等摘要算法生成摘要串;
、使用服务端的公钥解密;
、比较解密后的结果是否一致;
、服务端的身份是否被篡改。
总结:截止今天,我关于常用的加密算法系列文章都已发表。本来文章早就写完,但是到今天才发表。希望对大家的学习有所帮助。当然文章中还有很多需要改正的地方,希望大家不惜赐教!
转载于:https://blog.51cto.com/wang963825/1862680