Javaが微信の小さいプログラムの登録を実現する時出会う暗号化のアルゴリズム——sha 1のアルゴリズムとAES-128-CBC

4590 ワード

引用する
微信ウィジェットのログイン時に、ユーザーが以前に関連するアプリケーションプラットフォームにログインしたことがなければ(開発者の公衆番号に注目したことがなく、微信がweb端末、app端末にログインしたことがない)、プラットフォーム全体で唯一のunionIdを取得するには、sha 1チェックマークとAES-128-CBC復号の問題に直面する.そして、微信は父親が与えたSDKの中にphp、nodeJs、C+、pythonしかなく、javaのdemoは与えられなかった.参考微信説明住所:1.https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 2.https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html
sha 1のチェック方法については、ネット上には実はたくさんあります.同時にAES-128-CBC復号も多いが,AES-128-CBC暗号化は少ない.ここではブロガーが使用するツールクラスを示します.
具体的なやり方.
一、相応のパッケージを導入する

    org.bouncycastle
    bcprov-jdk15on
    1.51


二、AESDecryptUtilソースコード展示
package com.yuxun.fantuan.framework.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Arrays;

/**
 * @author wyk on 2018/11/14
 */
@Slf4j
public class AESDecryptUtil {
    //     
    private static final String KEY_ALGORITHM = "AES";

    /**
     *      /  /    
     */
    private static final String algorithmStr = "AES/CBC/PKCS7Padding";

    private static Key key;
    private static Cipher cipher;

    public static String encrypt(byte[] originalContent, byte[] encryptKey, byte[] ivByte) {
        try {
            encryptKey = Base64.decodeBase64(encryptKey);
            ivByte = Base64.decodeBase64(ivByte);

            init(encryptKey);
            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivByte));
            byte[] encrypted = cipher.doFinal(originalContent);
            return new String(Base64.encodeBase64(encrypted),StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static void init(byte[] keyBytes) {

        //       16 ,     .   if        
        int base = 16;
        if (keyBytes.length % base != 0) {
            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
            byte[] temp = new byte[groups * base];
            Arrays.fill(temp, (byte) 0);
            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
            keyBytes = temp;
        }
        //    
        Security.addProvider(new BouncyCastleProvider());
        //    JAVA     
        key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
        try {
            //    cipher
            cipher = Cipher.getInstance(algorithmStr);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            log.error("AES      ",e);
        }
    }

    /**
     *     
     * @param encryptedDataStr
     * @param keyBytesStr
     * @param ivStr
     * @return
     */
    public static String decrypt(String encryptedDataStr, String keyBytesStr, String ivStr) {
        byte[] encryptedText = null;
        byte[] encryptedData = null;
        byte[] sessionkey = null;
        byte[] iv = null;

        try {
            sessionkey = Base64.decodeBase64(keyBytesStr);
            encryptedData = Base64.decodeBase64(encryptedDataStr);
            iv = Base64.decodeBase64(ivStr);

            init(sessionkey);
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
            encryptedText = cipher.doFinal(encryptedData);
        } catch (Exception e) {
            log.error("AES      ",e);
        }
        assert encryptedText != null;
        return new String(encryptedText,StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {

        String content = "{\"phoneNumber\":\"18789536667\"}";
        String key = "9QJPlP2TyuDFH1A73pnGqg==";
        String iv = "SABdIDCax6u7H0f6OILGzw==";

        String encrptContent = AESDecryptUtil.encrypt(content.getBytes(),key.getBytes(),iv.getBytes());
        System.out.println(encrptContent);

        System.out.println(AESDecryptUtil.decrypt(encrptContent, key, iv));
    }
}

また、署名を検証するsha 1アルゴリズムも記録しておきます
String sha1Hex = DigestUtils.sha1Hex(miniLoginUserInfoDTO.getRawData()+sessionKey);