ホームページ  >  記事  >  WeChat アプレット  >  WeChat開発入門 (6) ユーザーデータの復号化

WeChat開発入門 (6) ユーザーデータの復号化

零下一度
零下一度オリジナル
2017-05-24 09:38:082119ブラウズ

グループ内の何人かの友人がミニ プログラム ユーザー データの復号化プロセスについて質問しているのをよく見かけます。そのため、ミニ プログラム ユーザーの機密データの復号化に関するチュートリアルを書く予定です。

暗号化プロセスは WeChat サーバー上で完了し、復号化プロセスはミニプログラムと独自のサーバー上で完了します。つまり、次のデータがencryptDataから取得されます:

{
    "openId": "OPENID",
    "nickName": "NICKNAME",
    "gender": GENDER,
    "city": "CITY",
    "province": "PROVINCE",
    "country": "COUNTRY",
    "avatarUrl": "AVATARURL",
    "unionId": "UNIONID",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}

準備知識:

  1. Base64エンコードとデコード

  2. AESアルゴリズム、パディングモード、オフセットベクトル

  3. session_keyセッションキー、および保存方法と取得方法

上記の3点は、復号プロセスを理解するために非常に重要です

公式ドキュメントに従って、一般的な復号プロセスを次のように整理しました:

WeChat開発入門 (6) ユーザーデータの復号化

  1. アプレットクライアントは wx.login を呼び出し、コールバックには js_code が含まれます。

  2. 次に、js_code をサーバー A (開発者サーバー) に送信します。サーバー A は、ユーザーの openid と session_key (セッション キー) と引き換えに、js_code、appId、secretkey、およびgrant_type パラメーターを使用して WeChat サーバーへのリクエストを開始します。

  3. サーバー A が session_key を取得した後、3rdSessionId をキーとして、session_key + openid を値として使用して 3rd_session と呼ばれる乱数を生成しますredis または memcached にキャッシュ します。直接推奨 session_key はネットワーク経由で送信され、開発者は session_key に関連付ける一意のキーを生成します。その機能は次のとおりです:

    1. 3rdSessionId をクライアントに返し、ミニ プログラムのログイン ステータスを維持します。

    2. 3rdSessionId を通じてユーザー session_key と openid を検索します。

  4. クライアントが 3rdSessionId を取得すると、それはストレージにキャッシュされます。

  5. ユーザーの機密データの encryptedData は、wx.getUserIinfo を通じて取得できます。

  6. クライアントは、encryptedData、3rdSessionId、オフセットを一緒にサーバーAに送信します

  7. サーバーAは、3rdSessionIdに基づいてキャッシュからsession_keyを取得します

  8. AESを使用してサーバーAのencryptedDataを復号化し、ユーザーの機密データ

3 つのリンク 6、7、および 8 に焦点が当てられています。

AES 復号化の 3 つのパラメーター:

  • ciphertext encryptedData

  • key aesKey

  • offset Vector iv

サーバー側の復号化プロセス:

  1. ciphertextオフセット ベクトルはクライアントによって提供されます。 クライアントそれをサーバーに送信し、サーバー上の 2 つのパラメーターは Base64_decode

    デコード です。

  2. 3rdSessionId に基づいてキャッシュから session_key を取得し、session_key を Base64_decode して aesKey、aes キーを取得します。

  3. aes復号化メソッドを呼び出します。アルゴリズムはAES-128-CBCで、データはPKCS#7で埋められます。

以下は、ミニプログラムの例を使用して復号プロセスを説明します:

1. WeChat にログインし、ユーザー情報を取得します

var that = this;wx.login({success: function (res) {
    //微信js_code
    that.setData({wxcode: res.code});
    //获取用户信息
    wx.getUserInfo({
        success: function (res) {
            //获取用户敏感数据密文和偏移向量
            that.setData({encryptedData: res.encryptedData})            that.setData({iv: res.iv})        }
    })}})

2. コードを使用して 3rdSessionId を交換します

var httpclient = require('../../utils/httpclient.js')
VAR that = this//httpclient.req(url, data, method, success, fail)httpclient.req(  'http://localhost:8090/wxappservice/api/v1/wx/getSession',
  {
      apiName: 'WX_CODE',
      code: this.data.wxcode
  },
  'GET',
  function(result){
    var thirdSessionId = result.data.data.sessionId;
    that.setData({thirdSessionId: thirdSessionId})    //将thirdSessionId放入小程序缓存
    wx.setStorageSync('thirdSessionId', thirdSessionId)  },
  function(result){
    console.log(result)  });

3.

//httpclient.req(url, data, method, success, fail)httpclient.req('http://localhost:8090/wxappservice/api/v1/wx/decodeUserInfo',
  {
    apiName: 'WX_DECODE_USERINFO',
    encryptedData: this.data.encryptedData,
    iv: this.data.iv,
    sessionId: wx.getStorageSync('thirdSessionId')  },
  'GET',
  function(result){
  //解密后的数据
    console.log(result.data)  },
  function(result){
    console.log(result)  });

4. サーバー側の復号化実装 (java)

/** * 解密用户敏感数据 * @param encryptedData 明文 * @param iv            加密算法的初始向量 * @param sessionId     会话ID * @return */@Api(name = ApiConstant.WX_DECODE_USERINFO)@RequestMapping(value = "/api/v1/wx/decodeUserInfo", method = RequestMethod.GET, produces = "application/json")public Map<String,Object> decodeUserInfo(@RequestParam(required = true,value = "encryptedData")String encryptedData,        @RequestParam(required = true,value = "iv")String iv,        @RequestParam(required = true,value = "sessionId")String sessionId){    //从缓存中获取session_key
    Object wxSessionObj = redisUtil.get(sessionId);    if(null == wxSessionObj){        return rtnParam(40008, null);
    }
    String wxSessionStr = (String)wxSessionObj;
    String sessionKey = wxSessionStr.split("#")[0];    try {
        AES aes = new AES();        byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));        if(null != resultByte && resultByte.length > 0){
            String userInfo = new String(resultByte, "UTF-8");            return rtnParam(0, userInfo);
        }
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }    return rtnParam(50021, null);
}

5. AES 復号化コア コード

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();
    }

最終的な効果は次のとおりです:


WeChat開発入門 (6) ユーザーデータの復号化

ミニ プログラムが WeChat オープン プラットフォームにバインドされていない場合、復号化されたデータには Unionid パラメータが含まれていません

ミニ プログラムは WeChat Open Platform プラットフォーム接続にバインドされています

概要

復号化されたデータから、機密データは appid のみであると私は個人的に感じています。各公開アカウントの

safeopenid; openid は appid 内でのみ使用可能です。 appid も漏洩していない限り。

その後、復号化されたデータから appid を取得できます。WeChat ミニ プログラム チームの目的は何ですか?前に述べたように、openid と appid は、ミニ プログラム開発者が異なるミニ プログラム アプリケーション間でユーザーを区別して分離するのを容易にするために一緒に使用され、同時に WeChat ユーザー システムと 3 つ目のユーザー システムを組み合わせることができます。 -パーティービジネスシステム。

したがって、機密データの復号化の主な用途は、それを復号化してクライアントに送り返すことではなく、WeChat のユーザー情報をサーバー側で独自のビジネスに統合することだと思います。

【関連推奨事項】

1.

WeChatパブリックアカウントプラットフォームのソースコードダウンロード

2.

WeChat投票ソースコード

3.

WeChat Lala Takeaway 2.2.4の復号化されたオープンソースバージョンWeChatルービックキューブのソースコード

以上がWeChat開発入門 (6) ユーザーデータの復号化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。