對引數進行排序後拼接key,進行sha1加密,再對sha1進行MD5加密,生成sign驗籤
Map<String,Object> map = new HashMap<String,Object>(); map.put("phone",phone); map.put("type",type);
String sign = SignForInster.signForInspiry(map, "****");//後為key值
sign生成工具類
import java.util.Iterator; import java.util.Map; import java.util.Set; /* quu..__ $$$b `---.__ "$$b `--. ___.---uuudP `$$b `.__.------.__ __.---' $$$$" . "$b -' `-.-' $$$" .'| ". d$" _.' | `. / ..." .' | `./ ..::-' _.' | / .:::-' .-' .' : ::''\ _.' | .' .-. .-. `. .' | : /'$$|[email protected]"$\ `. .' _.-' .'|$u$$| |$$,$$| | < _.-' | `:$$:' :$$$$$: `. `. .-' : `"--' | `-. \ :##. == .###. `. `. `\ |##: :###: | > > |#' `..'`..' `###' x: / / \ xXX| / ./ \ xXXX'| / ./ /`-. `. / / : `- ..........., | / .' | ``:::::::' . |< `. | ``` | x| \ `.:``. | .' /' xXX| `:`M`M':. | | ; /:' xXXX'| -'MMMMM:' `. .' : /:' |-'MMMM.-' | | .' /' .'MMM.-' `'`' : ,' |MMM< | `' |tbap\ \ :MM.-' \ | .'' \. `. / / .:::::::.. : / | .:::::::::::`. / | .:::------------\ / / .'' >::' / `',: : .' `:.:' */ public class SignForInster { static public String signForInspiry(Map params, String key) { StringBuffer sbkey = new StringBuffer(); Set es = params.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); Object v = entry.getValue(); //空值不傳遞,不參與簽名組串 if (null != v && !"".equals(v)) { sbkey.append(k + "=" + v + "&"); } } sbkey = sbkey.append("key=" + key); String s = sbkey.toString();//轉為字串 String s2 = s.toLowerCase();//轉為小寫字元 String sign = null; //加密,結果轉換為小寫字元 try { String hexString = SHA1.getSHA1HexString(s2);//sha1加密 String s1 = hexString.toLowerCase();//轉為小寫 sign = MD5.getMD5(s1);//MD5加密 } catch (Exception e) { e.printStackTrace(); } return sign; } }
MD5加密工具類
public class MD5 { // private static String key = "a6U&1$Ip[Jr/sed]Rfvn=O>Mz+}lXN*%-gLcGD|0"; //MD5加密例項 public static String getMD5(String str) throws NoSuchAlgorithmException { MessageDigest md5 = null; try { md5 = MessageDigest.getInstance("MD5"); } catch (Exception e) { e.printStackTrace(); return ""; } char[] charArray = str.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i = 0; i < charArray.length; i++) { byteArray[i] = (byte) charArray[i]; } byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) { hexValue.append("0"); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } public static String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) { hs = hs + "0" + stmp; } else { hs = hs + stmp; } } return hs; } //SHA1 加密例項 public static String encryptToSHA(String info) { byte[] digesta = null; try { // 得到一個SHA-1的訊息摘要 MessageDigest alga = MessageDigest.getInstance("SHA-1"); // 新增要進行計算摘要的資訊 alga.update(info.getBytes()); // 得到該摘要 digesta = alga.digest(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 將摘要轉為字串 String rs = byte2hex(digesta); return rs + key; } }
sha1加密工具類
import java.security.MessageDigest; public class SHA1 { public static String getSHA1HexString(String str) throws Exception { // SHA1簽名生成 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } return hexstr.toString(); } private final int[] abcde = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 }; // 摘要資料儲存陣列 private int[] digestInt = new int[5]; // 計算過程中的臨時資料儲存陣列 private int[] tmpData = new int[80]; // 計算sha-1摘要 private int process_input_bytes(byte[] bytedata) { // 初試化常量 System.arraycopy(abcde, 0, digestInt, 0, abcde.length); // 格式化輸入位元組陣列,補10及長度資料 byte[] newbyte = byteArrayFormatData(bytedata); // 獲取資料摘要計算的資料單元個數 int MCount = newbyte.length / 64; // 迴圈對每個資料單元進行摘要計算 for (int pos = 0; pos < MCount; pos++) { // 將每個單元的資料轉換成16個整型資料,並儲存到tmpData的前16個數組元素中 for (int j = 0; j < 16; j++) { tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4)); } // 摘要計算函式 encrypt(); } return 20; } // 格式化輸入位元組陣列格式 private byte[] byteArrayFormatData(byte[] bytedata) { // 補0數量 int zeros = 0; // 補位後總位數 int size = 0; // 原始資料長度 int n = bytedata.length; // 模64後的剩餘位數 int m = n % 64; // 計算新增0的個數以及新增10後的總長度 if (m < 56) { zeros = 55 - m; size = n - m + 64; } else if (m == 56) { zeros = 63; size = n + 8 + 64; } else { zeros = 63 - m + 56; size = (n + 64) - m + 64; } // 補位後生成的新陣列內容 byte[] newbyte = new byte[size]; // 複製陣列的前面部分 System.arraycopy(bytedata, 0, newbyte, 0, n); // 獲得陣列Append資料元素的位置 int l = n; // 補1操作 newbyte[l++] = (byte) 0x80; // 補0操作 for (int i = 0; i < zeros; i++) { newbyte[l++] = (byte) 0x00; } // 計算資料長度,補資料長度位共8位元組,長整型 long N = (long) n * 8; byte h8 = (byte) (N & 0xFF); byte h7 = (byte) ((N >> 8) & 0xFF); byte h6 = (byte) ((N >> 16) & 0xFF); byte h5 = (byte) ((N >> 24) & 0xFF); byte h4 = (byte) ((N >> 32) & 0xFF); byte h3 = (byte) ((N >> 40) & 0xFF); byte h2 = (byte) ((N >> 48) & 0xFF); byte h1 = (byte) (N >> 56); newbyte[l++] = h1; newbyte[l++] = h2; newbyte[l++] = h3; newbyte[l++] = h4; newbyte[l++] = h5; newbyte[l++] = h6; newbyte[l++] = h7; newbyte[l++] = h8; return newbyte; } private int f1(int x, int y, int z) { return (x & y) | (~x & z); } private int f2(int x, int y, int z) { return x ^ y ^ z; } private int f3(int x, int y, int z) { return (x & y) | (x & z) | (y & z); } private int f4(int x, int y) { return (x << y) | x >>> (32 - y); } // 單元摘要計算函式 private void encrypt() { for (int i = 16; i <= 79; i++) { tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^ tmpData[i - 16], 1); } int[] tmpabcde = new int[5]; for (int i1 = 0; i1 < tmpabcde.length; i1++) { tmpabcde[i1] = digestInt[i1]; } for (int j = 0; j <= 19; j++) { int tmp = f4(tmpabcde[0], 5) + f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + tmpData[j] + 0x5a827999; tmpabcde[4] = tmpabcde[3]; tmpabcde[3] = tmpabcde[2]; tmpabcde[2] = f4(tmpabcde[1], 30); tmpabcde[1] = tmpabcde[0]; tmpabcde[0] = tmp; } for (int k = 20; k <= 39; k++) { int tmp = f4(tmpabcde[0], 5) + f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + tmpData[k] + 0x6ed9eba1; tmpabcde[4] = tmpabcde[3]; tmpabcde[3] = tmpabcde[2]; tmpabcde[2] = f4(tmpabcde[1], 30); tmpabcde[1] = tmpabcde[0]; tmpabcde[0] = tmp; } for (int l = 40; l <= 59; l++) { int tmp = f4(tmpabcde[0], 5) + f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + tmpData[l] + 0x8f1bbcdc; tmpabcde[4] = tmpabcde[3]; tmpabcde[3] = tmpabcde[2]; tmpabcde[2] = f4(tmpabcde[1], 30); tmpabcde[1] = tmpabcde[0]; tmpabcde[0] = tmp; } for (int m = 60; m <= 79; m++) { int tmp = f4(tmpabcde[0], 5) + f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + tmpData[m] + 0xca62c1d6; tmpabcde[4] = tmpabcde[3]; tmpabcde[3] = tmpabcde[2]; tmpabcde[2] = f4(tmpabcde[1], 30); tmpabcde[1] = tmpabcde[0]; tmpabcde[0] = tmp; } for (int i2 = 0; i2 < tmpabcde.length; i2++) { digestInt[i2] = digestInt[i2] + tmpabcde[i2]; } for (int n = 0; n < tmpData.length; n++) { tmpData[n] = 0; } } // 4位元組陣列轉換為整數 private int byteArrayToInt(byte[] bytedata, int i) { return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) | ((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff); } // 整數轉換為4位元組陣列 private void intToByteArray(int intValue, byte[] byteData, int i) { byteData[i] = (byte) (intValue >>> 24); byteData[i + 1] = (byte) (intValue >>> 16); byteData[i + 2] = (byte) (intValue >>> 8); byteData[i + 3] = (byte) intValue; } // 將位元組轉換為十六進位制字串 private static String byteToHexString(byte ib) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] ob = new char[2]; ob[0] = Digit[(ib >>> 4) & 0X0F]; ob[1] = Digit[ib & 0X0F]; String s = new String(ob); return s; } // 將位元組陣列轉換為十六進位制字串 private static String byteArrayToHexString(byte[] bytearray) { String strDigest = ""; for (int i = 0; i < bytearray.length; i++) { strDigest += byteToHexString(bytearray[i]); } return strDigest; } // 計算sha-1摘要,返回相應的位元組陣列 public byte[] getDigestOfBytes(byte[] byteData) { process_input_bytes(byteData); byte[] digest = new byte[20]; for (int i = 0; i < digestInt.length; i++) { intToByteArray(digestInt[i], digest, i * 4); } return digest; } // 計算sha-1摘要,返回相應的十六進位制字串 public String getDigestOfString(byte[] byteData) { return byteArrayToHexString(getDigestOfBytes(byteData)); } /**/ public static void main(String[] args) { String data = "lvbaolin"; System.out.println(data); String digest = new SHA1().getDigestOfString(data.getBytes()); System.out.println(digest); // System.out.println( ToMD5.convertSHA1(data).toUpperCase()); } }
相關推薦
對引數進行排序後拼接key,進行sha1加密,再對sha1進行MD5加密,生成sign驗籤
Map<String,Object> map = new HashMap<String,Object>(); map.put("phone",phone); map.put("type",type); String sign = SignForIns
如果一個button被用於觸發ajax,那就不能再用它進行form表單提交了
form表單提交,和ajax提交不能同時存在,如果這個button被用於觸發ajax,那就不能再用它進行form表單提交了 如果一個頁面裡面,既有ajax傳參,又有表單傳參,那麼,必須設定兩個按
編寫程式實現以下功能: 隨機產生20個正整數存入陣列a中,且每個數均在1000-9999之間(包含1000和9999)。對陣列進行排序,要求按每個數的後三位的大小進行升序排列,然後取出滿足此條
<span style="font-size:24px;">int a[20] = {0};//定義一個數組 for (int i = 0; i < 20; i++) { a[i] = arc4random() % (9999 -
.Net將集合M內非空引數值的引數按照引數名ASCII碼從小到大排序(字典序),並使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串stringA
前言: 前段時間因為專案進度比較繁重所以一直都沒有時間更新部落格,內心深深的負重感,沒有履行年初立下的flag。不過這個月會把上個月沒有完成的任務補上來,咱們可不是喜歡拖欠任務的攻城獅。哈哈,廢話不多說,接下來是要總結下關於對接支付時我們經常會遇到的將對應集合中的引數按照ASCII碼按照從小到大排序,
python學習--根據字典中的值的大小,對字典的項進行排序。
比較 value 函數返回值 randint for python common spa pri 首先生成一個隨機字典: from random import randintd={x:randint(60,99) for x in "abcdefg"} # {‘a‘:
[C#] 對List進行分組排序後輸出
pos 學生 new C# src key 輸出 分組 groupby Student 類: public class Student { public int ID { get; set; } public string
Golang對map中的key進行排序
ring 我們 brush 輸出 port fmt sil 數字 class package main import ( "fmt" "sort" ) func main() { //首先生成26個字母充當map中的key var a =
對集合中的元素進行排序,接口Comparator<T>和Comparable<T>的使用
pub length 自定義 長度 public bsp imp ide 抽象類 關於比較排序比較的接口 或者是類有:java.lang.Comparable<T>接口, 一個抽象類通過實現這個接口可以進行自然排序,也就是一個如果一個自定義類通過implemen
js裡的sort()對json資料(某一欄位)進行排序,超實用!!!
首先來看一下接口裡的資料,對哪一資料進行操作 { "hourList": [{ "DATA_DATE": "00", "USE_SUM": 9.58 }, { "DATA_DATE": "03", "USE_SUM": 23.18 }, { "DATA_DATE": "
如何根據物件的屬性,對集合(list / set)中的物件進行排序
一:針對list 通過java.util.Collections的sort方法,有2個引數,第一個引數是list物件,第二個引數是new Comparator<物件類>(){}方法,這個方法
java讀取txt文件,對字符串進行操作後導出txt文件
file 計算機 public iter 一次 cep 行數據 文件內容 txt文件 嘿嘿,代碼略為簡單,不再多做解釋,直接上碼! package org.lq.com.util; import java.io.File; import java.io.InputStre
python對字典按照 key 或者 value 進行排序
假設 有字典tmp={1:4,2:3} 需要知道的 tmp.keys() 返回的是詞典的keyde 迭代物件,注意不是list 其返回的是一個dict_keys object >>> tmp={1:4,2:3} >>> tmp.keys()
153-練習5 對陣列進行排序,Array.Sort和氣泡排序演算法
5,編寫一個控制檯程式,要求使用者輸入一組數字用空格間隔,對使用者輸入的數字從小到大輸出。(Array.Sort方法和氣泡排序) Array.Sort()方法,CLR提供的排序方法,使用的是快速排序。 string str = Console.ReadLine();
JAVA——對MAP容器的Value值、key值進行排序
今天在搞JAVA容器類題目的時候,碰到了一道對MAP容器的Value值排序的問題,額。。。當時無從下手,然後慌得一批,兩天沒看就將學的JAVA容器忘得一乾二淨,在這裡做一下詳細的學習和整理,ORZMAP部落格大佬。 首先在這裡進行理論儲備,對MAP容器有一個大致的瞭解:
【轉載】對BP進行增強後(螢幕欄位擴充)後,如何通過BAPI建立BP
建立BP成功後,直接呼叫更改客戶的一般資料 函式進行更改,注意幾個輸入引數。 CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL' &nbs
java爬蟲之入門基礎 java讀取txt檔案,對字串進行操作後匯出txt檔案
相比於C#,java爬蟲,python爬蟲更為方便簡要,首先呢,python的urllib2包提供了較為完整的訪問網頁文件的API,再者呢對於摘下來的文章,python的beautifulsoap提供了簡潔的文件處理功能,這就成就了他爬蟲的優勢。 作為一名滿腦子要成為一名大牛的程式設計師小白來講,倒不是非要
JAVA中對List<map<String,Object>>根據map某個key值從小到大順序進行排序
/** * @功能描述:排序方法 * @author LJ * 2018年10月29日 -下午2:38:15 */ public class java_ListMapSort { public static void main(String[] arg
c++對vector進行排序,並返回索引值
測試程式碼:(對向量進行排序,取一定範圍內的數值) vector<int> vec = {5,31,9,11,8,21,9,7,4};  
python:YY校招試題--傳入一個數組進行排序,奇數在前進行升序,偶數在後進行降序
a = input() # 輸入使用空格進行進行間隔 num = [int(n) for n in a.split()] print(num) def mysort(a,ascending=True): # 插入排序,a為list陣列,ascending=True時升
用random函式賦值產生一個整數陣列(陣列長度大於8,陣列元素取值均大於10並小於等於100),使用冒泡法進行排序,在頁面上輸出排序前和排序後的陣列。js
<!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文件</title> </head> <body>