golang 对字符串进行base64编解码、md5 编码
  f6j0WN1M39I3 2023年11月19日 16 0

内容来自对 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)))
}

使用md5编码后有可能重复吗

在入内容没有任何改变,每次生成的MD5值都是一样的。但是如果输入内容发生变化,那么发生编码后发生碰撞的概率非常低,但是有可能存在。

MD5编码算法生成的结果是固定的32位十六进制数。理论上,有大约340万亿亿亿亿的可能结果(16的32次方)。

然而,由于这个结果空间是有限的,而可能的输入是无限的,所以理论上讲,可能会存在两个不同的输入有相同的MD5编码。这被称为"碰撞"。

实际上,已经存在一些已知的MD5碰撞示例。(这些找到 MD5 碰撞的示例并非自然产生,而是通过密集计算和某些已知的 MD5 弱点才找出来的。)因此,虽然MD5通常适用于检查数据完整性(例如,验证文件下载是否成功),但已经不推荐用于需要高安全性的环境,如SSL证书和密码存储等。

如果你需要一个更安全的哈希算法,你或许应该使用SHA-256或SHA-3。



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
f6j0WN1M39I3