string - 用空格解码base64

标签 string go base64 url-encoding

我有一个 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/

相关文章:

python b64decode不正确的填充

macos - base64 在 Mac 中没有 -w 选项

c++ - 将 double 字符串转换为 double vector 的最佳方法是什么?

java - Java 字符串搜索模式问题(包含/匹配)

go - 如何干净地处理结构状态的错误?

java - 将PDF转换为Base64并将数据存储到数据库的BLOB

python:在某个值之前将字符串列表拆分为多个列表

java - 检查字符串是否包含\n Java

javascript - golang 在呈现模板时包含 javascript 文件

go - golang 中的终端 : syscall vs os/exec stty