1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| var ( ErrIllegalBuffer = errors.New("解密后的数据非法") )
type WXBizDataCrypt struct { appID string sessionKey string }
type UserInfo struct { OpenID string `json:"openId"` NickName string `json:"nickName"` Gender int `json:"gender"` City string `json:"city"` Province string `json:"province"` Country string `json:"country"` AvatarUrl string `json:"avatarUrl"` UnionID string `json:"unionId"` PhoneNumber string `json:"phoneNumber"` PurePhoneNumber string `json:"purePhoneNumber"` CountryCode string `json:"countryCode"` WaterMark WaterMark `json:"watermark"` }
type WaterMark struct { AppID string `json:"appid"` Timestamp int64 `json:"timestamp"` }
func NewDataCrypt(appID, sessionKey string) *WXBizDataCrypt { return &WXBizDataCrypt{ appID: appID, sessionKey: sessionKey, } }
func (c *WXBizDataCrypt) Decrypt(encryptedData, iv string) (*UserInfo, error) { aesKey, err := base64.StdEncoding.DecodeString(c.sessionKey) if err != nil { return nil, err } aesIV, err := base64.StdEncoding.DecodeString(iv) if err != nil { return nil, err } aesCipher, err := base64.StdEncoding.DecodeString(encryptedData) if err != nil { return nil, err } cipherBlock, err := aes.NewCipher(aesKey) if err != nil { return nil, err } cipher.NewCBCDecrypter(cipherBlock, aesIV).CryptBlocks(aesCipher, aesCipher) decrypted := c.pkcs7UnPadding(aesCipher) var userInfo UserInfo if err = json.Unmarshal(decrypted, &userInfo); err != nil { return nil, ErrIllegalBuffer } if c.appID != userInfo.WaterMark.AppID { return nil, ErrIllegalBuffer } return &userInfo, nil }
func (c *WXBizDataCrypt) pkcs7UnPadding(data []byte) { length := len(data) unPadding := int(data[length-1]) return data[:(length - unPadding)] }
|