我有一个 base64 编码的字符串,我正试图用 go 解密。该字符串包含应忽略的空格。 我正在尝试的示例代码:
s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"
out, err := base64.URLEncoding.DecodeString(s)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(out))
此代码返回:
illegal base64 data at input byte 93
更改字符串填充并使用 StdEncoding 代替 URLEncoding 后:
s= strings.Replace(s, "%3D", "=", -1)
out, err := base64.StdEncoding.DecodeString(s)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(out))
输出将是:
{"threeDSServerTransID":"13fe71d4-d10d-4220-a216-2006d1dd4cb8","acsTrc���������������������������������������������������������������������������nsID":"d7c45f99-9478-44a6-b1f2-100000003366","messageType":"CReq","messageVersion":"2.1.0","challengeWindowSize":"02"}
如何正确解密字符串?
最佳答案
您所拥有的很可能是从 URL 中“截断”出来的,并且是 URL 编码形式。所以要得到一个 Base64 字符串,你必须先解码它,你可以使用 url.PathUnescape()
为此。
获得未转义的字符串后,您可以使用 base64.StdEncoding
编码器对其进行解码。请注意,仅仅因为它是/是 URL 的一部分,并不能使它成为使用 Base64 的 URL 安全版本的字母表的 base64 字符串。
此外,它中间的 +
符号实际上只是“垃圾”。它们一开始就不应该存在,因此请仔细检查您是如何获得输入的,但既然它们存在,您就必须删除它们。为此,您可以使用 strings.Replace()
.
解码无效输入的最终代码:
s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"
s = strings.Replace(s, "+", "", -1)
var err error
if s, err = url.PathUnescape(s); err != nil {
panic(err)
}
out, err := base64.StdEncoding.DecodeString(s)
if err != nil {
panic(err)
}
fmt.Println(string(out))
完整输出(在 Go Playground 上尝试):
{"threeDSServerTransID":"13fe71d4-d10d-4220-a216-2006d1dd4cb8",
"acsTransID":"d7c45f99-9478-44a6-b1f2-100000003366","messageType":"CReq",
"messageVersion":"2.1.0","challengeWindowSize":"02"}
请注意,+
符号是标准 Base64 字母表中的有效符号,您甚至可以在不删除 +
符号的情况下解码 Base64,但随后您获取结果中 JSON 键中剩余的垃圾数据。
关于string - 用空格解码base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52094925/