對url路徑中的參數進行加密--Java


需求:
后台對一些比較敏感的參數進行數據加密,然后在傳送到前端。當前端跳轉到后台時,再由后台對其進行解密。

參考 針對url參數的加密解密算法(java版)
修改:對中間的js頁面加密代碼改寫為java

package com.example.utils;

import java.util.Random;
import java.util.regex.Pattern;
/*
 *功能:對url加密算法(只針對window.location.href跳轉,不針對post表單提交及ajax方式)
 *算法:對於暴露在瀏覽器地址欄中的屬性值進行加密,如一個屬性為agentID=1,
 *     若對1加密后為k230101io934jksd32r4,說明如下:
 *     前三位為隨機數;
 *     第四到第五位為要加密字符轉換成16進制的位數,
 *       如:要加密字符為15轉換成16進制為f,位數為1,則第四、五位為01;
 *     第六位標識要加密字符為何種字符,0:純數字,1:字符
 *       若是字符和數字的混合,則不加密;
 *     從第七位開始為16進制轉換后的字符(字母和非數字先轉換成asc碼);
 *     若加密后的字符總位數不足20位,則用隨機數補齊到20位,若超出20位,則不加隨機數。
 *     即加密后總位數至少為20位。
 */
public class EncryptionUtils {
    
    private static String encode16(String str) {
        str = str.toLowerCase();
        if (!Pattern.matches("^[-\\+]?\\d+$", str)){//非整數字符,對每一個字符都轉換成16進制,然后拼接
            String[] s=str.split("");
            String temp="";
            for(int i=0;i<s.length;i++){
                s[i]=stringToUnicode(s[i]);//先轉換成Unicode編碼
                temp=temp+s[i];
            }
            return temp+":"+1;//1代表字符
        }else{//數字直接轉換成16進制
            str=Integer.toHexString(Integer.valueOf(str));
//            System.out.println("aa---->"+str);
            return str+":"+0;//0代表純數字
        }
    }

    /**
     * 字符串轉unicode
     *
     * @param str
     * @return
     */
    private static String stringToUnicode(String str) {
        StringBuffer sb = new StringBuffer();
        char[] c = str.toCharArray();
        for (int i = 0; i < c.length; i++) {
            sb.append(Integer.toHexString(c[i]));
        }
        return sb.toString();
    }

    private static String produceRandom(int n){
        String num="";
        Random random = new Random();
        for(int i=0;i<n;i++) {
            num += random.nextInt(10);
        }
        return num;
    }

    //主加密函數
    public static String encodeValue(String str){
        String encryptStr="";//最終返回的加密后的字符串
        encryptStr+=produceRandom(3);//產生3位隨機數
        String encode16 = encode16(str);
//        System.out.println("----encode16----->"+encode16);
        String[] temp = encode16.split(":");//對要加密的字符轉換成16進制
        int numLength=temp[0].length();//轉換后的字符長度
        String numLengthStr=Integer.toHexString(numLength);//字符長度換算成16進制
        if(numLengthStr.length()==1){//如果是1,補一個0
            numLengthStr="0"+numLengthStr;
        }else if(numLengthStr.length()>2){//轉換后的16進制字符長度如果大於2位數,則返回,不支持
            return "";
        }
        encryptStr+=numLengthStr;
//        System.out.println("encryptStr----->"+encryptStr);

        if(temp[1].equals("0")){
            encryptStr+="0";
        }else if(temp[1].equals("1")){
            encryptStr+="1";
        }
//        System.out.println("encryptStr----->"+encryptStr);
        encryptStr+=temp[0];
//        System.out.println("encryptStr----->"+encryptStr);

        if(encryptStr.length()<20){//如果小於20位,補上隨機數
            String ran=produceRandom(20-encryptStr.length());
//            System.out.println("補充的數字為"+ran);
            encryptStr+=ran;
        }
        return encryptStr;
    }

/*
解密為加密的逆過程
*/
    public static String decodeValue(String value){
        if(value.equals("")){
            throw new NullPointerException();
        }
        if(value.length()<20){
            throw new NullPointerException();
        }
        String charLength=value.substring(3, 5);//加密后的字符有多少位
        int charLen=Integer.parseInt(charLength,16);//轉換成10進制
        int type=Integer.parseInt(value.substring(5, 6));//加密字符的類型(0:數字,1:字符串)
        String valueEnc=value.substring(6, 6+charLen);//16進制字符串
        if(type==0){
            int trueValue=Integer.parseInt(valueEnc,16);
            return String.valueOf(trueValue);
        }else{
            StringBuilder sb=new StringBuilder();
            String[] valueEncArray=valueEnc.split("");
            for(int i=0;i<valueEncArray.length-1;i+=2){
                int value10=Integer.parseInt(valueEncArray[i]+valueEncArray[i+1],16);//轉換成10進制的asc碼
                sb.append((char)value10);//asc碼轉換成字符
            }
            return sb.toString();
        }
    }

    public static void main(String[] args) {
        String str="123";
        System.out.println(Pattern.matches("^[-\\+]?\\d+$", str));
        String s = encodeValue(str);
        System.out.println("加密結果------>"+s);

        String decodeValue = decodeValue(s);
        System.out.println("解密結果------>"+decodeValue);

    }
}


免責聲明!

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



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