首页 > 其他分享 >go md5加密

go md5加密

时间:2023-01-22 16:44:07浏览次数:39  
标签:hash 16 Sum go Hash md5 加密

本文讲解如何使用go封装好的md5算法,不深入剖析md5算法原理。 首先我们要知道md5算法属于hash算法的一种,所以在了解md5之前,我们先认识一下go提供的hash接口。hash算法是保证只要输入的值不同,就一定会得到两个不同的指定长度的hash值。当前两个不同值产生相同的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进制
  fmt.Println(hex.EncodeToString(b)) // 通过hex包的EncodeToString函数,将数据转为16进制字符串; 打印 e99a18c428cb38d5f260853678922e03

  // 还有一种方法转换为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"
  "fmt"
)

func main() {

  b := md5.Sum([]byte("abc123")) // 加密数据
  fmt.Printf("%x",b) // 转换为16进制,并打印
}

这二种方法都可以md5加密数据,甚至后者更加简洁

 

 

标签:hash,16,Sum,go,Hash,md5,加密
From: https://www.cnblogs.com/dadishi/p/17064495.html

相关文章

  • 【算法-堆排序】Go语言实现
    堆排序通过数组构造堆,根节点是最大的元素是大根堆,相反为小根堆主要有俩个方法,插入InsertHeap,调整堆:heapify对于排序来说:先把数组构造成一个大根堆,然后[0]依次......
  • 1582_C代码实现的快速、可移植MD5信息摘要算法
    全部学习汇总:​​GreyZhang/c_units:Asmallpieceofcodewhichcanbereuseanywhere,Icallitaunit.ThisisacollectionofunitinClanguage!Ok,yes,it......
  • 11 break、continue、goto
    #break、continue、gotopackagecom.zhan.base_2;publicclassTest11{publicstaticvoidmain(String[]args){//continue语句:跳出本次循环,直......
  • 归并排序和快速排序补充扩展-Go语言
    基于堆排序的算法题小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。就是在合并的时候,当左边数组的数小于右边数组的......
  • A. Everybody Likes Good Arrays!【Codeforces Round #845 (Div. 2) 】
    A.EverybodyLikesGoodArrays!原题链接Anarrayaisgoodifforallpairsofadjacentelements【相邻元素】,aiandai+1(1≤i<n)areofdifferentparity【奇......
  • go语言学习笔记【一】
    一、初入GO语言我们先还是看看GO语言的helloworld是怎么写的吧packagemainimport"fmt"funcmain(){fmt.Println("Helloworld!")}第一行:包声明,编写源文件时,必须......
  • sql base nodejs py go操作基本的db
    constmysql=require('mysql2');constconnection=mysql.createConnection({host:'localhost',user:'root',password:'root',database:'mybatis_pl......
  • Django书籍学习记录
    没有记录回顾的学习都是白学,那天偶尔搜到这本书,其中除了一部分官网的中文翻译,还有一些没有了解到的地方,比如模型查询filter的链式调用,Q.F方法在定义化SQL中起到的作......
  • 【QOJ 4273】Good Game(分类讨论)(构造)
    GoodGame题目链接:QOJ4273题目大意给你一个01串,每次可以删一个长度为2/3的全0子串或者全1子串。要你构造一种方法把串删空,或者输出无解。思路首先发现这个......
  • 鹅鸭杀goose goose duck注册教程2023
    《鹅鸭杀》是GaggleStudios开发的策略休闲游戏,于2021年10月4日在Steam平台上发布。 这是一款带有社交性质的游戏,具体玩法类似升级版的狼人杀。要注册Gaggle.fun账号,请......