1. 程式人生 > >基於HTTP在網際網路傳輸敏感資料的訊息摘要、簽名與加密方案

基於HTTP在網際網路傳輸敏感資料的訊息摘要、簽名與加密方案

一、關鍵詞

HTTP,HTTPS,AES,SHA-1,MD5,訊息摘要,數字簽名,數字加密,Java,Servlet,Bouncy Castle

二、名詞解釋

   數字摘要:是將任意長度的訊息變成固定長度的短訊息,它類似於一個自變數是訊息的函式,也就是Hash函式。數字摘要就是採用單項Hash函式將需要加密的明文“摘要”成一串固定長度(128位)的密文這一串密文又稱為數字指紋,它有固定的長度,而且不同的明文摘要成密文,其結果總是不同的,而同樣的明文其摘要必定一致。

   AES:密碼學中的高階加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。是一種對稱加密演算法。

   SHA-1:安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準 (Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。 SHA1有如下特性:不可以從訊息摘要中復原資訊;兩個不同的訊息不會產生同樣的訊息摘要。

   MD5:Message Digest Algorithm MD5(中文名為訊息摘要演算法第五版)為電腦保安領域廣泛使用的一種雜湊函式,用以提供訊息的完整性保護。

三、專案背景

   某合作公司需要通過網際網路向我司傳遞一些使用者資料,但是我所在專案組的外網伺服器上並無部署https,只能基於http進行資料傳輸。為了保護雙方共同的使用者資料,必須對在網際網路上傳輸的資訊進行加密處理。

四、方案設計

   這裡涉及到兩個問題,一是採用什麼樣的遠端訊息傳遞框架,二是如何對傳輸的資料進行加密。

   本人平時開發所用的語言主要是Java,對於Jsp/Servlet還比較熟悉,結合去年參加過所在公司的微信公眾號開發的經驗,設計出瞭如下方案:

   1.在客戶端採用構造http post請求,把使用者資料加密後放入request body中,並在http引數中放入呼叫方的簽名;

   2.服務端接收到請求,提取引數進行簽名校驗,通過後從request body中提取密文進行解密,然後進行後續處理,最終生成響應返回給客戶端。

   以下是具體處理的流程圖:

   在資料加密階段,基於效能以及效率考慮,採用了Bouncy Castle提供的AES演算法,而生成簽名則採用了jdk提供的SHA-1,值得注意的是,基於安全考慮,訊息密文的訊息摘要也被列入到參與數字簽名的引數之一。

五、程式碼實現

1.AES加密工具類:

Java程式碼  收藏程式碼
  1. import org.apache.commons.lang.StringUtils;  
  2. import org.apache.log4j.Logger;  
  3. import org.bouncycastle.crypto.CipherParameters;  
  4. import org.bouncycastle.crypto.engines.AESFastEngine;  
  5. import org.bouncycastle.crypto.modes.CBCBlockCipher;  
  6. import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;  
  7. import org.bouncycastle.crypto.params.KeyParameter;  
  8. import org.bouncycastle.crypto.params.ParametersWithIV;  
  9. import org.bouncycastle.util.encoders.Hex;  
  10. /** 
  11.  * AES encryption and decryption tool. 
  12.  *  
  13.  * @author ben 
  14.  * @creation 2014年3月20日 
  15.  */  
  16. public class AESTool {  
  17.     protected static final Logger log = Logger.getLogger(AESTool.class);  
  18.     private byte[] initVector = { 0x320x370x360x350x340x330x320x31,  
  19.             0x380x270x360x350x330x230x320x31 };  
  20.     /** 
  21.      * FIXME For demo only, should rewrite this method in your product environment! 
  22.      *  
  23.      * @param appid 
  24.      * @return 
  25.      */  
  26.     public String findKeyById(String appid) {  
  27.         // Fake key.  
  28.         String key = "123456789012345678901234567890~!";  
  29.         return key;  
  30.     }  
  31.     /** 
  32.      * Encrypt the content with a given key using aes algorithm. 
  33.      *  
  34.      * @param content 
  35.      * @param key 
  36.      *          must contain exactly 32 characters 
  37.      * @return 
  38.      * @throws Exception  
  39.      */  
  40.     public String encrypt(String content, String key) throws Exception {  
  41.         if (key == null) {  
  42.             throw new IllegalArgumentException("Key cannot be null!");  
  43.         }  
  44.         String encrypted = null;  
  45.         byte[] keyBytes = key.getBytes();  
  46.         if (keyBytes.length != 32 && keyBytes.length != 24  
  47.                 && keyBytes.length != 16) {  
  48.             throw new IllegalArgumentException(  
  49.                     "Key length must be 128/192/256 bits!");  
  50.         }  
  51.         byte[] encryptedBytes = null;  
  52.         encryptedBytes = encrypt(content.getBytes(), keyBytes, initVector);  
  53.         encrypted = new String(Hex.encode(encryptedBytes));  
  54.         return encrypted;  
  55.     }  
  56.     /** 
  57.      * Decrypt the content with a given key using aes algorithm. 
  58.      *  
  59.      * @param content 
  60.      * @param key 
  61.      *          must contain exactly 32 characters 
  62.      * @return 
  63.      * @throws Exception  
  64.      */  
  65.     public String decrypt(String content, String key) throws Exception {  
  66.         if (key == null) {  
  67.             throw new IllegalArgumentException("Key cannot be null!");  
  68.         }  
  69.         String decrypted = null;  
  70.         byte[] encryptedContent = Hex.decode(content);  
  71.         byte[] keyBytes = key.getBytes();  
  72.         byte[] decryptedBytes = null;  
  73.         if (keyBytes.length != 32 && keyBytes.length != 24  
  74.                 && keyBytes.length != 16) {  
  75.             throw new IllegalArgumentException(  
  76.                     "Key length must be 128/192/256 bits!");  
  77.         }  
  78.         decryptedBytes = decrypt(encryptedContent, keyBytes, initVector);  
  79.         decrypted = new String(decryptedBytes);  
  80.         return decrypted;  
  81.     }  
  82.     /** 
  83.      * Encrypt data. 
  84.      *  
  85.      * @param plain 
  86.      * @param key 
  87.      * @param iv 
  88.      * @return 
  89.      * @throws Exception 
  90.      */  
  91.     public byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception {  
  92.         PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(  
  93.                 new CBCBlockCipher(new AESFastEngine()));  
  94.         CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key),  
  95.                 iv);  
  96.         aes.init(true, ivAndKey);  
  97.         return cipherData(aes, plain);  
  98.     }  
  99.     /** 
  100.      * Decrypt data. 
  101.      *  
  102.      * @param cipher 
  103.      * @param key 
  104.      * @param iv 
  105.      * @return 
  106.      * @throws Exception 
  107.      */  
  108.     public byte[] decrypt(byte[] cipher, byte[] key, byte[] iv)  
  109.             throws Exception {  
  110.         PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(  
  111.                 new CBCBlockCipher(new AESFastEngine()));  
  112.         CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key),  
  113.                 iv);  
  114.         aes.init(false, ivAndKey);  
  115.         return cipherData(aes, cipher);  
  116.     }  
  117.     /** 
  118.      * Encrypt or decrypt data. 
  119.      *  
  120.      * @param cipher 
  121.      * @param data 
  122.      * @return 
  123.      * @throws Exception 
  124.      */  
  125.     private byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)  
  126.             throws Exception {  
  127.         int minSize = cipher.getOutputSize(data.length);  
  128.         byte[] outBuf = new byte[minSize];  
  129.         int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);  
  130.         int length2 = cipher.doFinal(outBuf, length1);  
  131.         int actualLength = length1 + length2;  
  132.         byte[] result = new byte[actualLength];  
  133.         System.arraycopy(outBuf, 0, result, 0, result.length);  
  134.         return result;  
  135.     }  
  136.     public static void main(String[] args) throws Exception {  
  137.         AESTool aesTool = new AESTool();  
  138.         String appid = "canairport001";  
  139.         String key = aesTool.findKeyById(appid);  
  140.         String xml = "<root><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name><name>test</name></root>";  
  141.         String encrypted = aesTool.encrypt(xml, key);  
  142.         System.out.println("encrypted: \n" + encrypted);  
  143. 相關推薦

    基於HTTP網際網路傳輸敏感資料訊息摘要簽名加密方案

    一、關鍵詞 HTTP,HTTPS,AES,SHA-1,MD5,訊息摘要,數字簽名,數字加密,Java,Servlet,Bouncy Castle 二、名詞解釋    數字摘要:是將任意長度的訊息變成固定長度的短訊息,它類似於一個自變數是訊息的函式

    例項:Netty 基於Http協議下的資料傳輸Demo

    Http/Https協議是最重要最常用到的協議之一,Netty提供了一些了的Handler來處理Http協議下的編碼工作。下面就介紹一個Netty例項: 1.通過HttpClient傳送Protobuf型別資料到服務端 2.服務端Netty負責把接收到的Http請求中的資料

    Protobuf二進位制檔案基於Http協議傳輸的應用例項 ☞ PythonJava之間無關語言的資料傳輸

           在前兩篇中,博主介紹了Google Protocol Buffer【一種資料互動格式】在Python和Java中各自的應用例項,重點就是掌握和理解如何構造protobuf的協議檔案.proto:檔案中的資料組織結構是以messgae打頭的,message訊息體裡

    Springboot 實現 Restful 服務,基於 HTTP / JSON 傳輸

    一、執行 springboot-restful 工程 1.資料庫準備 a.建立資料庫 springbootdb: b.建立表 city :(因為我喜歡徒步) c.插入資料 springboot-restful 工程專案結構介紹 spri

    基於Bootstrap框架的臨床資料管理系統的設計開發

            基於Bootstrap框架的臨床資料管理系統的設計與開發             2018年11月10日     目  錄 第一章緒論

    安全體系(零)—— 加解密演算法訊息摘要訊息認證技術數字簽名公鑰證書

    鋒影 email:[email protected] 如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少隨意 本文講解對稱加密、非對稱加密、訊息摘要、MAC、數字簽名、公鑰證書的用途、不足和解決的問題。 0.概

    訊息摘要MAC(訊息認證碼)數字簽名掃盲貼

    In cryptography(密碼學), a message authentication code (MAC) is a short piece of information used to authenticate(鑑定) a message—in other w

    MDSHAMAC訊息摘要演算法實現應用

    1.訊息摘要概述 訊息摘要(Message Digest)又稱為數字摘要(Digital Digest)。它是一個唯一對應一個訊息或文字的固定長度的值,它由一個單向Hash加密函式對訊息進行作用而產生。如果訊息在途中改變了,則接收者通過對收到訊息的新產生的摘要與原摘要比較,就可知道訊息是否被改變了。因此訊息摘

    資料 Hadoop介紹配置使用

    前言 Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。 大資料 基礎概念 大資料 Centos基礎 大資料 Shell基礎 大資料 ZooKeeper 大資料 Hadoop介紹、配置與使用 大資料 Hadoop之HDFS

    Elastic Stack實戰學習教程~日誌資料的收集分析視覺化

    Elastic Stack介紹 近幾年,網際網路生成資料的速度不斷遞增,為了便於使用者能夠更快更精準的找到想要的內容,站內搜尋或應用內搜尋成了不可缺少了的功能之一。同時,企業積累的資料也再不斷遞增,對海量資料分析處理、視覺化的需求也越來越高。 在這個領域裡,開源專案ElasticSearch贏得了市場的關

    資料結構——樹森林二叉樹的轉換

    在介紹樹的儲存結構時,就說到了樹的孩子兄弟表示法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和二叉樹可以互相轉換。從物理結構上來看,它們的二叉連結串列也是相同的,只是介紹不太一樣而已。因此,只要我們設定一定的規則,用二叉樹來表示樹,甚至表示森林都

    linux之用openssl命令Base64編碼解碼md5/sha1摘要AES/DES3加密解密

    1、我們先看openssl help命令會輸出什麼? 2、我們用openssl命令實現字串和文字的Base64編碼和解碼 openssl base64 openssl base64 -

    利用Python進行資料分析 中的問題解決方案彙總

    </pre><span style="font-size:18px">1.<span style="color:rgb(85,85,85); font-family:'microsoft yahei'; line-height:35px"&g

    Spark機器學習----資料的獲取處理準備

    1. 資料獲取常用公開資料集:UCL機器學習知識庫: 包括近300個不同大小和型別的資料集,可用於分類、迴歸、聚類和推薦系統任務。資料集列表位於: http://archive.ics.uci.edu/ml/。Amazon AWS公開資料集: 包含的通常是大型資料集,可通過A

    《大資料時代:生活工作思維的大變革》讀書筆記

    1、        大資料與雲端計算是一個問題的兩面:一個是問題,一個是解決問題的方法。通過雲端計算對大資料進行分析、預測,會是的決策更為精準,釋放出更多資料的隱藏價值。資料,這個21世紀人類探索的新邊疆,正在被雲計算髮現、征服。 2、        人類儲存資訊量的增

    Java安全(加密摘要簽名證書SSLHTTPS)

           對於一般的開發人員來說,很少需要對安全領域內的基礎技術進行深入的研究,但是鑑於日常系統開發中遇到的各種安全相關的問題,熟悉和了解這些安全技術的基本原理和使用場景還是非常必要的。本文將對非對稱加密、數字摘要、數字簽名、數字證書、SSL、HTTPS等這些安全領域內的技

    《大資料時代生活工作思維的大變革》閱讀筆記

    引言 1、大資料如何變革公共衛生 例子,甲型h1n1流感谷歌通過分析人們的搜尋記錄來判斷這些人是否患上了流感。其他公司做不到的原因:缺乏像谷歌公司一樣龐大的資料資源、處理能力和統計技術。 2、大資料如何變革商業領域 例子,預測當前的機票價格在未來一段時間內會上漲還是下降——

    新思科技釋出Seeker最新版本 可針對基於 Web 的應用進行主動驗證和敏感資料跟蹤

    法國Parkeon公司託管企業服務部首席資訊保安官曾經表示:“我們選擇Seeker是因為測試人員和開發人員不需要投入很多時間或者具備十分專業的知識就可以定期執行安全測試任務。Seeker提供漏洞與受影響原始碼之間的關聯,從而減少開發人員的工作量。 近日,美國新思科技公司(Synopsys,

    基於HTTP協議的幾種實時資料獲取技術(轉)

    轉載自五月的倉頡 HTTP協議 HTTP協議是建立在TCP協議上的應用層協議,協議的本質是請求----應答: 即對於HTTP協議來說,服務端給一次響應後整個請求就結束了,這是HTTP請求最大的特點,也是由於這個特點,HTTP請求無法做到的是服務端向客戶端主動推送資料。 但由於H

    基於http協議的加密傳輸方案

    轉載自:https://www.cnblogs.com/mq0036/p/8274975.html 最近公司需要通過公網與其它平臺完成介面對接,但是基於開發時間和其它因素的考慮,本次對接無法採用https協議實現。既然不能用https協議,那就退而求其次採用http協議吧! 那麼問題來了!在