Go md5加密&SHA-256&SHA-3

打开 golang 包对应的网站: https://pkg.go.dev/,搜索 md5

MD5

 查看Example

 

func New hash.Hash

 案例一:Example

package main

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

func main() {
	h := md5.New()
	//两个字符串的内容会被合并在一起进行哈希计算
	io.WriteString(h, "这是加密的字符串")  //将字符串写入到哈希对象中
	io.WriteString(h, "这也是加密的字符串") //将字符串写入到哈希对象中

    ...//可以多个加密串

	fmt.Printf("%x", h.Sum(nil))   //调用h.Sum(nil)获取当前哈希计算的最终结果
}

 这段Go代码主要用于计算两个字符串连接后生成的MD5哈希值。具体步骤如下:

  1. 通过md5.New()初始化一个MD5哈希对象h

  2. 使用io.WriteString(h, "这是加密的字符串")向哈希对象h写入字符串"这是加密的字符串",这一操作会根据输入数据更新哈希对象的内部状态。

  3. 接着,用相似的方式通过io.WriteString(h, "这也是加密的字符串")将另一字符串"这也是加密的字符串"写入到哈希对象中。这两个字符串的内容会被合并在一起进行哈希计算,而不是分别计算。

  4. 最后,通过调用h.Sum(nil)获取当前哈希计算的最终结果(以字节形式),并使用fmt.Printf%x格式化该字节切片为十六进制字符串输出。

如果运行此代码,它将输出一个类似于这样的MD5哈希值(实际值会根据内容确定):

1c9f0f895fb98ab9159f51fd8169c5a4d

需要注意的是,MD5因存在安全漏洞,特别是容易受到碰撞攻击,所以不建议用于加密或安全验证等场景。现在多用于校验和或兼容旧系统。对于安全哈希需求,推荐使用SHA-256或更新的算法。

  案例二:Example (File)

package main

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

func main() {
	//获取文件内容
	f, err := os.Open("file.txt")//123456
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close() //最后关闭IO流

	h := md5.New()
	if _, err := io.Copy(h, f); err != nil {
		log.Fatal(err)
	}

    //e10adc3949ba59abbe56e057f20f883e
	fmt.Printf("%x", h.Sum(nil))
}

 func Sum

Example

package main

import (
	"crypto/md5"
	"fmt"
)

func main() {
	data := []byte("123456")
    //e10adc3949ba59abbe56e057f20f883e
	fmt.Printf("%x", md5.Sum(data))
}

 sha-256

SHA256 软件包 - crypto/sha256 - Go 软件包

方式一

 如果你需要逐步处理大量数据或流式数据的哈希计算,第一种方法(使用Write)更加灵活和高效,因为它允许你分批处理数据

package main

import (
	"crypto/sha256"
	"fmt"
)

func main() {
	// h := sha256.New() 创建了一个SHA-256哈希对象,然后通过h.Write([]byte("123456"))分步写入数据,最后使用h.Sum(nil)获得哈希值
	// 如果你需要逐步处理大量数据或流式数据的哈希计算,第一种方法(使用Write)更加灵活和高效,因为它允许你分批处理数据。
	h := sha256.New()
	h.Write([]byte("123456"))
	h.Write([]byte("123456"))
	fmt.Printf("%x", h.Sum(nil))
}

方式二 

 直接Sum256)更适用于一次性处理较小或单一的数据块,代码更为简洁

package main

import (
	"crypto/sha256"
	"fmt"
)

func main() {
    // hash := sha256.Sum256(data)一步到位计算出哈希值,其中data是事先准备好的字节切片
	// 直接Sum256)更适用于一次性处理较小或单一的数据块,代码更为简洁
	data := []byte("123456")
	hash := sha256.Sum256(data)
	fmt.Printf("%x", hash)
}

 SHA-3系列(如SHA3-256)

 SHA-3是继SHA-2之后的新一代安全哈希算法标准,提供更好的抗分析特性。在Go中,通过golang.org/x/crypto/sha3包使用。

package main

import (
	"fmt"
	"golang.org/x/crypto/sha3"
)

func main() {
	//方式一
	h := sha3.New256()
	h.Write([]byte("123456"))
	h.Write([]byte("123456"))
	fmt.Printf("%x", h.Sum(nil))

	//方式二
	data := []byte("123456")
	hash := sha3.Sum256(data)
	fmt.Printf("%x", hash)
}

 第三方及存储密码

  1. Blake2: Blake2是一种高效的哈希函数,设计时就注重了速度和安全性。Go标准库并未直接包含Blake2,但你可以使用第三方库,如github.com/minio/blake2b-simd

  2. bcrypt: 对于密码存储,bcrypt是一种专为此目的设计的算法,它通过增加计算成本来抵抗暴力破解。Go中可使用golang.org/x/crypto/bcrypt包。

    package main
    
    import (
    	"fmt"
    	"golang.org/x/crypto/bcrypt"
    )
    
    func main() {
    	password := []byte("123456")
    	hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
    	if err != nil {
    		panic(err)
    	}
    
    	fmt.Printf("%x", hashedPassword)
    }
    

选择哪种算法取决于具体应用场景,但出于安全考虑,通常推荐至少使用SHA-256或SHA-3,而对于存储用户密码,则推荐使用bcrypt或类似的专为密码存储设计的算法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值