我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

golang如何实现对用户加密数据进行解密?-创新互联

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:

创新互联建站为客户提供专业的成都网站制作、成都网站建设、程序、域名、空间一条龙服务,提供基于WEB的系统开发. 服务项目涵盖了网页设计、网站程序开发、WEB系统开发、微信二次开发、移动网站建设等网站方面业务。
  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

核心代码

wechat.go
package wechat

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

var (
   ErrAppIDNotMatch    = errors.New("app id not match")
   ErrInvalidBlockSize   = errors.New("invalid block size")
   ErrInvalidPKCS7Data   = errors.New("invalid PKCS7 data")
   ErrInvalidPKCS7Padding = errors.New("invalid padding on input")
)

type WxUserInfo struct {
   OpenID   string `json:"openId"`
   UnionID  string `json:"unionId"`
   NickName  string `json:"nickName"`
   Gender   int   `json:"gender"`
   City    string `json:"city"`
   Province  string `json:"province"`
   Country  string `json:"country"`
   AvatarURL string `json:"avatarUrl"`
   Language  string `json:"language"`
   Watermark struct {
     Timestamp int64  `json:"timestamp"`
     AppID   string `json:"appid"`
   } `json:"watermark"`
}

type WXUserDataCrypt struct {
   appID, sessionKey string
}

func NewWXUserDataCrypt(appID, sessionKey string) *WXUserDataCrypt {
   return &WXUserDataCrypt{
     appID:    appID,
     sessionKey: sessionKey,
   }
}

// pkcs7Unpad returns slice of the original data without padding
func pkcs7Unpad(data []byte, blockSize int) ([]byte, error) {
   if blockSize <= 0 {
     return nil, ErrInvalidBlockSize
   }
   if len(data)%blockSize != 0 || len(data) == 0 {
     return nil, ErrInvalidPKCS7Data
   }
   c := data[len(data)-1]
   n := int(c)
   if n == 0 || n > len(data) {
     return nil, ErrInvalidPKCS7Padding
   }
   for i := 0; i < n; i++ {
     if data[len(data)-n+i] != c {
       return nil, ErrInvalidPKCS7Padding
     }
   }
   return data[:len(data)-n], nil
}

func (w *WXUserDataCrypt) Decrypt(encryptedData, iv string) (*WxUserInfo, error) {
   aesKey, err := base64.StdEncoding.DecodeString(w.sessionKey)
   if err != nil {
     return nil, err
   }
   cipherText, err := base64.StdEncoding.DecodeString(encryptedData)
   if err != nil {
     return nil, err
   }
   ivBytes, err := base64.StdEncoding.DecodeString(iv)
   if err != nil {
     return nil, err
   }
   block, err := aes.NewCipher(aesKey)
   if err != nil {
     return nil, err
   }
   mode := cipher.NewCBCDecrypter(block, ivBytes)
   mode.CryptBlocks(cipherText, cipherText)
   cipherText, err = pkcs7Unpad(cipherText, block.BlockSize())
   if err != nil {
     return nil, err
   }
   var userInfo WxUserInfo
   err = json.Unmarshal(cipherText, &userInfo)
   if err != nil {
     return nil, err
   }
   if userInfo.Watermark.AppID != w.appID {
     return nil, ErrAppIDNotMatch
   }
   return &userInfo, nil
}

main.go 文件
package main

import (
   "fmt"
   "test/wxbizdatacrypt"
)

func main() {
   appID := "wx33f640141e02040e"
   sessionKey := `SE/BLocg+sMlvcKmxm8vQA==`
   encryptedData :="7SfFtStsHqKZYhbIkke3BH2bCRzGD15T0jEiUtuksrl9lDeHm9LsPmswJymBXuinPCiXkZhd/uq7s7pACTvbWuvvoKEwz5fAJ6Vr9bTx79XVxiIN4r+Fwm6QHO9DjPkFrxTGAZvMYLyH6IOyOV/nmmlMoBM3G4peSnBi1qCYukwlyCMNp67lb93wSiPAoI7eRhYYw8ayPTsZ/MAJ9CBBUiCwM5aFOUWrMKNTikeq7YVjNCv7KCz0LJTrMKda0YMS0J/034L8x9vJ1OnIkxlWVMQEy/f55IfWVHI1I1fSKd5azzyVKXCbWDpU0PLJnU8XM/l4L7ZUlDOcRMR5KQVGhB9rIjVkykdXUPQK87v8lpnitslK06XceOJqDjK6mRkhJWOYpFUozZa6idFV6xmLZX8bkBsLxczzp1h/satEH7rIz3nKbxd3O1c+3dI2soSt8qFtaumcGdwhenTm+at0gxccAp8JD8PZiB5ZDLTofZIQ4RmI004SIExYUDZUje9mZO+3aC8McVwzrEyK7NKD/NZ5/dYPgDRwzBl1Vm99niY="
   iv := "z3tGYrgMcbLzd0qXqZuduQ=="
   pc := wxbizdatacrypt.NewWXBizDataCrypt(appID, sessionKey)
   userInfo, err := pc.Decrypt(encryptedData, iv)
   if err != nil {
     fmt.Println(err.Error())
     return
   }
   fmt.Printf("userData:%+v", userInfo)
}

结果

golang如何实现对用户加密数据进行解密?

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文题目:golang如何实现对用户加密数据进行解密?-创新互联
分享URL:http://shouzuofang.com/article/ijjpc.html

其他资讯