經常使用的加密算法--摘要認證和簽名認證的實現


摘要認證的實現
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等摘要算法生成摘要串;

、使用服務端的公鑰解密;

、比較解密後的結果是否一致;

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


總結:截止今天,我關於經常使用的加密算法系列文章都已發表。原本文章早就寫完,可是到今天才發表。但願對你們的學習有所幫助。固然文章中還有不少須要改正的地方,但願你們不惜賜教!

相關文章
相關標籤/搜索