From 823c54fda5b838940e29b021f74a8ab4f18a89c1 Mon Sep 17 00:00:00 2001 From: JefferyWang Date: Wed, 10 Apr 2019 17:26:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE=E8=A7=A3=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miniprogram/decrypt.go | 93 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 miniprogram/decrypt.go diff --git a/miniprogram/decrypt.go b/miniprogram/decrypt.go new file mode 100644 index 0000000..6897368 --- /dev/null +++ b/miniprogram/decrypt.go @@ -0,0 +1,93 @@ +package miniprogram + +import ( + "crypto/aes" + "crypto/cipher" + "encoding/base64" + "encoding/json" + "errors" +) + +var ( + // ErrAppIDNotMatch appid不匹配 + ErrAppIDNotMatch = errors.New("app id not match") + // ErrInvalidBlockSize block size不合法 + ErrInvalidBlockSize = errors.New("invalid block size") + // ErrInvalidPKCS7Data PKCS7数据不合法 + ErrInvalidPKCS7Data = errors.New("invalid PKCS7 data") + // ErrInvalidPKCS7Padding 输入padding失败 + ErrInvalidPKCS7Padding = errors.New("invalid padding on input") +) + +// UserInfo 用户信息 +type UserInfo 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"` +} + +// 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 +} + +// Decrypt 解密数据 +func (wxa *MiniProgram) Decrypt(sessionKey, encryptedData, iv string) (*UserInfo, error) { + aesKey, err := base64.StdEncoding.DecodeString(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 UserInfo + err = json.Unmarshal(cipherText, &userInfo) + if err != nil { + return nil, err + } + if userInfo.Watermark.AppID != wxa.AppID { + return nil, ErrAppIDNotMatch + } + return &userInfo, nil +}