Golang微信小程序解密 encryptedData 解密

参考 微信开放文档

当前端调用 getUserProfile 这个API 的时候,会返回一堆数据,userInfo 用户信息对象。。。

  1. 在解密 encryptedData 的时候,首先要通过 wx.login() 获取到 session_key
  2. 方法: 小程序调用 wx.login() 将 code 传给后端,后端通过这个 code 去获取到 session_keykey。在这儿要调用 jscode2session 微信的接口,传入参数参考文档
  3. 通过 AppID,session_key,encryptedData,iv。就可以解密 encryptedData里面的数据
  4. 因为我是使用 go 进行开发,go语言里面内置了 base64,所以不需要下载任何包。
package utils

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"encoding/json"
	"errors"
	"fmt"
)

// 微信小程序解密算法 AES-128-CBC
func DecryptWXOpenData(app_id, sessionKey, encryptData, iv string) (map[string]interface{}, error) {
	decodeBytes, err := base64.StdEncoding.DecodeString(encryptData)
	if err != nil {
		return nil, err
	}
	sessionKeyBytes, errKey := base64.StdEncoding.DecodeString(sessionKey)
	if errKey != nil {
		return nil, errKey
	}
	ivBytes, errIv := base64.StdEncoding.DecodeString(iv)
	if errIv != nil {
		return nil, errIv
	}
	dataBytes, errData := aesDecrypt(decodeBytes, sessionKeyBytes, ivBytes)
	fmt.Printf("dataBytes: %v\n", dataBytes)
	if errData != nil {
		return nil, errData
	}

	var result map[string]interface{}
	errResult := json.Unmarshal(dataBytes, &result)

	watermark := result["watermark"].(map[string]interface{})
	if watermark["appid"] != app_id {
		return nil, errors.New("Invalid appid data!")
	}
	return result, errResult
}

// AES 解密
func aesDecrypt(crypted, key, iv []byte) ([]byte, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return nil, err
	}
	blockMode := cipher.NewCBCDecrypter(block, iv)
	// 原始数据
	origData := make([]byte, len(crypted))
	blockMode.CryptBlocks(origData, crypted)

	// 去除填充  --- 数据尾端有'/x0e'占位符,去除它
	length := len(origData)
	unp := int(origData[length-1])
	return origData[:(length - unp)], nil
}


主文件

func test(){
	// appId  小程序的 AppID 一个固定的值
	// session_key 通过调用 jscode2session 获得
	// testEncryptedData 小程序传过来的
	// testIv 
	appId := ""
	session_key := ""
	testEncryptedData := ""
	testIv := ""
	m, errData := utils.DecryptWXOpenData(appId, session_key , testEncryptedData, testIv)
	if errData != nil {
		return
	}
	fmt.Printf("解密后的数据: %v\n", m)
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Golang中,可以使用微信小程序提供的解密算法来获取用户的手机号。首先,你需要获取到用户的session_key和加密的手机号数据。然后,使用Golang的crypto/aes包进行解密操作。 下面是一个示例代码,演示了如何在Golang中获取微信小程序用户的手机号: ```go package main import ( "crypto/aes" "crypto/cipher" "encoding/base64" "encoding/json" "fmt" ) type PhoneNumberData struct { PhoneNumber string `json:"phoneNumber"` PurePhoneNumber string `json:"purePhoneNumber"` CountryCode string `json:"countryCode"` Watermark struct { AppID string `json:"appid"` Timestamp int64 `json:"timestamp"` } `json:"watermark"` } func main() { encryptedData := "加密后的手机号数据" sessionKey := "用户的session_key" // 对session_key进行base64解码 sessionKeyBytes, err := base64.StdEncoding.DecodeString(sessionKey) if err != nil { fmt.Println("解码session_key失败:", err) return } // 对加密的手机号数据进行base64解码 encryptedDataBytes, err := base64.StdEncoding.DecodeString(encryptedData) if err != nil { fmt.Println("解码加密的手机号数据失败:", err) return } // 创建AES解密器 block, err := aes.NewCipher(sessionKeyBytes) if err != nil { fmt.Println("创建AES解密器失败:", err) return } // 解密数据 iv := sessionKeyBytes[:aes.BlockSize] mode := cipher.NewCBCDecrypter(block, iv) decryptedData := make([]byte, len(encryptedDataBytes)) mode.CryptBlocks(decryptedData, encryptedDataBytes) // 去除解密后的数据的补位字符 padding := int(decryptedData[len(decryptedData)-1]) phoneNumberData := decryptedData[:len(decryptedData)-padding] // 解析JSON数据 var data PhoneNumberData err = json.Unmarshal(phoneNumberData, &data) if err != nil { fmt.Println("解析JSON数据失败:", err) return } // 打印手机号 fmt.Println("手机号:", data.PhoneNumber) } ``` 请注意,上述代码中的`encryptedData`和`sessionKey`需要替换为实际的加密数据和用户的session_key。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值