1. 程式人生 > >小程式獲取使用者繫結的電話號碼及解密方法(提供Java後臺解密)

小程式獲取使用者繫結的電話號碼及解密方法(提供Java後臺解密)

小程式前臺程式碼

<button open-type="getPhoneNumber" bindgetphonenumber="telPhone" class="id_style">請填寫手機號碼
</button>

.id_style {
  padding-right: 0rpx;
  padding-left: 0rpx;
  background-color: #fff;
  font-size: 30rpx;
  text-align: right;
  line-height: 72rpx;
  border: none;
  color: #888;
}

Java後臺程式碼

工具類

package com.ods.common.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import it.sauronsoftware.base64.Base64;  

public class Base64Util {
    /** *//** 
     * 檔案讀取緩衝區大小 
     */  
    private static final int CACHE_SIZE = 1024;  
      
    /** *//** 
     * <p> 
     * BASE64字串解碼為二進位制資料 
     * </p> 
     *  
     * @param base64 
     * @return 
     * @throws Exception 
     */  
    public static byte[] decode(String base64) throws Exception {  
        return Base64.decode(base64.getBytes());  
    }  
      
    /** *//** 
     * <p> 
     * 二進位制資料編碼為BASE64字串 
     * </p> 
     *  
     * @param bytes 
     * @return 
     * @throws Exception 
     */  
    public static String encode(byte[] bytes) throws Exception {  
        return new String(Base64.encode(bytes));  
    }  
      
    /** *//** 
     * <p> 
     * 將檔案編碼為BASE64字串 
     * </p> 
     * <p> 
     * 大檔案慎用,可能會導致記憶體溢位 
     * </p> 
     *  
     * @param filePath 檔案絕對路徑 
     * @return 
     * @throws Exception 
     */  
    public static String encodeFile(String filePath) throws Exception {  
        byte[] bytes = fileToByte(filePath);  
        return encode(bytes);  
    }  
      
    /** *//** 
     * <p> 
     * BASE64字串轉回檔案 
     * </p> 
     *  
     * @param filePath 檔案絕對路徑 
     * @param base64 編碼字串 
     * @throws Exception 
     */  
    public static void decodeToFile(String filePath, String base64) throws Exception {  
        byte[] bytes = decode(base64);  
        byteArrayToFile(bytes, filePath);  
    }  
      
    /** *//** 
     * <p> 
     * 檔案轉換為二進位制陣列 
     * </p> 
     *  
     * @param filePath 檔案路徑 
     * @return 
     * @throws Exception 
     */  
    public static byte[] fileToByte(String filePath) throws Exception {  
        byte[] data = new byte[0];  
        File file = new File(filePath);  
        if (file.exists()) {  
            FileInputStream in = new FileInputStream(file);  
            ByteArrayOutputStream out = new ByteArrayOutputStream(2048);  
            byte[] cache = new byte[CACHE_SIZE];  
            int nRead = 0;  
            while ((nRead = in.read(cache)) != -1) {  
                out.write(cache, 0, nRead);  
                out.flush();  
            }  
            out.close();  
            in.close();  
            data = out.toByteArray();  
         }  
        return data;  
    }  
      
    /** *//** 
     * <p> 
     * 二進位制資料寫檔案 
     * </p> 
     *  
     * @param bytes 二進位制資料 
     * @param filePath 檔案生成目錄 
     */  
    public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {  
        InputStream in = new ByteArrayInputStream(bytes);     
        File destFile = new File(filePath);  
        if (!destFile.getParentFile().exists()) {  
            destFile.getParentFile().mkdirs();  
        }  
        destFile.createNewFile();  
        OutputStream out = new FileOutputStream(destFile);  
        byte[] cache = new byte[CACHE_SIZE];  
        int nRead = 0;  
        while ((nRead = in.read(cache)) != -1) {     
            out.write(cache, 0, nRead);  
            out.flush();  
        }  
        out.close();  
        in.close();  
    }  
}

解析方法

	/**
	 * 解密使用者電話
	 * @param keyStr sessionkey
	 * @param ivStr  ivData
	 * @param encDataStr 帶解密資料
	 * @return
	 * @throws Exception 
	 * @author pangxianhe
	 * @date 2018年10月22日
	 */
	public static String decrypt(String keyStr, String ivStr, String encDataStr)throws Exception {
			
			byte[] encData = Base64Util.decode(encDataStr);
			byte[] iv =Base64Util.decode(ivStr);
			byte[] key = Base64Util.decode(keyStr);
			AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
			cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
			 return new String(cipher.doFinal(encData),"UTF-8");
	}
	




public static void main(String[] args) throws Exception {
    String  encrypData = "dhxK6mXwVPUabiK9i78OP4bmjg1YEYlQNIimEm5WEU6PxB/nexMk+CeBgsH9FFI2v9ikDAjGShPjZJj4xsRkbOH4otOHB3GumTRzh9ZYxXlQyrOnyL2//Yr2AL/KYW47n3JxqeeiVP9y/5JDPcY5HAM4/XDV3SzROI730aItFdHmDhc0/CyDLH1WDzv8y24J9Z/eyv+GzP9rTpdKjN4DA==";
    String ivData =  "ZwRBTP8AtevYJtbLLh9Lg==";
    String sessionKey =  "3LL836kTRzaJ5llVmRN6w==";
    System.out.println(decrypt(sessionKey,ivData,encrypData));
}

返回:

{"phoneNumber":"15000000000000","purePhoneNumber":"15000000000000","countryCode":"86","watermark":{"timestamp":1540212690,"appid":"wxe48a00000000000"}}

注意:由於以上的字串已經過修改,請填寫正確的引數,然後進行解密