常用的加密算法--摘要认证和签名认证的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的加密算法--摘要认证和签名认证的实现相关的知识,希望对你有一定的参考价值。
摘要认证的实现
摘要认证实现主要包含四个方面:客户端参数摘要生成、服务端参数摘要检验、服务端响应摘要生成和客户端响应摘要检验。
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等摘要算法生成摘要串;
、使用服务端的公钥解密;
、比较解密后的结果是否一致;
、服务端的身份是否被篡改。
总结:截止今天,我关于常用的加密算法系列文章都已发表。本来文章早就写完,但是到今天才发表。希望对大家的学习有所帮助。当然文章中还有很多需要改正的地方,希望大家不惜赐教!
本文出自 “In the eyes of the sun” 博客,请务必保留此出处http://wang963825.blog.51cto.com/8695943/1862680
以上是关于常用的加密算法--摘要认证和签名认证的实现的主要内容,如果未能解决你的问题,请参考以下文章
java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证