在golang(appengine)上进行无填充的Base64编码/解码

9

有没有一种方法可以将字符串编码/解码为Base64而不需要在结尾添加填充?我的意思是指“==”结尾。

我正在使用base64.URLEncoding.EncodeToString进行编码,它完美地工作,但我没发现有办法决定不使用结尾的填充(就像Java中的情况)。

4个回答

21

Go1.5将在Encoding中添加一个WithPadding选项。

这还将添加2个预定义的编码,RawStdEncodingRawURLEncoding,它们没有填充。

虽然由于您在app-engine上,并且暂时无法使用Go1.5,但可以编写一些帮助函数根据需要添加和删除填充。

以下是一个示例,用于对字符串进行编码和解码。如果需要,可以轻松地适应使用[]byte更有效地工作。

func base64EncodeStripped(s string) string {
    encoded := base64.StdEncoding.EncodeToString([]byte(s))
    return strings.TrimRight(encoded, "=")
}

func base64DecodeStripped(s string) (string, error) {
    if i := len(s) % 4; i != 0 {
        s += strings.Repeat("=", 4-i)
    }
    decoded, err := base64.StdEncoding.DecodeString(s)
    return string(decoded), err
}

9
简单来说,使用 base64.RawStdEncoding.EncodeToString 来代替 base64.StdEncoding.EncodeToString
或者使用 base64.RawURLEncoding.EncodeToString 来代替 base64.URLEncoding.EncodeToString
参考:查看源代码注释第 94 至 110 行
// RawURLEncoding is the unpadded alternate base64 encoding defined in RFC 4648.
// It is typically used in URLs and file names.
// This is the same as URLEncoding but omits padding characters.

请注意,如果已经添加了填充,则RawURLEncoding将无法解码。因此,为了安全起见,您必须删除填充,例如base64.RawURLEncoding.DecodeString(strings.TrimRight(encryptedPrice, "=")) - Sergey Ponomarev

0
为了在golang中省略base64编码的填充字符并使结果在URL中安全,您可以使用以下方法:
value := base64.RawURLEncoding.EncodeToString(bytes)

RawURLEncoding是在RFC 4648中定义的未填充的替代base64编码。它通常用于URL和文件名。这与URLEncoding相同,但省略了填充字符。

https://pkg.go.dev/encoding/base64


0

进行编码:

str := "encode this"
encodedStr := base64.StdEncoding.
    WithPadding(base64.NoPadding).
    EncodeToString([]byte(str))

fmt.Println(encodedStr)

解码:

data, err := base64.
    StdEncoding.WithPadding(base64.NoPadding).
    DecodeString(encodedStr)

if err != nil {
    fmt.Println(err)
}

fmt.Println(string(data))

Go Playground: https://go.dev/play/p/TAZgLMSSe-K

Go Playground:https://go.dev/play/p/TAZgLMSSe-K


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接