Golang计算MD5

golang学习笔记25——golang 实现 MD5加密、RSA加密 和 Base64编码 通过以上内容,我们详细介绍了在 Go 语言中实现 MD5 哈希、RSA 加密以及 Base64 编码的方法,并给出了相应的代码示例。这些加密和编码技术在实际开发中具有广泛的应用,开发者可以根据具体需求灵活运用。以上文章内容可以根据你的实际需求进行调整,希望对你有所帮助。 阅读详情

Golang计算MD5

1.单向加密

什么是单向加密算法。简而言之就是不可解密的加密方法,也叫作非可逆加密。这些学术 解释都不用管它,反正就是一群数学家老爷爷通过各种证明得到的一种方法,用这种方法加密 过的东西,地球上现有的人类在有限的时间内是无法解密的,包括加密者自己。既然加密者自己 都无法解密,那这乖僻的加密算法有个毛用阿?哪些场景需要这种有去无回的加密方式呢?

这里先了解下单向加密的特征: 首先,不可解密性在上面已经提到了,目的就是掩藏明文。其次单向加密算法的另外两个特征 使得它更接地气,第一是任意两段明文数据,加密以后的密文不能是相同的; 第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。这样当我们需要表征一段 唯一的内容,但是有不想别人知道该段内容时或者仅仅是为一个内容打上一个唯一的ID时,就可以 尝试下单向加密算法。

比如,如果想对一段内容做缓存操作,为了更快的找到其内容,使用K-V的存储方式。那么该如何 构建Key呢?当然有很多方法,比如时间。通过上面“"不同明文加密结果不同"特征,我们可以 用对该内容作单向加密,然后用加密结果做为key。又比如在用户登陆的场景中,害怕别人通过劫 包的方式获取用户秘密,我们可以将该秘密进行单向加密存放到数据库中,之后的验证都对用户 输入的秘密进行单向加密,确保其在传输过程中“"不可见"。

那么常用的单向加密算法有哪些呢? 主要有:BASE64、MD5、SHA、HMAC,其中最为常见的就有MD5,BASE64。这里我们主要介绍最常 使用的MD5算法。该算法可以用来得到一个128bit的值,既可以作为K-V中的key,也可以对密码 进行加密从而确保其在传输中"不可见"。

2.经典的MD5API

在C系列中计算MD5的API一般有如下几个API构成。

  • init :获得一个md5上下文
  • append/update : 添加明文,可以多次添加
  • final: 执行计算操作
  • digest/hex_digest: 获得加密结果,结果为128bit内存值或者其32个16进制表示法。

Python的标准库中也是提供了这几个API,除此之外还提供了一个直接从文件中获得明文计算MD5的 方法

3.Golang的"crypto/md5"

Golang的加密库都放在crypto目录下,其中MD5库在crypto/md5包中,该包主要提供了New和Sum函数。 乍一看和以往的使用不太一样。但是看完例子后发现,其宗旨还是一样的,都是先创建一个MD5对象, 然后更新明文,接着加密输出,最后打扫战场。

先看个示例:

package main

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

func main(){

    md5Ctx := md5.New()
    md5Ctx.Write([]byte("test md5 encrypto"))
    cipherStr := md5Ctx.Sum(nil)
    fmt.Print(cipherStr)
    fmt.Print("\n")
    fmt.Print(hex.EncodeToString(cipherStr))
}

这里直接对一串字符串计算MD5。其中通过md5.New()初始化一个MD5对象,其实它是一个hash.Hash对象。 函数原型为 func New() hash.Hash 。该对象实现了hash.Hash的Sum接口:计算出校验和。其函数原型 为 func Sum(data []byte) [Size]byte 这里的官方Manual对其的描述我感觉有点问题。其官方描述为: " Sum returns the MD5 checksum of the data. "

通过翻阅源码可以看到他并不是对data进行校验计算,而是对hash.Hash对象内部存储的内容进行校验和 计算然后将其追加到data的后面形成一个新的byte切片。因此通常的使用方法就是将data置为nil

该方法返回一个Size大小的byte数组,对于MD5来说就是一个128bit的16字节byte数组。这里通过 []byte() 将一个字符串转换成byte数组,还可以通过byte的其他接口进行转换,Write方法在下面进行 说明。 hash.Hash对象内的存储内容进行校验和计算。那这个存储内容是放在哪呢?通过Golang标准库的代码 md5.go,可以找到

type digest struct {
    s   [4]uint32
    x   [chunk]byte
    nx  int
    len uint64
}

这样的类型。其内容就存在64字节的byte数组中。

4.明文接口

hash.Hash继承了io.Write。因此可以将其当成一个输入流进行内容的更新。上面已经看到了Write方法, 这里对其进行详细介绍。该方法是从io.Write继承而来,确切的说是继承了一个接口,然后去实现它。 函数原型为: Write(p []byte) (n int, err error) ,将p中的内容读入并进行计算后存入到上面 digest的byte内存x中去。最后通过内部函数checkSum计算出其校验和。

因此我们可以将Write方法看成是C系中的Update方法。Sum看成是Final方法。从上我们看到其结构为 128bit的内存表示法。那如何得到其32字节的16进制表示法呢?这里我们可以使用encoding/hex包中的 EncodeToString方法对其进行编码.函数原型为 func EncodeToString(src []byte) string 直接 将Sum的返回结果给到src即可。这样我们就可以进行简单的对应来快速熟悉Golang的MD5接口操作了:

init()       -- vs --   md5.New()
update()     -- vs --   md5Ctx.Write()
final()      -- vs --   md5Ctx.Sum(nil)
hex_digest() -- vs --   hex.EncodeToString()

有了这几个接口,就可以很方便的自己包装一个对文件计算md5值的接口了。


原文链接:http://blog.youkuaiyun.com/cz_it/article/details/24733773

Golang实现Md5校验 最近项目中有个需求,就是地图文件下发后,接收方需要文件的md5值,和接收到的文件做比对,以免文件不完整,引起bug,于是测试了下本地文件和远程文件的md5计算。 阅读详情

相关推荐

goalng中md5算法的4种写法及其性能比较以及源码简单分析

md5算法全称Message Digest Algorithm 5,中文名消息摘要算法第五版,主要用于文件或数据的完整性校验。我们在日常的研发中通常会见到32位的字符串。 md5算法具有以下特点:在golang中,我们可以通过crypto/md5 来直接调用md5算法。 常见的调用方式有以下四种: 我们通过基准测试(benchmark)来比较四种写法的性能。 我们可以看出方法4的性能最优,因此我们更推荐这种写法。我们有时候还需要面对下载大文件的情况,而此时我们可以考虑分块计算,从而降低时间消耗。 4. cr

weixin_43915303的博客 1728

golang中的MD5哈希算法

golang中的MD5是由 crypto/md5 包来提供的。 md5 包导出两个方法 func New() hash.Hash func Sum(data []byte) [Size]byte Size 为16,意味着返回的加密结果为长度是16个字节的数组,即128位的二进制数,每一个字节可以由2个16进制的字符来表示,于是 md5 的结果一般是由32位的16进制字符来表示(0-9,a-f)。 1、简单的md5 re := md5.Sum([]byte("123456")) fmt.Printf("%

猛犸象 1万+

[Golang]计算一个文件的MD5值

说明 在实际的开发过程中,总需要对文件进行md5加密的需求,在开发过程中,我就遇到了将表单文件MD5后再存储本地的需求。 解决 MD5的所需要的包在”crypto/md5”包中,需要先实例化一个MD5对象,然后在此基础上调用sum方法即可 md5 := md5.New() io.Copy(md5,file) MD5Str := hex.EncodeToString(md...

坚持不懈 1万+

Golang加密md5

go语言内置的crypto/md5包,提供了md5加密处理的函数库,下面介绍golang如何进行md5加密。 例子: package main import ( "crypto/md5" "fmt" ) func main() { // 待加密字符串 s := "https://space.bilibili.com/480883651" // 进行md5加密,因为Sum函数接受的是字节数组,因此需要注意类型转换 srcCode := md5.Sum([]byte(s)) // md5.

坚果的博客 6673

go语言之计算文件md5

【代码】go语言之计算文件md5。

我不是码农的博客~~~ 395

【go】并发实现文件下载并计算md5

上一篇文章中通过python的多进程和协程实现了多文件下载并计算md5的需求,最近接触了go语言,这篇文章就简单介绍下怎么通过go实现同样的需求。 go语言原生支持的高并发:Goroutine 和 Channel。具体的原理可以参考:https://studygolang.com/articles/11825。实现并发的方式非常简单,直接通过go关键字,后面加上要并发执行的代码(一般就是一个函数)。 代码示例: package main import ( "bufio" "crypto/md5" "

每天进步一点点 990

golang 文件md5_使用Go语言完成文件夹的MD5计算

案例需求:我们的监测系统会定期的检查配置文件的变动,这些配置文件放置在一个独立的文件夹下面,我们可以通过对于整个的文件夹内所有文件进行md5的计算来完成监测,本文就通过Go语言实现了一个命令行工具,完成上述的需求。1. 单一文件的md5计算我们首先将需求任务进行分解,既然需要计算文件夹下的所有文件md5值,我们必须先考虑如何实现单一文件的md5值计算。下面就是一个简单的md5求值程序,这里我们通过...

weixin_28795271的博客 1325

Nexus3国内高速下载指南:多版本全平台资源汇总

本文针对国内开发者从官网下载Nexus 3速度慢、易失败的问题,提供了详尽的解决方案。汇总了Windows、Linux、macOS等多个平台的Nexus 3历史及最新版本(如3.31.1)的国内高速下载链接,并附有版本选择建议与Linux环境下的快速启动指南,帮助用户高效获取和部署这一流行的仓库管理工具。

jwt8token的博客 431

golang 文件md5_golang 计算大文件md5

以前介绍过用python 计算大文件的md5 值,这里将介绍使用 golang 计算大文件md5还是使用分片计算的方法package mainimport ("crypto/md5""flag""fmt""io""math""os""time")const filechunk = 8192 // we settle for 8KB 8192var file_src *string = flag.S...

weixin_35519827的博客 1388

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5720

从零开始:用ADS 2023手把手教你设计2.4GHz Wi-Fi LNA(基于ATF-54143,附模型文件)

本文详细介绍了如何使用ADS 2023软件设计2.4GHz Wi-Fi频段的低噪声放大器(LNA),基于ATF-54143晶体管。内容涵盖模型导入、直流工作点确定、稳定性优化、噪声匹配等关键步骤,并提供可下载的模型文件包,帮助工程师快速掌握LNA设计技巧。

weixin_42531128的博客 319

Golang 计算MD5值

Golang 计算MD5值 关键词:golang 计算 md5 文件 字符串 代码 //MD5 func Md5SmallFile(path string) (string, error) { file, err := os.Open(path) if err != nil { return "", err } defer file.Close() h := md5.New() _, err = io.Copy(h, file) if err !

RunFromHere的博客 1476

不止于连接:用VS Code Remote-SSH深度开发树莓派(Ubuntu 22.04环境实战)

本文详细介绍了如何在Ubuntu 22.04环境下使用VS Code的Remote-SSH功能进行树莓派深度开发。通过SSH配置、VS Code扩展安装和远程环境优化,开发者可以在本地高效编写代码,同时在树莓派上直接运行和测试,解决性能瓶颈问题。文章还提供了高级功能如端口转发、多项目管理和远程调试的实战技巧。

didui8202的博客 352

golang 文件md5_GoLang 计算小文件和大文件 md5 值的例子

下面是GoLang 计算小文件或大文件 md5 值的例子package mainimport ("crypto/md5""fmt""io""os")func main() {testFile := "/path/to/file"file, err := os.Open(testFile)if err != nil {fmt.Println(err)return}md5h := md5.New()i...

weixin_39971138的博客 497

企业多部门网络隔离实战:用华为交换机VLAN+Trunk实现行政/技术部安全隔离

本文详细介绍了如何利用华为交换机的VLAN划分与Trunk链路技术,实现企业行政与技术部门间的网络逻辑隔离。通过具体的配置案例,阐述了Access与Trunk端口的工作原理、单交换机与多交换机环境下的部署策略,并延伸至三层网关部署与ACL访问控制,为企业构建安全、高效的核心网络提供实战指导。

p4q5r6s7t的博客 577

如何使用ArcGIS自动矢量化建筑

在显示的重分类对话框内,输入栅格选择提取单波段后的栅格,重分类分为三个层级,旧值分别为100-249、250-251和252-255,对应新值为1、2和3,旧值的最小和最大值不用修改,保持和原有的一致。同样在ArcToolbox内点击Spatial Analyst工具点击“重分类\重分类”,在重分类对话框内输入栅格选择之前重分类过后的图片,将旧值3的新值设置为1,这样分类后就只有两类。在显示的新建Shapefile对话框内,名称命名为折线,要素类型选择折线,点击编辑,设置坐标系为WGS 1984。

2162

golang 文件md5_Golang的md5 hash计算

Golang计算md5值的方法都是接收byte型slice([]byte)。而且使用习惯上也觉得略奇怪。看了好几个例子才看懂。感觉Golang标准库在设计这些模块的时候,都会考虑使用带New关键字工厂生成一个该类型的结构体对象。然后再使用改对象的方法进行操作。md5包就是这样,来看例子:s := "api_key" + ApiKey + "param" + Param + "time" + tim...

weixin_40001048的博客 520

基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)

详细步骤1 数据集的制作1.1 数据标注1.2 生成数据集2 环境的搭建2.1 搭建流程2.2 注意事项(报错)3 开始训练4 可视化4.1 修改webcam.py文件4.2 进行可视化5 参考文章 1 数据集的制作 1.1 数据标注 使用 labelme=4.5.6 版本进行标注,标注文件指定到保存图片的路径下,也就是json文件和jpg文件放在同一个文件夹里 1.2 生成数据集 先手动划分训练集和测试集(包括图像和标注文件),然后分别整合它们的标注信息,参考代码:1_ships_to_coco.py

G果的博客 8001

Golang 计算MD5值示例

Golang提供了"crypto/md5"包用来计算md5值,使用起来简单方便,解决了我长久以来的疑问^_^ 一种是直接调用md5计算 package main import ( "crypto/md5" "fmt" ) func main() { data := []byte("crypted data") fmt.Printf("%x", md5.Sum(data)) } ...

fuyuande的博客 3321

JSON 与 JSON-RPC 的区别

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于文本,采用人类可读的语法来表示结构化数据。它起源于JavaScript,但如今已被几乎所有主流编程语言支持。标准文档:RFC 4627数据类型:支持 String、Number、Boolean、Null、Object、Array 六种基本类型格式示例"name": "张三","age": 30,JSON-RPC(JSON Remote Procedure Call)是一种远程过程调用(RPC)协议。

h a 6 6 6 c k 为 你解决复杂难题! 144

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

golang中MD5值计算问题

朋友发来一个一段用golang写的计算MD5值的codes: package main import ( "crypto/md5" "fmt" ) func main() { hash := md5.New() b := []byte("test") hash.Write(b) fmt.Printf("%x %x\n", hash.Sum(nil), md5.Sum(b)) }

menggucaoyuan的专栏 6142

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

用shell和golang计算字符串的md5值

shell golang获取字符串的md5值

u011285281的博客 782

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Golang的md5 hash计算

Golang计算md5值的方法都是接收byte型slice([]byte)。而且使用习惯上也觉得略奇怪。 看了好几个例子才看懂。 感觉Golang标准库在设计这些模块的时候,都会考虑使用带New关键字工厂生成一个该类型的结构体对象。然后再使用改对象的方法进行操作。 md5包就是这样,来看例子: s := "api_key" + ApiKey + "param" + Param +...

weixin_30845171的博客 463
上一篇: Eclipse 调试tomcat时报四十五秒超时
下一篇: Linux下Redis服务器安装配置
lvanneo
博客等级 码龄16年 13粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值