golang 对字符串进行base64编解码、md5 编码

发布时间 2023-09-24 17:09:09作者: Lucky小黄人^_^

内容来自对 chagpt 的咨询

一、对字符串进行 base64 编解码

base64 编码

要在Go语言中对字符串进行base64编码,你可以使用标准库中的encoding/base64包。以下是一个简单的示例:

package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	data := "Hello, World!"
	encoded := base64.StdEncoding.EncodeToString([]byte(data))
	fmt.Println("Encoded:", encoded)
}

在Base64编码中,所有的字母数字都是安全的('A'到'Z','a'到'z'和'0'到'9')。但是,Base64有两个额外的字符:'+'和'/',它们在某些系统(例如URL)中可能并不安全。

因此,Base64提供了一个"URL和文件名安全"的变体Base64url(也称为URL安全的Base64),它使用"-"和"_"替换"+"和"/",消除了需要URL编码的需要。

这主要是在URL,Cookie,文件名等场景中使用Base64编码的时候需要考虑的问题,因为"+","/"和"="在这些环境中可能有特殊含义(例如URL中的路径分隔,查询字符串开始等)。

在Go语言中,可以使用base64.URLEncoding代替base64.StdEncoding达到URL安全的Base64编码,例如:

encodedURLSafe := base64.URLEncoding.EncodeToString([]byte(data))

或者先用 base64.StdEncoding 编码后,手动将 "+","/" 替换成 "-"和"_"

	data := "Hello, World!"
	encoded := base64.StdEncoding.EncodeToString([]byte(data))
	fmt.Println("Encoded:", encoded)
	encoded = strings.ReplaceAll(encoded, "/", "_")
	encoded = strings.ReplaceAll(encoded, "+", "-")
    fmt.Println("Encoded:", encoded)

base64 解码

如果使用 base64.StdEncoding.EncodeToString 进行编码,那么使用 base64.StdEncoding. DecodeString 进行解码;同理,如果使用 base64.URLEncoding.EncodeToString 进行编码,那么使用 base64.URLEncoding. DecodeString 进行解码;

package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
    // 需要进行编码的字符串
	data := "hello world"

	// 使用 base64.URLEncoding 对字符串进行 base64 编码
	encoded := base64.URLEncoding.EncodeToString([]byte(data))

	fmt.Println("Original String: ", data)
	fmt.Println("Base64 Encoded String: ", encoded)

	// 使用 base64.URLEncoding 进行解码
	decodedByte, err := base64.URLEncoding.DecodeString(encoded)
	if err != nil {
		log.Fatal("Decode Error:", err)
	}
	
	// 将字节切片转换为字符串
	decoded := string(decodedByte)
	fmt.Println("Base64 Decoded String: ", decoded)
}

二、md5 编码

在 Go 语言中,我们可以使用 crypto/md5 库来对字符串或其他数据进行 MD5 编码。以下是一个示例代码段:

package main

import (
	"crypto/md5"
	"fmt"
	"io"
)

func main() {
	data := "Hello, World"
	hash := md5.New()
	io.WriteString(hash, data)

	md5Code := fmt.Sprintf("%x", hash.Sum(nil))
	fmt.Println(md5Code)
}

在上面的代码中,我们首先导入了 crypto/md5 和 fmt 库。我们创建了一个新的 MD5 hash,并将要进行编码的数据(在这种情况下是字符串 "Hello, World")写入 hash 中。然后我们使用 Sum 函数得到编码后的数据,并将其转化为十六进制的字符串形式打印出来。

另一种简单形式

package main

import (
	"crypto/md5"
	"fmt"
	"io"
)

func main() {
	data := "Hello, World"
    fmt.Sprintf("%x", md5.Sum([]byte(data)))
}