国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信小程序?qū)γ舾袛?shù)據(jù)加解密算法(Java)

這篇具有很好參考價(jià)值的文章主要介紹了微信小程序?qū)γ舾袛?shù)據(jù)加解密算法(Java)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.背景介紹

微信小程序?qū)γ舾袛?shù)據(jù)加解密算法,以獲取微信的群ID(opengid)為例
微信端通過(guò)轉(zhuǎn)發(fā)獲取加密數(shù)據(jù)
微信端通過(guò)獲取微信群聊場(chǎng)景下的小程序啟動(dòng)信息

獲取的相關(guān)參數(shù)
微信小程序?qū)γ舾袛?shù)據(jù)加解密算法(Java)
但官方提供的加密數(shù)據(jù)加解密算法所支持的語(yǔ)言卻不包括Java
微信小程序?qū)γ舾袛?shù)據(jù)加解密算法(Java)

接口如果涉及敏感數(shù)據(jù)(如wx.getUserInfo當(dāng)中的 openId 和
unionId),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù)。開(kāi)發(fā)者如需要獲取敏感數(shù)據(jù),需要對(duì)接口返回的加密數(shù)據(jù)(encryptedData)
進(jìn)行對(duì)稱解密。 解密算法如下:

對(duì)稱解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充。 對(duì)稱解密的目標(biāo)密文為
Base64_Decode(encryptedData)。 對(duì)稱解密秘鑰 aeskey =
Base64_Decode(session_key), aeskey 是16字節(jié)。 對(duì)稱解密算法初始向量
為Base64_Decode(iv),其中 iv 由數(shù)據(jù)接口返回。
微信官方提供了多種編程語(yǔ)言的示例代碼((點(diǎn)擊下載)。每種語(yǔ)言類型的接口名字均一致。調(diào)用方式可以參照示例。

另外,為了應(yīng)用能校驗(yàn)數(shù)據(jù)的有效性,會(huì)在敏感數(shù)據(jù)加上數(shù)據(jù)水印( watermark )。

2.解決方案①

Entity類

@ApiModel(value = "OpenGIdDTO", description = "獲取openGId的解密參數(shù)")
public class OpenGIdDTO {
    @ApiModelProperty(value = "需要加密的數(shù)據(jù)")
    private String encrypt;

    @ApiModelProperty(value = "對(duì)稱加密秘鑰")
    private String sessionKey;

    @ApiModelProperty(value = "對(duì)稱加密算法初始向量")
    private String iv;

    public String getEncrypt() {
        return encrypt;
    }

    public void setEncrypt(String encrypt) {
        this.encrypt = encrypt;
    }

    public String getSessionKey() {
        return sessionKey;
    }

    public void setSessionKey(String sessionKey) {
        this.sessionKey = sessionKey;
    }

    public String getIv() {
        return iv;
    }

    public void setIv(String iv) {
        this.iv = iv;
    }
}

Controller層

    @ApiOperation(value = "獲取openGId")
    @PostMapping(value = "/getOpenGId")
    public JSONObject getOpenId(@RequestBody OpenGIdDTO openGIdDTO) throws Exception {
        String decrypt = WXCore.decrypt(APPID, openGIdDTO.getEncrypt(), openGIdDTO.getSessionKey(), openGIdDTO.getIv());
        JSONObject json = JSON.parseObject(decrypt);
        return json;
    }

工具類

public class WXCore {

    private static final String WATERMARK = "watermark";
    private static final String APPID = "openGId";
    /**
     * 解密數(shù)據(jù)
     * @return
     * @throws Exception
     */
    public static String decrypt(String appId, String encryptedData, String sessionKey, String iv){
        String result = "";
        try {
            AES aes = new AES();
            byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));
            if(null != resultByte && resultByte.length > 0){
                result = new String(WxPKCS7Encoder.decode(resultByte));
                JSONObject jsonObject = JSONObject.parseObject(result);
                String decryptAppid = jsonObject.getJSONObject(WATERMARK).getString("appid");
                if(!appId.equals(decryptAppid)){
                    result = "";
                }
            }
        } catch (Exception e) {
            result = "";
            e.printStackTrace();
        }
        return result;
    }
}
public class AES {

    public static boolean initialized = false;

    /**
     * AES解密
     *
     * @param content
     * 密文
     * @return
     * @throws InvalidAlgorithmParameterException
     * @throws NoSuchProviderException
     */
    public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
        initialize();
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            Key sKeySpec = new SecretKeySpec(keyByte, "AES");
            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public static void initialize() {
        if (initialized)
            return;
        Security.addProvider(new BouncyCastleProvider());
        initialized = true;
    }

    // 生成iv
    public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(iv));
        return params;
    }
}

3.解決方案②

Entity類一致

Controller層

    @ApiOperation(value = "解密返參信息")
    @PostMapping(value = "/getMess")
    @UserAnnotation()
    public JSONObject getMess(@RequestBody OpenGIdDTO openGIdDTO) throws Exception {
        String decrypt = WxCryptUtils.decrypt(openGIdDTO.getEncrypt(), openGIdDTO.getIv(), openGIdDTO.getSessionKey());
        JSONObject json = JSON.parseObject(decrypt);
        return json;
    }

工具類

public class WxCryptUtils {

    /**
     * 小程序 數(shù)據(jù)解密
     *
     * @param encryptData 加密數(shù)據(jù)
     * @param iv          對(duì)稱解密算法初始向量
     * @param sessionKey  對(duì)稱解密秘鑰
     * @return 解密數(shù)據(jù)
     */
    public static String decrypt(String encryptData, String iv, String sessionKey) throws Exception {
        AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance("AES");
        algorithmParameters.init(new IvParameterSpec(Base64.decodeBase64(iv)));
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.decodeBase64(sessionKey), "AES"), algorithmParameters);
        byte[] decode = PKCS7Encoder.decode(cipher.doFinal(Base64.decodeBase64(encryptData)));
        String decryptStr = new String(decode, StandardCharsets.UTF_8);
        return decryptStr;
    }

    /**
     * 數(shù)據(jù)加密
     *
     * @param data          需要加密的數(shù)據(jù)
     * @param iv            對(duì)稱加密算法初始向量
     * @param sessionKey    對(duì)稱加密秘鑰
     * @return  加密數(shù)據(jù)
     */
    public static String encrypt(String data, String iv, String sessionKey) throws Exception {
        AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance("AES");
        algorithmParameters.init(new IvParameterSpec(Base64.decodeBase64(iv)));
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(Base64.decodeBase64(sessionKey), "AES"), algorithmParameters);
        byte[] textBytes = data.getBytes(StandardCharsets.UTF_8);
        ByteGroup byteGroup= new ByteGroup();
        byteGroup.addBytes(textBytes);
        byte[] padBytes = PKCS7Encoder.encode(byteGroup.size());
        byteGroup.addBytes(padBytes);
        byte[] encryptBytes = cipher.doFinal(byteGroup.toBytes());
        return Base64.encodeBase64String(encryptBytes);
    }
}
public class PKCS7Encoder {

    static Charset CHARSET = Charset.forName("utf-8");
    static int BLOCK_SIZE = 32;

    /**
     * 獲得對(duì)明文進(jìn)行補(bǔ)位填充的字節(jié).
     *
     * @param count 需要進(jìn)行填充補(bǔ)位操作的明文字節(jié)個(gè)數(shù)
     * @return 補(bǔ)齊用的字節(jié)數(shù)組
     */
    public static byte[] encode(int count) {
        // 計(jì)算需要填充的位數(shù)
        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
        if (amountToPad == 0) {
            amountToPad = BLOCK_SIZE;
        }
        // 獲得補(bǔ)位所用的字符
        char padChr = chr(amountToPad);
        String tmp = new String();
        for (int index = 0; index < amountToPad; index++) {
            tmp += padChr;
        }
        return tmp.getBytes(CHARSET);
    }

    /**
     * 刪除解密后明文的補(bǔ)位字符
     *
     * @param decrypted 解密后的明文
     * @return 刪除補(bǔ)位字符后的明文
     */
    public static byte[] decode(byte[] decrypted) {
        int pad = decrypted[decrypted.length - 1];
        if (pad < 1 || pad > 32) {
            pad = 0;
        }
        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
    }

    /**
     * 將數(shù)字轉(zhuǎn)化成ASCII碼對(duì)應(yīng)的字符,用于對(duì)明文進(jìn)行補(bǔ)碼
     *
     * @param a 需要轉(zhuǎn)化的數(shù)字
     * @return 轉(zhuǎn)化得到的字符
     */
    static char chr(int a) {
        byte target = (byte) (a & 0xFF);
        return (char) target;
    }
}
public class ByteGroup {

    ArrayList<Byte> byteContainer = new ArrayList<Byte>();

    public byte[] toBytes() {
        byte[] bytes = new byte[byteContainer.size()];
        for (int i = 0; i < byteContainer.size(); i++) {
            bytes[i] = byteContainer.get(i);
        }
        return bytes;
    }

    public ByteGroup addBytes(byte[] bytes) {
        for (byte b : bytes) {
            byteContainer.add(b);
        }
        return this;
    }

    public int size() {
        return byteContainer.size();
    }
}

4.實(shí)際使用中出現(xiàn)’javax.crypto.BadPaddingException: pad block corrupted’報(bào)錯(cuò)

出現(xiàn)原因:前端在調(diào)用取用戶手機(jī)號(hào)的回調(diào)函數(shù)中,又調(diào)用了一遍login()方法,然后把加密數(shù)據(jù)傳給我們來(lái)解密,在回調(diào)中不應(yīng)該調(diào)用登陸的方法,這樣會(huì)導(dǎo)致刷新sessionkey,當(dāng)我們用之前保存的sessionkey時(shí),可能導(dǎo)致sessionkey過(guò)期。用舊的sessionkey解密顯sessionkey加密的數(shù)據(jù),當(dāng)然會(huì)報(bào)錯(cuò)。
解決方案:前端不要調(diào)用2次login()方法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-493499.html

到了這里,關(guān)于微信小程序?qū)γ舾袛?shù)據(jù)加解密算法(Java)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java獲取微信小程序code獲取openid、session_key、unionid,獲取授權(quán)信息解密獲取手機(jī)號(hào)

    WechatUtils (具體實(shí)體類自己根據(jù)自己的業(yè)務(wù)需求配置就行) service impl實(shí)現(xiàn)類 ??這個(gè)代碼已經(jīng)可以解析出code信息,具體的業(yè)務(wù)流程自己去添加就ok 還是我們之前的WechatUtils,在里面添加getPhone方法 service impl實(shí)現(xiàn)類 ??以上就是本次的筆記了,大家有需要用的自取,有用記得點(diǎn)個(gè)贊

    2024年02月16日
    瀏覽(22)
  • 微信小程序逆向解密

    微信小程序逆向解密

    WeChatAppEx.exe 版本:2.0.6609.4 以融智云考學(xué)生端為例。 網(wǎng)上已經(jīng)有關(guān)于微信小程序解密的非常優(yōu)秀的文章,本著學(xué)習(xí)的目的便不參考相關(guān)內(nèi)容。 筆者水平實(shí)在有限,如發(fā)現(xiàn)紕漏,還請(qǐng)讀者不吝賜教。 工具:火絨劍 首先看看打開(kāi)一個(gè)小程序微信做了點(diǎn)什么,對(duì)微信進(jìn)行火絨行為

    2024年02月11日
    瀏覽(19)
  • 微信小程序--解密用戶信息

    前端傳值:encryptedData、iv、code step1:將code發(fā)送給微信服務(wù)器,獲取openid和session_key step2:根據(jù)encryptedData、iv、session_key(會(huì)話密鑰),通過(guò)AES解密獲取到用戶所有信息

    2024年02月15日
    瀏覽(15)
  • 微信小程序背景圖片設(shè)置

    微信小程序背景圖片設(shè)置

    問(wèn)題? :微信小程序通過(guò)css:background-image引入背景圖片失敗 [渲染層網(wǎng)絡(luò)層錯(cuò)誤] pages/wode/wode.wxss 中的本地資源圖片無(wú)法通過(guò) WXSS 獲取,可以使用網(wǎng)絡(luò)圖片,或者 base64,或者使用image/標(biāo)簽 解決方法微信小程序在使用background-image設(shè)置背景圖時(shí)報(bào)錯(cuò):渲染層網(wǎng)絡(luò)層錯(cuò)誤_index.wxss 中的

    2024年02月04日
    瀏覽(25)
  • 微信小程序 背景圖片設(shè)置

    微信小程序 背景圖片設(shè)置

    ????????微信小程序設(shè)置背景圖片時(shí),有兩種方法: ????????第一:直接在.wxss中中使用 “background-image:url()” 設(shè)置背景圖片,但是這種加載背景圖片的方法存在一個(gè)問(wèn)題,就是所加載的圖片只能是 網(wǎng)絡(luò)圖片 或 base64 圖片,是不可以加載本地圖片的。 但是使用base64圖片

    2024年02月11日
    瀏覽(21)
  • 微信小程序前端加解密逆向分析

    微信小程序前端加解密逆向分析

    某小程序滲透測(cè)試項(xiàng)目,測(cè)試時(shí)發(fā)現(xiàn)請(qǐng)求包內(nèi)容進(jìn)行了加密 小程序文件目錄: 使用網(wǎng)易Mumu模擬器,開(kāi)啟root權(quán)限,安裝手機(jī)微信并訪問(wèn)指定小程序,然后打開(kāi)RE文件管理器,在 data/data/com.tencent.mm/MicroMsg 會(huì)生成一個(gè)md5加密命名的文件夾,在該文件夾下的 appbrand/pkg 目錄下找到

    2024年02月05日
    瀏覽(25)
  • uniapp微信小程序設(shè)置背景漸變

    最近有個(gè)項(xiàng)目要用到背景漸變,背景漸變主要用到css,代碼如下: 實(shí)現(xiàn)原理,position:fixed 固定定位、background-image: linear-gradient 線性漸變和 z-index 設(shè)置元素的堆疊順序。

    2024年02月11日
    瀏覽(25)
  • 微信小程序之 base-64加密、解密

    后端獲取 token 接口,需要加密認(rèn)證

    2024年02月11日
    瀏覽(27)
  • 微信小程序~如何設(shè)置頁(yè)面的背景色

    微信小程序~如何設(shè)置頁(yè)面的背景色

    眾所周知,微信小程序每個(gè)頁(yè)面由.json,.scss,.ts,.wxml這四個(gè)文件組成。 有的小伙伴會(huì)發(fā)現(xiàn),需要給頁(yè)面加背景色的時(shí)候,只需在此頁(yè)面的.scss文件中寫個(gè)page{background-color: #f8f8f8;}就能生效,卻不知其所以然。 這是因?yàn)?微信小程序的每個(gè)頁(yè)面,都有一個(gè)page根標(biāo)簽 ,見(jiàn)“調(diào)試

    2024年04月10日
    瀏覽(37)
  • js 微信小程序aes解密-CryptoJS

    隨著微信小程序的不斷發(fā)展,js這門技術(shù)也越來(lái)越重要,很多人都開(kāi)啟了學(xué)習(xí)js,本文就介紹了aes解密。 crypto-js 是一個(gè)純 javascript 寫的加密算法類庫(kù) ,可以非常方便地在 javascript 進(jìn)行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,進(jìn)行 AES、DES、Rabbit、RC4、Triple DES 加解密。 我們可

    2024年02月16日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包