摘要认证的实现


   摘要认证实现主要包含四个方面:客户端参数摘要生成、服务端参数摘要检验、服务端响应摘要生成和客户端响应摘要检验。


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等摘要算法生成摘要串;

、使用服务端的公钥解密;

、比较解密后的结果是否一致;

、服务端的身份是否被篡改。


总结:截止今天,我关于常用的加密算法系列文章都已发表。本来文章早就写完,但是到今天才发表。希望对大家的学习有所帮助。当然文章中还有很多需要改正的地方,希望大家不惜赐教!