1. 程式人生 > >自定義網路傳輸資料加密與解密

自定義網路傳輸資料加密與解密

最近做一個電商類的APP,進行後臺資料介面的呼叫。這期間涉及到財務賬目的往來,自然很需要重視資料安全的問題。我沒有搞過爬蟲、抓包之類的技術,但是如果傳輸過程中的資料被抓,如果被破解了肯定會出問題的。所以我考慮自己做一個加密和解密的演算法,在後臺將資料打包後進行加密,APP拿到資料又進行解密。

經過測試,基本實現了這個過程。

首先,我要確定一個思路,就是如何進行加密。解密的過程是一個逆運算。我決定先將字串和密碼進行迴圈的異或運算,因為抑或運算的逆運算就是自己,比較方便,然後拿這個結果進行base64編碼。其實這期間還可以根據自己的設定進行一些其他的運算,只要不公開演算法,破解起來恐怕也不容易的。至於解碼,就是先將拉到的資料進行base64解碼,再和相同的密碼進行一次迴圈異或運算就OK了。

思路已敲定,我先開啟一個Idea+SpringBoot的專案,寫一個加密與解密的工具類CodeUtils.java,其中包含兩個方法encode()和decode():

public class CodeUtils {
    /**
     * 加密
     *
     * @param source 未加密的字串
     * @param passWord 密碼
     * @return
     */
    public static String encode(String source, String passWord) {
        byte[] arr1 = source.getBytes();
        byte[] arr2 = passWord.getBytes();
        //先進行異或運算
        //在此前後進行其他個性化演算法
        byte[] bytes = xorByteArray(arr1, arr2);
        //再進行Base64編碼
        String encodeStr = new BASE64Encoder().encode(bytes);
        return encodeStr;
    }

    /**
     * 解密
     *
     * @param encodeStr 已經加密過的字串
     * @param passWord 密碼
     * @return
     */
    public static String decode(String encodeStr, String passWord) throws IOException {
        byte[] arr2 = passWord.getBytes();
        //先進行Base64解碼
        byte[] arr1 = new BASE64Decoder().decodeBuffer(encodeStr);
        //再進行異或運算
        byte[] bytes = xorByteArray(arr1, arr2);
        //再進行Base64編碼
        String decodeStr = new String(bytes, "utf-8");
        //在此前後進行其他個性化演算法
        return decodeStr;
    }

    /**
     * 對兩個位元組陣列進行抑或運算
     *
     * @param arr1 基本陣列
     * @param arr2 運算陣列
     * @return
     */
    public static byte[] xorByteArray(byte[] arr1, byte[] arr2) {
        int len2 = arr2.length;
        byte[] arr3 = new byte[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr3[i] = (byte) (arr1[i] ^ arr2[i % len2]);
        }
        return arr3;
    }
}

加密和解密的思路有兩點:一是處理過程相反,二是位元組陣列是密碼字串位元組陣列迴圈與資料字串位元組陣列進行異或運算。

接下來在介面方法中呼叫處理:

@PostMapping("/getuserbyte")
    public String getuserbyte() throws UnsupportedEncodingException {
        UserModel userModel = new UserModel(1, "Chris Chen", "123456");
        String passWord = "kalychen";
        String resultStr = new Gson().toJson(new NetResult<UserModel>(0, "getUserByte Success", userModel));
        System.out.println("有人呼叫~~~~~~~~");
        return CodeUtils.encode(resultStr, passWord);
    }

另外建一個Java專案,通過配置retrofit2來呼叫介面。具體程式碼就不貼了。解碼的處理要在json解析之前,所以我在;攔截器中進行處理。
public class NetInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        String passWord="kalychen";
        Request request = chain.request();
        Response response = chain.proceed(request);
        ResponseBody responseBody=response.body();
        String encodeStr = responseBody.string();
        System.out.println("攔截到的返回資料==>"+encodeStr);
        String decodeStr= CodeUtils.decode(encodeStr,passWord);
        System.out.println("解碼後的返回資料==>"+decodeStr);
        return response.newBuilder()
                .body(responseBody.create(responseBody.contentType(),decodeStr))
                .build();
    }
}

寫一段測試程式碼:
public class Test {
    public static void main(String[] args){
        NetCallback callback=new NetCallback() {
            @Override
            protected void onComplete(NetResponse netResponse) {
            }
        };
        TestApi.getUserByte(callback);
    }
}

測試結果是這樣的:

"C:\Program Files\Java\jdk1.8.0_92\bin\java" "-javaagent:C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2017.1\lib\idea_rt.jar=55249:C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2017.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_92\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\rt.jar;F:\WorkSpace\IdeaProjects\GradleJavaProject\build\classes\java\main;D:\Gradle\gradle-4.1\caches\modules-2\files-2.1\com.squareup.retrofit2\converter-gson\2.1.0\aa557d71ead91cbf26e0c316a0f593d168303309\converter-gson-2.1.0.jar;D:\Gradle\gradle-4.1\caches\modules-2\files-2.1\com.squareup.retrofit2\retrofit\2.1.0\2de7cd8b95b7021b1d597f049bcb422055119f2c\retrofit-2.1.0.jar;D:\Gradle\gradle-4.1\caches\modules-2\files-2.1\com.google.code.gson\gson\2.8.0\c4ba5371a29ac9b2ad6129b1d39ea38750043eff\gson-2.8.0.jar;D:\Gradle\gradle-4.1\caches\modules-2\files-2.1\com.squareup.okhttp3\okhttp\3.3.0\2b802460eea20f8f2ad9c08c74e0f14718e88aa9\okhttp-3.3.0.jar;D:\Gradle\gradle-4.1\caches\modules-2\files-2.1\com.squareup.okio\okio\1.8.0\5ea7af56cc7c567ed9856d99efb30740e9b17ff\okio-1.8.0.jar" cn.chrischens.gd.Test
攔截到的返回資料==>EEMPFgcNR1RbTU4UEA9HVEkGCQ02GwAcKRgYHEM7EA0IBB8KQURHCgoVDVtZE0cHD0NWSE9KEB0O
EyIYDg1HVEkiBAsKG0UtAwQCW09KFQ8YEhsWEQxHVElQXkpXXVNMFhw=
解碼後的返回資料==>{"code":0,"msg":"getUserByte Success","data":{"id":1,"userName":"Chris Chen","password":"123456"}}
返回的可解析的json===>{"code":0,"msg":"getUserByte Success","data":{"id":1.0,"userName":"Chris Chen","password":"123456"}}//這一句是callback列印的

測試結果符合預期。

相關推薦

定義網路傳輸資料加密解密

最近做一個電商類的APP,進行後臺資料介面的呼叫。這期間涉及到財務賬目的往來,自然很需要重視資料安全的問題。我沒有搞過爬蟲、抓包之類的技術,但是如果傳輸過程中的資料被抓,如果被破解了肯定會出問題的。所以我考慮自己做一個加密和解密的演算法,在後臺將資料打包後進行加密,APP拿

網路傳輸加密解密

由於網際網路早期並沒有考慮到資料報文安全的問題,早期的理念都是基於進行通訊的。現在隨著網路興起,網際網路上慢慢有很多“犯罪團體”,用較低的犯罪成本通常是基於一個網路通訊協議的一個小的漏洞來完成竊取、篡改、重播其他人的資料報文。 而往往計算機網路安全維護者和那些惡意攻擊者

MySQL資料加密解密

1.建立表,密碼欄位必須是32位,不然,插入資料進行MD5加密時,此欄位不能加密。 表結構: 2.在表中插入資料,u_pwd表字段進行MD5加密。 SQL語句: insert into t_user

python 定義加密解密

import tkinter import webbrowser import re #本程式是一箇中文字元和中文檢測工具 #中文字元自己新增,我只添加了一點 #輸入字串,點選檢查文字即可判斷有沒有中文字元 # qianxiao996精心製作 #部落格地址:h

Java類載入器( CLassLoader ) 死磕7: 基於加密定義網路載入器 本小節目錄

【正文】Java類載入器(  CLassLoader ) 死磕7:  基於加密的自定義網路載入器 本小節目錄 7.1. 加密傳輸Server端的原始碼 7.2. 加密傳輸Client端的原始碼 7.3. 使用亦或實現簡單加密和解密演算法 7. 網路加密SafeClassLoader的原

Unity C# 定義TCP傳輸協議以及封包拆包、解決粘包問題(網路應用層協議)

本文只是初步實現了一個簡單的基於TCP的自定協議,更為複雜的協議可以根據這種方式去擴充套件。 網路應用層協議,通俗一點的講,它是一種基於socket傳輸的由傳送方和接收方事先協商好的一種訊息包組成結構,主要由訊息頭和訊息體組成。  眾所周知,基於socket的資訊互動有兩

Android定義網路資料載入等待框的簡單封裝

先上效果圖(在5.0以上機型顯示效果,如果是4.0會變為灰色): 自定義Dialog如下: public class LoadingCustom extends Dialog{ pr

AES對資料進行加密解密

AES對資料進行加密與解密隨著對稱密碼的發展,DES資料加密標準演算法由於金鑰長度較小(56位),已經不適應當今分散式開放網路對資料加密安全性的要求,因此1997年NIST公開徵集新的資料加密標準,即AES[1]。經過三輪的篩選,比利時Joan Daeman和Vincent Rijmen提交的Rijndael

SpringMvc擴充套件定義註解實現web加密解密 不侵入業務程式碼

SpringMvc擴充套件自定義註解實現web解密 不侵入業務程式碼(1) 1.需求 在專案中spring web服務為外部APP提供rest介面,為了 安全考慮 一般會加入自己的驗證,常規 的簽名+資料加密, 當然一個好的架構師或者負責人會在專案初期會考慮到的問題現老程

加密解密

加密與解密安全與服務:數據的加密和解密:OpenSSL(TLS):ssl基本被淘汰,TLS取而代之openssh:dropbear軟件DNS:BIND軟件,功能強大,伯克利的web server:網站服務,最重要的,工作重點 應用程序:httpd(ASF:apach軟件基金會維護)

字符串的加密解密

ffffff end -s initial size sele har tput ear SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF } .L

Java加密解密筆記(二) 對稱加密

解決 理解 span ring println key ted utf-8 rate 前面的僅僅是做了編碼或者摘要,下面看看真正的加密技術。 DES public class DESUtil { static final String ALGORITHM = "

Java加密解密筆記(三) 非對稱加密

arr 內容 phy 資料 密碼 load esp uid user 非對稱的特點是加密和解密時使用的是不同的鑰匙。密鑰分為公鑰和私鑰,用公鑰加密的數據只能用私鑰進行解密,反之亦然。 另外,密鑰還可以用於數字簽名。數字簽名跟上文說的消息摘要是一個道理,通過一定方法對數據內容

Java 課堂作業 加密解密

源代碼 main nextline 流程 選擇 rgs mage put ext 1.設計思路 首先根據提示輸入一段字符串 利用charAt()將字符串的每個字符分解出來,要加密的話轉換成int類型後加3,解密的話轉換成int類型後減3,然後再轉化為char類型 新定義一個

關於字符串加密解密

scanner ascll for str case home class 進行 todo 古羅馬皇帝凱撒在打仗時曾經使用過以下方法加密軍事情報: 請編寫一個程序,使用上述算法加密或解密用戶輸入的英文字串要求設計思想、程序流程圖、源代碼、結果截圖。 【設計思想】

3. 深入研究 UCenter API 之 加密解密(轉載)

method href img 破解 cti subst != efault times 1. 深入研究 UCenter API 之 開篇 (轉載) 2. 深入研究 UCenter API 之 通訊原理(轉載) 3. 深入研究 UCenter API 之

安全加密-使用gpg實現加密解密

cal 分享圖片 進行 imp rds 根據 輸出 mon -o 對稱加密算法加密和解密使用同一個密鑰常見的算法:DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5? 特性:1、加密、解密使用同一個密鑰,效率高2、將原始數據分割成固定大

security 02: 加密解密 、 掃描抓包 、 總結和答疑 、 SELinux安全防護

一段 數字簽名 def 接口 數據流 5.1 調用 message systemctl day01一、selinux安全防護二、數據 加密 解密三、抓包與掃描++++++++++++++++++++++++++++++一、selinux安全防護1.1 selinux 介紹1

原創圖書:黑客攻防:實戰加密解密工具包下載地址

ont ike ack 百度 密碼 style 工具包 下載 href 說明:百度每一年都會對分享的進行清理,所以原來的工具包地址失效,請自行下載。黑客攻防:實戰加密與解密工具包下載地址https://pan.baidu.com/s/1mjoGYso 密碼:ezwthttp

以前寫的兩本書《安全之路:Web滲透技術及實戰案例解析(第2版)》和《黑客攻防實戰加密解密

Web滲透技術及實戰案例解析 黑客攻防實戰加密與解密 應一些朋友的要求,我重新將書封面和購買地址發一下說明一下:www.antian365.com原來域名轉移到國外去了。現在國家對境外域名在國內訪問必須實名制,進行備份啥的,情況你懂的。最近正在制作《黑客攻防實戰加密與解密》的視頻課程,對黑客攻防過程遇