摘要認證的實現
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等摘要算法生成摘要串;
、使用服務端的公鑰解密;
、比較解密後的結果是否一致;
、服務端的身份是否被篡改。
總結:截止今天,我關於經常使用的加密算法系列文章都已發表。原本文章早就寫完,可是到今天才發表。但願對你們的學習有所幫助。固然文章中還有不少須要改正的地方,但願你們不惜賜教!