为了账号安全,请及时绑定邮箱和手机立即绑定

Golang Base64 签名验证 VS CryptoJS

Golang Base64 签名验证 VS CryptoJS

Go
动漫人物 2022-05-23 17:01:28
我正在尝试将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 标准。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信