我正在尝试将Node.js脚本转换为Golang。"error: illegal base64 data at input byte 40"但是,我在解码Base64时总是出错。可能有人帮助我,已经调试和阅读了几个小时的文档......需要帮助!// Node.js exampe (code copied from Facebook Instant game SDK example)const CryptoJS = require('crypto-js');var firstpart = signedRequest.split('.')[0];firstpart = firstpart.replace(/-/g, '+').replace(/_/g, '/');const signature = CryptoJS.enc.Base64.parse(firstpart).toString(); // <-- fail hereconst dataHash = CryptoJS.HmacSHA256(signedRequest.split('.')[1], '<APP_SECRET>').toString();var isValid = signature === dataHash;const json = CryptoJS.enc.Base64.parse(signedRequest.split('.')[1]).toString(CryptoJS.enc.Utf8);const data = JSON.parse(json);上面的代码是来自 Facebook 的示例代码,下面的代码(下)是我写的。 parts := strings.Split(signedRequest, ".") firstPart := parts[0] replaced := strings.Replace(firstPart, "-", "+", -1) replaced = strings.Replace(replaced, "_", "/", -1) signatureByte, err := base64.StdEncoding.DecodeString(replaced) // <-- ERROR here if err != nil { fmt.Println("error:", err) return false, err } signature := string(signatureByte) dataHash := createHmacSHA256(parts[1], "<APP_SECRET>") // TODO: not sure, to string or hex string? isValid := signature == dataHash if isValid { return true, nil }Go Playground 在这里https://play.golang.org/p/ilSbqamFdV_-
1 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
首先,去掉strings.Replaces 而只使用base64.URLEncoding而不是StdEncoding,因为 URL 字母表显然是您的数据所在。
此外,标准 base64 数据已填充,但您的数据未填充,因此您需要“原始”编码,即base64.RawURLEncoding. 这有效:
firstPart := parts[0]
signatureByte, err := base64.RawURLEncoding.DecodeString(firstPart)
https://play.golang.org/p/Pj_LLfirU8M
有关更多信息,请参阅base64包文档和base64 标准。
- 1 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消