微信测试服务器验证sha1加密法,工具类
1 package org.fc.Util; 2 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 import java.util.Arrays; 6 7 import com.sun.mail.handlers.message_rfc822; 8 9 public class SignUtil { 10 11 private static String token="XXXXXX"; 12 13 /** 14 * 传入三个参数以及微信的token(静态自己设定)验证, 15 * @param signature 签名用来核实最后的结果是否一致 16 * @param timestamp 时间标记 17 * @param nonce 随机数字标记 18 * @return 一个布尔值确定最后加密得到的是否与signature一致 19 */ 20 public static boolean checkSignature(String signature, 21 String timestamp,String nonce){ 22 //将传入参数变成一个String数组然后进行字典排序 23 String[] arr=new String[]{token,timestamp,nonce}; 24 Arrays.sort(arr); 25 //创建一个对象储存排序后三个String的结合体 26 StringBuilder content=new StringBuilder(); 27 for(int i=0;i<arr.length;i++){ 28 content.append(arr[i]); 29 } 30 31 32 //启动sha1加密法的工具 33 MessageDigest md=null; 34 String tmpStr=null; 35 try { 36 md=MessageDigest.getInstance("SHA-1"); 37 //md.digest()方法必须作用于字节数组 38 byte[] digest=md.digest(content.toString().getBytes()); 39 //将字节数组弄成字符串 40 tmpStr=byteToStr(digest); 41 } catch (NoSuchAlgorithmException e) { 42 // TODO Auto-generated catch block 43 e.printStackTrace(); 44 } 45 content=null; 46 47 return tmpStr!=null?tmpStr.equals(signature.toUpperCase()):false; 48 49 } 50 51 52 /** 53 * 将字节加工然后转化成字符串 54 * @param digest 55 * @return 56 */ 57 private static String byteToStr(byte[] digest){ 58 String strDigest=""; 59 for(int i=0;i<digest.length;i++){ 60 //将取得字符的二进制码转化为16进制码的的码数字符串 61 strDigest+=byteToHexStr(digest[i]); 62 } 63 return strDigest; 64 } 65 66 /** 67 * 把每个字节加工成一个16位的字符串 68 * @param b 69 * @return 70 */ 71 public static String byteToHexStr(byte b){ 72 //转位数参照表 73 char[] Digit= {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 74 75 76 //位操作把2进制转化为16进制 77 char[] tempArr=new char[2]; 78 tempArr[0]=Digit[(b>>>4)&0X0F];//XXXX&1111那么得到的还是XXXX 79 tempArr[1]=Digit[b&0X0F];//XXXX&1111那么得到的还是XXXX 80 81 //得到进制码的字符串 82 String s=new String(tempArr); 83 return s; 84 } 85 }
这个方法用于微信。如果有其他作用请分离