import org.apache.commons.codec.digest.DigestUtils; import java.io.UnsupportedEncodingException; import java.util.Map; import java.util.TreeMap; /** * @Author: rongrong * @Date: 2018/4/23 * @Description: */ public class MD5Utils { private static void getDigest(TreeMap<String, String> map, String key, String charset){ StringBuilder sb = new StringBuilder(); for (Map.Entry entry : map.entrySet()) { sb = sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } sb.append("key").append("=").append(key); System.out.println("拼接后的字符:"+sb.toString()); String sign = DigestUtils.md5Hex(getContentBytes(sb.toString(), charset)); System.out.println("加密后的簽名:"+sign); } private static byte[] getContentBytes(String content, String charset) { if (charset == null || "".equals(charset)) { return content.getBytes(); } try { return content.getBytes(charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException("MD5簽名過程中出現錯誤,指定的編碼集不對,您目前指定的編碼集是:" + charset); } } public static void main(String[] args) { //treeMap默認是key升序排序 ,如果需要降序,可以使用Comparator中的compare方法 TreeMap<String,String> map = new TreeMap<String, String>(); map.put("name", "zychen"); map.put("password", "123456"); map.put("project", "base"); map.put("tenantId", "192319387131"); getDigest(map, "helloWorld","utf-8"); } }
簡單敘說jwt加密原理以及這樣加密方式的優缺點?
原理:JWT由三部分組成:header.payload.signature,每部分是一個Json表示。最終的Token對這三部分進行編碼之后的字符串,中間用“.”分割。header用來描述token的類型(jwt)以及使用的hash算法,payload包含一些摘要信息,signature簽名由前面的Header、Payload以及秘鑰組成。當訪問登錄頁的時候,登錄服務驗證之后,簽發證書返回給客戶端。客戶端保存證書,並在每次請求時將其附在request header中。服務器接收請求之后,通過簽名和時戳,驗證Token的有效性。若有效,則響應客戶端。
優點:無狀態,不需要在 session中存儲用戶信息,不用擔心跨域問題,只需在用戶驗證成功后,獲取一個JWT token,服務端驗證簽名即可,比 cookie 更支持原生移動端應用,驗證解耦,無需使用特定的身份驗證方案,token可以在任何地方生成
缺點:
1.請求地址中的token容易被盜取,難以保證token本身的安全
2.HTTP 頭中自定義屬性但是局限性太大,XMLHttpRequest 請求通常用於Ajax方法中對於頁面局部的異步刷新,通過該類請求得到的頁面不能被瀏覽器所記錄下,從而進行前進,后退,刷新,收藏等操作,給用戶帶來不便
摘要認證:
采用對參數和響應進行摘要的方法,每次請求和響應,按照一定的規則生成數字摘要,客戶端和服務端雙方需要約定好參數的排序方式,請求的參數經過排序后,再將參數名名稱和值經過一定的策略組織起來,加上一個秘鑰secret,就是‘鹽’通過約定的摘要算法生成數字摘要,傳遞給服務端。服務端在接收到客戶端傳遞的參數后,服務端會采取和客戶端相同的策略對參數進行排序,並且加上相同的secret,采用相同的摘要算法生成摘要串,由於相同內容經過相同的摘要算法,生成的摘要內容必定相同。將服務端生成的摘要串與客戶端生成的摘要串進行比較,這樣就能知道參數內容是否被篡改。
