Golang Base64签名验证VS CryptoJS



我正在尝试Node.js脚本转换为Golang。然而,在解码Base64时,我总是得到错误"error: illegal base64 data at input byte 40"。可能有人帮我,已经调试和阅读了几个小时的文档。。。需要帮助!

// 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 here
const 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
}

围棋游戏场就在这里https://play.golang.org/p/ilSbqamFdV_-

首先,去掉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标准。

最新更新