使用CryptoJS解决百度小程序用户信息解密

问题描述:

swan.getUserInfo()百度官方的这个获取用户信息的方法,需要对接口返回的加密数据( data )进行对称解密。

用户数据的签名验证和加解密

智能小程序可以通过各种前端接口获取百度提供的开放数据。考虑到开发者服务器也需要获取这些开放数据,百度会对这些数据做签名和加密处理。开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。

加密数据解密算法

接口如果涉及敏感数据,接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(data)进行对称解密。

解密过程:开发者智能小程序(通过 swan.request)将加密数据发送至自身 Server 进行解密后返回智能小程序。

解密算法如下:

对称解密使用的算法为 AES-192-CBC,数据采用PKCS#7填充;

对称解密的目标密文为 Base64_Decode(data);

对称解密秘钥 AESKey = Base64_Decode(session_key), AESKey 是24字节;

对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

解密后内容如下:

干货:模仿 Node 的 demo,使用 CryptoJS实现纯 js 下解密百度小程序用户信息(仿微信小程序案例)

1.将 CryptoJS 的包放入 小程序的 utils 中(点击下载


2. 封装 RdWXBizDataCrypt.js



/**

* Created by hs on 2018/11/20.

*/

// 引入CryptoJS

var Crypto = require('cryptojs/cryptojs.js').Crypto;

var app = getApp();

function RdWXBizDataCrypt(appId, sessionKey, clientId) {

  this.appId = appId

  this.sessionKey = sessionKey

  this.appkey = clientId

}

RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {

  // base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码

  var encryptedData = Crypto.util.base64ToBytes(encryptedData)

  var key = Crypto.util.base64ToBytes(this.sessionKey);

  var iv = Crypto.util.base64ToBytes(iv);

  // 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充

  var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);

  try {

    // 解密

    var bytes = Crypto.AES.decrypt(encryptedData, key, {

      asBpytes: true,

      iv: iv,

      mode: mode

    });

//去掉尾部APPkey

    bytes = bytes.replace(this.appkey, "");

//去掉16位随即长度和个人数据,20位

bytes = bytes.substr(20);

//转为JSON数据

    var decryptResult = JSON.parse(bytes);

  } catch (err) {

    console.log("222", err)

  }

  // if (decryptResult.appid !== this.appId) {

  //  console.log(err)

  // }

  return decryptResult

}

module.exports = RdWXBizDataCrypt


3. 在 app.js 中引入 RdWXBizDataCrypt



var WXBizDataCrypt = require('utils/RdWXBizDataCrypt.js');

var AppId = '**************'

var AppSecret = '***************************'

var Appkey = '***************************'

App({

  onLaunch: function () {

  },

  getUserInfo:function(cb){

    var that =this;

if(this.globalData.userInfo){

      typeof cb == "function" && cb(this.globalData.userInfo)

    }else{

      //调用登录接口,获取 code     

swan.login({

        success: function (res) {

          //发起网络请求          

swan.request({

              url: 'https://openapi.baidu.com/nalogin/getSessionKeyByCode',

              data:{

                        client_id: Appkey,

                        sk: AppSecret,

                        code: res.code,

                              },

              header: { 

                  "Content-Type": "application/x-www-form-urlencoded"              },

              method: 'GET',

              success: function(res){

                var pc =new WXBizDataCrypt(AppId, res.data.session_key)

                swan.getUserInfo({

                  success: function (res) {

                    var data = pc.decryptData(res.encryptedData , res.iv)

                    console.log('解密后 data: ', data)

                  }

                })

              },

              fail: function(res) {},

              complete: function(res) {}

          });

        }

      })

    }

  }

})


  4. 实现效果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342