crypto/md5

先认识go的hash接口(位于go标准库-hash包):

type Hash interface {
    // 通过io.Writer接口的Write方法向hash中添加数据
    io.Writer
    // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态,这个方法就是返回计算后的hash值,只是它是字符切片
    Sum(b []byte) []byte
    // 重设hash为无数据输入的状态,就是清空hash之前写入的数据
    Reset()
    // 返回Sum会返回的切片的长度
    Size() int
    // 返回hash底层的块大小;Write方法可以接受任何大小的数据,
    // 但提供的数据是块大小的倍数时效率更高
    BlockSize() int
}

crypto/md5包实现的就是这个Hash接口。

Hash包还有两个Hash接口:

type Hash32 interface { // Hash32是一个被所有32位hash函数实现的公共接口。
    Hash
    Sum32() uint32
}
type Hash64 interface { // Hash64是一个被所有64位hash函数实现的公共接口。
    Hash
    Sum64() uint64
}

md5实现的第一个Hash接口是16位的hash函数(它的Sum方法返回的字符切片长度为16位),Hash32和hash64是属于安全性更高的两个Hash函数,产生的hash值也更长。

下面来看md5算法:
crypto/md5包提供了一个方法创建md5算法:

func New() hash.Hash => 返回一个新的使用MD5校验的hash.Hash接口
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
)

func main() {
	has := md5.New()   // 创建md5 算法
	has.Write([]byte("abc123"))  // 写入需要加密的数据
	b := has.Sum(nil)  // 获取hash值字符切片;Sum函数接受一个字符切片,这个切片的内容会原样的追加到abc123加密后的hash值的前面,这里我们不需要这么做,所以传入nil
	fmt.Println(b) // 打印一下 [233 154 24 196 40 203 56 213 242 96 133 54 120 146 46 3]
	// 上面可以看到加密后的数据为长度为16位的字符切片,一般我们会把它转为16进制,方便存储和传播,下一步转换16进制
	// 通过hex包的EncodeToString函数,将数据转为16进制字符串; 打印 e99a18c428cb38d5f260853678922e03
	fmt.Println(hex.EncodeToString(b))
	// 还有一种方法转换为16进制,通过fmt的格式化打印方法, %x表示转换为16进制
	fmt.Printf("%x",b)  // 打印 e99a18c428cb38d5f260853678922e03
}

crypto/md5包还提供了一个md5加密简便的方法:

func Sum(data []byte) [Size]byte 
=> 直接返回数据data的MD5加密值,注意它返回的是指定大小(Size)的数组,而不是切片了
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
)

func main() {
	has := md5.New()   // 创建md5 算法
	has.Write([]byte("abc123"))  // 写入需要加密的数据
	b := has.Sum(nil)  // 获取hash值字符切片;Sum函数接受一个字符切片,这个切片的内容会原样的追加到abc123加密后的hash值的前面,这里我们不需要这么做,所以传入nil
	fmt.Println(b) // 打印一下 [233 154 24 196 40 203 56 213 242 96 133 54 120 146 46 3]
	// 上面可以看到加密后的数据为长度为16位的字符切片,一般我们会把它转为16进制,方便存储和传播,下一步转换16进制
	// 通过hex包的EncodeToString函数,将数据转为16进制字符串; 打印 e99a18c428cb38d5f260853678922e03
	fmt.Println(hex.EncodeToString(b))
	// 还有一种方法转换为16进制,通过fmt的格式化打印方法, %x表示转换为16进制
	fmt.Printf("%x\n",b)  // 打印 e99a18c428cb38d5f260853678922e03

	fmt.Println("-----------------")

	has2 := md5.New()
	has.Write([]byte("abc123"))
	b2 := has2.Sum([]byte("ddd"))
	fmt.Println(b2)
	fmt.Println(hex.EncodeToString(b2))
	fmt.Printf("%x\n",b2)

	fmt.Println("-----------------")

	bb := md5.Sum([]byte("abc123"))   // 加密数据
	fmt.Printf("%T,  %x\n",bb,bb)      // 转换为16进制,并打印
	bbres := hex.EncodeToString(bb[:])   // 这里直接写 bb:Cannot use 'bb' (type [16]byte) as type []byte
	fmt.Printf("%T,     %v\n",bbres,bbres)
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值