接口簽名進行key排序,並MD5加密


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,采用相同的摘要算法生成摘要串,由於相同內容經過相同的摘要算法,生成的摘要內容必定相同。將服務端生成的摘要串與客戶端生成的摘要串進行比較,這樣就能知道參數內容是否被篡改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM