1. 程式人生 > >練習MD5加密jar包編寫

練習MD5加密jar包編寫

簡介

引數簽名可以保證開發的者的資訊被冒用後,資訊不會被洩露和受損。原因在於接入者和提供者都會對每一次的介面訪問進行簽名和驗證。

簽名sign的方式是目前比較常用的方式。

  • 第1步:接入者把需求訪問的介面的所有必要的引數資訊(注意是所有引數),除去sign本身,以及值是空的引數,按引數名字母順序排序。拼接成字串
  • 第2步: 然後把排序後的引數按引數1值1引數2值2…引數n值n(這裡的引數和值必須是傳輸引數的原始值,不能是經過處理的,的方式拼接成一個字串。
  • 第3步: 把分配給接入方的驗證金鑰key(或者是提供者提供的一個SECRET_KEY,這個SECRET_KEY只有接入者和提供者知道)拼接在第2步得到的字串前面。
  • 第4步:對加入密匙key的字串進行加密或是摘要(用MD5或是SHA1摘要的比較多)
  • 第5步:對MD5的摘要結果轉成大寫然後寫成字串,傳給引數sign

舉例:

假設傳輸的資料是

http://www.xxx.com/interface.aspx?sign=sign_value&p2=v2&p1=v1&method=cancel&p3=&pn=vn

(實際情況最好是通過post方式傳送),

其中sign引數對應的sign_value就是簽名的值。

 

第一步,拼接字串,首先去除sign引數本身,然後去除值是空的引數p3,

剩下p2=v2&p1=v1&method=cancel&pn=vn,

然後按引數名字元升序排序,method=cancel&p1=v1&p2=v2&pn=vn.

 

第二步,然後做引數名和值的拼接,最後得到methodcancelp1v1p2v2pnvn

 

第三步,在上面拼接得到的字串前加上驗證金鑰key,我們假設是abc,

得到新的字串abcmethodcancelp1v1p2v2pnvn

 

第四步,然後將這個字串進行md5計算,假設得到的是abcdef,

然後轉為大寫,得到ABCDEF這個值即為sign簽名值。

 

注意,計算md5之前請確保介面與接入方的字串編碼一致,

如統一使用utf-8編碼或者GBK編碼,如果編碼方式不一致則計算出來的簽名會校驗失敗。

伺服器用密匙key對引數進行同樣的MD5摘要演算法,比對sign值



MD5摘要

MD5即Message-Digest Algorithm 5(資訊-摘要演算法5),用於確保資訊傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式語言普遍已有MD5實現。將資料(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD5的前身有MD2、MD3和MD4。

MD5演算法具有以下特點:
1、壓縮性:任意長度的資料,算出的MD5值長度都是固定的。
2、容易計算:從原資料計算出MD5值很容易。
3、抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
4、強抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。
MD5的作用是讓大容量資訊在用數字簽名軟體簽署私人金鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進位制數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等

jmeter的MD5摘要演算法

我的Jmeter3.2版本已經沒有了_MD5這個函數了。
所以要用MD5對引數進行摘要,我們需要自己匯入MD5摘要演算法的jar包

用Eclipse編寫一個java的MD5摘要演算法的jar包,以下是操作步驟圖

 

 

 

 

 

 

MD5摘要演算法在java中的編碼

Jackmd5.java檔案編碼如下

 

package JACK.MD5;

 

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

 

public class JACKMD5 {

    //建立一個類LMFMD5

    public String MD5(String sourceStr) {

        String result = "";

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");

         // 生成一個MD5加密計算摘要

            md.update(sourceStr.getBytes());

         // 使用指定的byte陣列更新摘要

            byte b[] = md.digest();

         // 把密文轉換成十六進位制的字串形式

            int i;

            StringBuffer buf = new StringBuffer("");

            for (int offset = 0; offset < b.length; offset++) {

                i = b[offset];

                if (i < 0)

                    i += 256;

                if (i < 16)

                    buf.append("0");

                buf.append(Integer.toHexString(i));

            }

            result = buf.toString();

            System.out.println("MD5(" + sourceStr + ",32) = " + result);

         //   System.out.println("MD5(" + sourceStr + ",16) = " + buf.toString().substring(8, 24));

            // 註釋的是md5的16位取值

        } catch (NoSuchAlgorithmException e) {

            System.out.println(e);

        }

        return result;

   }

}

 

Test.java檔案編碼如下:

package JACK.MD5;

import JACK.MD5.JACKMD5;

public class test {

    public static void main (String[] args) {

    String res = new JACKMD5().MD5("jack的MD5加密jar包");

    System.out.println(res);

    }

}

 

 

 

接下來是匯出jar包操作:

1、點選export …

 

 

 

下面是匯出的jar包,MD5摘要演算法的jar包放入jmeterlib\ext目錄裡面裡面

 

Jmeter的BeanShell Sampler 和Debug sampler建立

 

import JACK.MD5.JACKMD5;

String res = new JACKMD5().MD5("jack測試md5的jar包");

System.out.printIn(res);

vars.put("md5",res.toString())