1. 程式人生 > >springmvc 部分加密通訊

springmvc 部分加密通訊

手機客戶端與後臺互動中一般會用到加密傳輸。至於不用HTTPS,本文不討論,這裡給出使用springmvc +http協議,手機客戶端加密部分資料值,後臺進行統一解密。實現思路就是使用攔截器,使用裝飾模式,可以直接使用HttpServletRequestWrapper。

springmvc後臺DES3 解密

原文和密文前後均無空格

資料

#1

原文: karl
密文:HM6LxeRjJxc=
UR編碼: HM6LxeRjJxc%3d

#2

原文: del555
密文: HNf8wVhKhsg=
UR編碼: HNf8wVhKhsg%3d

#3

原文:

在MIME格式的電子郵件中,base64可以用來將binary的位元組序列資料編碼成ASCII字元序列構成的文字。使用時,在傳輸編碼方式中指定base64。然後,每次取出6個bit

  • 密文:
eT9O6eHyB27BKL7u4eXE49xoGZZ4aZdQ3ibZ4uKvlD8yLwCeKJi9SYijf142uufEB36d/sk6VmuOd8c8WHspd3kba490j/3+Dez03ycGzNssE4MwuNApSdyQ5BDZTLq7fkxwn+MvkIJTGiwgPcdD8xEMEWgp6/s9gENhWGGnayBfWrSv/36pBNNVhb+HkKXlwPCAazIVbFK4CrohlviiJ3lJv7/qfFlPNPUAVQYAWbGBJ7vA4osfspzMb0abw3uXSROm7KYopKu9KRe9Cgxs7w==

密文URL編碼後:

eT9O6eHyB27BKL7u4eXE49xoGZZ4aZdQ3ibZ4uKvlD8yLwCeKJi9SYijf142uufEB36d%2Fsk6VmuOd8c8WHspd3kba490j
%2F3%2BDez03ycGzNssE4MwuNApSdyQ5BDZTLq7fkxwn%2BMvkIJTGiwgPcdD8xEMEWgp6%2Fs9gENhWGGnayBfWrSv%2F36pBNNVhb%2BHkKXlwPCAazIVbFK4CrohlviiJ3lJv7%2FqfFlPNPUAVQYAWbGBJ7vA4osfspzMb0abw3uXSROm7KYopKu9KRe9Cgxs7w%3D%3D

或者

  • 密文RFC822格式(76個字元一行):
eT9O6eHyB27BKL7u4eXE49xoGZZ4aZdQ3ibZ4uKvlD8yLwCeKJi9SYijf142uufEB36d/sk6VmuO
d8c8WHspd3kba490j/3
+Dez03ycGzNssE4MwuNApSdyQ5BDZTLq7fkxwn+MvkIJTGiwgPcdD8xEM EWgp6/s9gENhWGGnayBfWrSv/36pBNNVhb+HkKXlwPCAazIVbFK4CrohlviiJ3lJv7/qfFlPNPUA VQYAWbGBJ7vA4osfspzMb0abw3uXSROm7KYopKu9KRe9Cgxs7w==

密文RFC822格式URL編碼後:

eT9O6eHyB27BKL7u4eXE49xoGZZ4aZdQ3ibZ4uKvlD8yLwCeKJi9SYijf142uufEB36d%2fsk6VmuO%0ad8c8WHspd3kba490j%2f3%2bDez03ycGzNssE4MwuNApSdyQ5BDZTLq7fkxwn%2bMvkIJTGiwgPcdD8xEM%0aEWgp6%2fs9gENhWGGnayBfWrSv%2f36pBNNVhb%2bHkKXlwPCAazIVbFK4CrohlviiJ3lJv7%2fqfFlPNPUA%0aVQYAWbGBJ7vA4osfspzMb0abw3uXSROm7KYopKu9KRe9Cgxs7w%3d%3d

測試

使用已以上資料進行測試

springmvc, phone 使用原文, 其他三個使用加密資料

@Controller
public class IndexController {

    @RequestMapping("/")
    @ResponseBody
    Object index(String phone, String name, String password, String desc) {
        System.out.println("-----------------------------------------");
        System.out.println("phone:" + phone);
        System.out.println("name:" + name);
        System.out.println("password:" + password);
        System.out.println("desc:" + desc);
        return "Hello longdai!";
    }
}

POST:

引數
phone 131212345678
name HM6LxeRjJxc%3d
password HNf8wVhKhsg%3d
desc 這裡使用資料#3的URL編碼後的資料

期望結果:

-----------------------------------------
phone:131212345678
name:karl
password:del555
desc:在MIME格式的電子郵件中,base64可以用來將binary的位元組序列資料編碼成ASCII字元序列構成的文字。使用時,在傳輸編碼方式中指定base64。然後,每次取出6個bit

POSTMAN:

這裡寫圖片描述

結果:

這裡寫圖片描述

解密攔截器原始碼:

@Configuration
public class DecryptFilter extends OncePerRequestFilter {
    private static Log log = LogFactory.getLog(DecryptFilter.class);

    private static Pattern BASE64_PATTERN = Pattern.compile("^[a-zA-Z0-9\\+/]+[=]{0,2}$");
    private static Pattern BASE64_PATTERN_RFC822 = Pattern.compile("^[a-zA-Z0-9\\+/\n]+[=]{0,2}$");

    public String filter(HttpServletRequest request, String name, String input) {
        String ret = input;
        if (input == null || input.trim().equals("(null)")) {
            return null;
        }
        boolean b1 = input.length()%4==0 && BASE64_PATTERN.matcher(input).matches();
        boolean b2 = input.length() > 77 && input.charAt(76)=='\n' && BASE64_PATTERN_RFC822.matcher(input).matches();
        if ( !b1 && !b2){
            return injectSQLFilter(name, input);//not base64 text
        }
        try {
            ret = Des3.decode(input);
        } catch (Exception e) {
            log.error(request.getRequestURI() + " error decode " + name + "=" + input, e);
        }
        return injectSQLFilter(name, ret);
    }

    public String injectSQLFilter(String name, String text){
        if(text==null){
            return null;
        }
        if(name.matches("password|passwd|loginPassword|dealPassword")){
            return text;
        }
        //TODO 這裡處理SQL注入,直接處理掉注入資料,或者下層攔截器處理
        return text;
    }

    @Override
    protected void doFilterInternal(final HttpServletRequest request,
                                    HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        chain.doFilter(new HttpServletRequestWrapper(request) {

            protected Map<String, String[]> parameters = new HashMap<String, String[]>();
            @Override
            public String getParameter(String name) {
                if (parameters.containsKey(name)){
                    String[] values = parameters.get(name);
                    if (values!=null && values.length>0){
                        return values[0];
                    }
                }
                String value = super.getParameter(name);
                String retValue = filter(this, name, value);
                parameters.put(retValue, new String[]{retValue});
                return retValue;
            }

            @Override
            public String[] getParameterValues(String name) {
                if (parameters.containsKey(name)){
                    String[] values = parameters.get(name);
                    return values;
                }
                String[] values = super.getParameterValues(name);
                if (values == null) {
                    return null;
                }
                for (int i = 0; i < values.length; i++) {
                    values[i] = filter(this, name, values[i]);
                }
                parameters.put(name, values);
                return values;
            }

        }, response);

    }
}

相關推薦

springmvc 部分加密通訊

手機客戶端與後臺互動中一般會用到加密傳輸。至於不用HTTPS,本文不討論,這裡給出使用springmvc +http協議,手機客戶端加密部分資料值,後臺進行統一解密。實現思路就是使用攔截器,使用裝飾模式,可以直接使用HttpServletRequestWrapp

Mybatis部分 or SpringMVC部分

專用 委托 color 協同工作 調用 myba http 懶漢 程序 Mybatis部分 1、mybatis與hibernate區別?   Hibernate是面向對象的思想操作數據、mybatis是以純sql操作數據   相對於mybatis容易優化.擴展性好,但是移植

SpringMVC-----部分功能學習

post spring 部分 error class 只需要 body mvc 錯誤頁 1、默認錯誤頁面設置    <error-page> <exception-type>java.lang.Throwable</e

mysql5.6 TLS加密通訊

本文參考https://dev.mysql.com/doc/refman/5.6/en/building-with-encrypted-connection-support.html 在mysql的服務端和客戶端使用加密通訊的,需要系統支援OpenSSL 或者 yaSSL: My

JS到PHP使用RSA演算法進行加密通訊

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SSL及其加密通訊過程

SSL及其加密通訊過程 什麼是SSL SSL英文全稱Secure Socket Layer,安全套接層,是一種為網路通訊提供安全以及資料完整性的安全協議,它在傳輸層對網路進行加密。它主要是分為兩層: SSL記錄協議:為高層協議提供安全封裝、壓縮、加密等基本功能 SSL握手協議:用於在資料傳輸開

CentOS 7.5二進位制部署Kubernetes1.12(加密通訊)(五)

一、安裝方式介紹 1、二進位制安裝 使用二進位制檔案安裝,好處是可以安裝任意版本的 Kubernetes,對一些新版本新功能追求的同學比較合適,壞處是配置比較複雜,很多軟體包因為一些原因,我們在大陸是訪問不到的。這篇文章我們使用加密通訊,也就是各元件和kube-apiserver的通訊採用加密方式。 二

雜湊演算法與加密通訊、數字簽名

作為通訊工程的學生,我在學習《資訊理論與編碼》這門課的時候瞭解過關於加密解密的一些知識,但覺得不夠深入,不甚過癮。 這幾天學習了跟密碼學有很大關聯的雜湊演算法,跟大家分享一下。   雜湊演算法是什麼       雜湊,英文為Hash,有時翻譯為雜湊,所以雜湊

原始碼部分加密混淆方案

原始碼部分混淆加密方案 背景:專案業務原始碼需要開放給甲方,但其中有部分核心程式碼需要加密處理。 目的:實現對核心程式碼DLL的加密,但不能影響其他模組對該DLL的引用。 加密工具:DotfuscatorPro_4.9.6 反編譯工具:.Net Reflector  (用於對加密效果進行驗證)

https加密通訊過程圖解

https其實就是建構在SSL/TLS之上的 http協議,所以https比http要佔用更多的資源 http使用TCP 三次握手建立連線,客戶端和伺服器需要交換3個包,https除了 TC

數字簽名是什麼?https加密通訊的理解。

今天,我讀到一篇好文章。 它用圖片通俗易懂地解釋了,"數字簽名"(digital signature)和"數字證書"(digital certificate)到底是什麼。 我對這些問題的理解,一直是模模糊糊的,很多細節搞不清楚。讀完這篇文章後,發現思路一下子就理清了。為了加深記憶,我把文字和圖片都翻譯

以太坊RLPx加密通訊協議

以太坊p2p的Server物件中使用的conn定義了一個transport介面,目前該介面的實現只看到了rlpx,可以推測以太坊p2p網路中的節點通訊都採用了該協議.RLPx協議屬於會話層的協議,主要功能是在節點之間建立並維持通訊,節點的發現和節點之間資料流的傳輸主要是由傳輸

Android客戶端與伺服器端RSA加密通訊加密字元不一致相關問題

RSA非對稱加密演算法 ,適用於資料量較小的情況,比如一般的用法: 1、生成RSA金鑰對,公鑰發給客戶端使用,私鑰由伺服器使用; 2、客戶端用公鑰加密所有發出的資料,也用公鑰解密所有收到的資料; 3、伺服器用私鑰加密所有發出的資料,也用私鑰解密所有收到的資料; 但Andro

TLS協議分析 (九) 現代加密通訊協議設計

轉自:http://chuansong.me/n/1286704052752 六.  TLS協議給我們的啟發 — 現代加密通訊協議設計 在看了這麼多的分析和案例之後,我們已經可以歸納出加密通訊協議設計的普遍問題,和常見設計決策, 設計決策點: 四類基礎演算法 加

Node.js 基於 ursa 模組的 RSA 加密解密(已與IOS,Android實現加密通訊

前幾天除錯一個RSA加密,遇到一些問題,在網上找了好久好久,與Node.js相關的資源少得非常可憐,最後還是靠自己一步一步解決了,今天把程式碼和一些心得拿出來分享一下: cnode連結地址:https://cnodejs.org/topic/54d2de4cf

Socket服務端與客戶端加密通訊

客戶端:# -*- coding: utf-8 -*- # @Time : 2018/2/19 14:15 # @Author : Xifeng2009 import socket import time from Crypto.Cipher import AES

Apache Httpd 2.2配置CA證書,實現Https加密通訊

# 生成自己的證書申請檔案,以 .csr 結尾的檔案。 [root@centos6 ssl]$openssl req -new -key /etc/httpd/conf.d/ssl/httpd.key -out /etc/httpd/conf.d/ssl/httpd.csr You are about to

mariadb實現主從加密通訊的詳細步驟

show variable dir 使用 啟動 查看 out req word mariadb實現主從加密通訊的詳細步驟 1. 實驗環境: A. 3臺centos7服務器,mariadb版本:5.5.60 B. 服務器角色: a) master

EFK教程(4) - ElasticSearch叢集TLS加密通訊

基於TLS實現ElasticSearch叢集加密通訊 作者:“發顛的小狼”,歡迎轉載 目錄 ▪ 用途 ▪ ES節點資訊 ▪ Step1. 關閉服務 ▪ Step2. 建立CA證書 ▪ Step3. 建立CERT證書 ▪ Step4. 建立金鑰庫 ▪ Step5. 刪除CA證書 ▪ Step6. 修改el

如何恢復部分WannaCry勒索軟件加密文件

安全模式 計算機 windows7 加密軟件 wannacry WannaCry勒索軟件中毒後的計算機文件會被加密,但是通過測試發現,加密軟件先加密文件然後再刪除原文件。所以我們可以嘗試使用硬盤恢復工具,恢復部分文件,因為在電腦的安全模式下Wannacry並沒有運行。中毒後如果想恢復部