摘要认证的实现
java
摘要认证明现主要包含四个方面:客户端参数摘要生成、服务端参数摘要检验、服务端响应摘要生成和客户端响应摘要检验。算法
一、客户端参数摘要生成过程:服务器
a、请求参数;ide
b、参数排序;学习
c、将参数串接起来,加上secret,生成待摘要字符串;加密
d、使用MD5等摘要算法生成摘要字符串;spa
e、摘要串。code
/** * @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); } }
二、服务端参数摘要校验过程:排序
a、请求参数;md5
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等摘要算法生成摘要串;
、使用服务端的公钥解密;
、比较解密后的结果是否一致;
、服务端的身份是否被篡改。
总结:截止今天,我关于经常使用的加密算法系列文章都已发表。原本文章早就写完,可是到今天才发表。但愿对你们的学习有所帮助。固然文章中还有不少须要改正的地方,但愿你们不惜赐教!