golang中的md5、sha256数据加密文件md5/sha256值计算步骤和运行内存图解

news2024/12/25 1:04:45

在go语言中对数据计算一个md5,或sha256和其他语言 如java, php中的使用方式稍有不同, 那就是要加密的数据必须通过的形式写入到你创建的Hash对象中

Hash数据加密步骤

1. 先使用对应的加密算法包中的New函数创建一个Hash对象,(这个也就是一个io.Writer) ;

        如: sha := md5.New()

2.  将要计算MD5/sha256的数据或者文件写入这个writer;

        如:io.WriteString(sha, "admin") 

        文件hash计算:

        file,_:=os.Open("yourfile.txt")

        io.Copy(sha, file)  // 文件hash计算和字符串hash计算的区别就在这里,其他地方完全一样

3. 最后在调用hash对象的方法Sum方法即可计算文件或者数据的MD5值;

        如: b0 := sha.Sum(nil)  // 注意这个Sum方法对于计算Hash值时不需要传参数,给他个nil 哄一下就行

4.  返回值b0,这个值是16进制的unicode表示,需要使用 %x 将其格式化为可读字符串.

        如: md5Str:=fmt.Sprintf("%x",b0)     

到此,整个hash加密过程就算完成了, 怎么样是不是很简单?

go语言中的其他Hash加密算法, 如 sha1, sha256, sha512等的加密步骤和方法也都是一样的,唯一不同的地方就是在创建Hash对象的时候你使用的包名不一样而已。

对于文件的hash值计算,

方法也是一样的, 不同的地方就是在数据写入的时候,把 io.WriteString(sha, "admin")  替换为  io.Copy(sha, file)  这里的file是你使用打开的要计算hash的文件对象指针,在这个地方被当做一个reader

Hash对象运行内存图解

上图可以帮助我们验证go语言中的数据加密的运行方式,流式数据写入, 还有hash对象中的这个Sum方法参数在对数据进行加密的时候 为什么必须为nil

Hash对象运行内存图解中的代码: 这个是一个example测试用例,保存到 xxx_test.go 即可运行

package test

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

func ExampleMd5() {
	sha := md5.New()
	io.WriteString(sha, "admin") // 这里要计算MD5的字符串必须要以流的显示写入到hash对象中
	b0 := sha.Sum(nil)           // 字节放到Sum参数里面最会将数据追加到流的前面返回,不会影响hash对象的数据.
	
	// 验证
	fmt.Printf("admin对应的md5字节: %v 字符串: %x \n", b0, b0)

	b1 := sha.Sum([]byte("ab中")) // 这里传递的参数不会影响hash对象,仅附加到数据流的前面
	//Sum方法里面追加的参数 ab中 被转换为 97 98 228 184 173 , 可见这里的97就是a的码值,98是b的码值,而 228 184 173 则是中对应的码值因为一个汉字占3个字节所以这里有3个byte
	fmt.Printf(`Sum([]byte("admin"))后字节: %v 字符串: %x`, b1, b1)
	// output:
	// admin对应的md5字节: [33 35 47 41 122 87 165 167 67 137 74 14 74 128 31 195] 字符串: 21232f297a57a5a743894a0e4a801fc3
	// Sum([]byte("admin"))后字节: [97 98 228 184 173 33 35 47 41 122 87 165 167 67 137 74 14 74 128 31 195] 字符串: 6162e4b8ad21232f297a57a5a743894a0e4a801fc3
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux经典定时任务

在使用时记得替换为自己的脚本路径。请在相应的脚本第一行加上#!/bin/bash,否则脚本在定时任务中无法执行。 1、在每天凌晨2点执行 0 2 * * * /bin/sh bashup.sh 2、每天执行两次 下面的示例命令将在每天上午5点和下午5点执行。您可以通过逗号分隔指定多个时间戳…

vue中的$nextTick和过渡与动画

一.vue中的$nextTick 简述与用法:这是一个生命周期钩子 1.语法:this.$nextTick(回调函数) 2.作用:在下一次DOM更新结束后执行其指定的回调 3.什么时候用:当修改数据后,要基于更新后的新dom进行某些操作时,…

vue.js基础组件4--下

1.动态组件 1.定义动态组件 利用动态组件可以动态切换页面中显示的组件。使用<component>标签可以定义动态组件&#xff0c;语法格式如下。 <component is"要渲染的组件"></component>上述语法格式中&#xff0c;<component>标签必须配合i…

爬山算法全解析:掌握优化技巧,攀登技术高峰!

一、引言 爬山算法是一种局部搜索算法&#xff0c;它基于当前解的邻域中进行搜索&#xff0c;通过比较当前解与邻域解的优劣来更新当前解&#xff0c;从而逐步逼近最优解。本文将对爬山算法进行详细的介绍。 二、爬山算法简介 爬山算法是一种基于贪心策略的优化算法&#xff…

Modular military character

角色具有31个模块化骨架网格,每个模块具有多个蒙皮: 3个头(4skins) 3件衬衫(9skins) 3条裤子(9skins) 3只靴子(9skins) 7件战术背心(3skins) 4只手和手臂(2skins) 3顶帽子和头盔(9skins) 2个背包(3skins) 3支步枪(3skins) 模块允许您组装超过200万个不同的…

SW手势定义

crtle:独立; T:测量;R隐藏;视图>用户界面>动态显示父子关系 crtld:相同零件; alte:草图显示; altw:基准面显示; ALTZ:上一视图;

Docker笔记-一种在非交互式方式中加载环境变量的方法

背景 我遇到的现象是这样的&#xff0c;我在docker安装了dm python的客户端&#xff0c;但dm python实际上是对libdmdpi.so的调用&#xff0c;在交互式环境中&#xff08;/bin/bash&#xff09;调用python 连接达梦是没有任何问题的&#xff0c;但在非交互环境直接调用&#x…

Mac配置node环境

1.下载nvm(node版本管理工具&#xff0c;同Anaconda对Python的关系&#xff09;。 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 2.配置vi ~/.zshrc文件&#xff0c;添加如下配置&#xff1a; export NVM_DIR"$HOME/.nvm" [ -…

软考 系统架构设计师系列知识点之SOME/IP与DDS(1)

本文内容参考&#xff1a; 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#xff08;1&#xff09;—— 概述_some ip-CSDN博客 深入浅出SOME/IP协议&#xff1a;基本概念和原理-…

酷开科技相伴童年 | 酷开系统六一特辑:亲子共赏,启迪成长

六一儿童节&#xff0c;属于每个茁壮成长的孩子&#xff0c;也属于每个童心未泯的“少年”。《小王子》里说&#xff0c;使生活如此美丽的是我们藏起来的真诚和童心。马上就到六一儿童节了&#xff0c;就让我们用温柔而富有童真的笔触&#xff0c;唤醒那份沉睡已久的童心吧。 在…

gitlab没有合并权限、发起合并请求

1.选择项目 2.发起合并请求 3.选择需要合并的分支&#xff0c;第一个是被合并的分支&#xff0c;第二个是合并上哪个分支 4.选择有合并权限的管理人 5.发起请求&#xff0c;通知、等待管理人合并

【Docker实战】进入四大数据库的命令行模式

上一篇我们讲了docker exec命令&#xff0c;这一次我们使用docker exec命令来进入四大数据库的命令行模式。 我们进行游戏开发或软件开发是离不开四大数据库的&#xff0c;这四大数据库分别是关系型数据库mysql、postgres&#xff0c;nosql数据库redis、mongodb。将它们容器化…

GNSS的经纬度使用float还是doubble数据类型存储传输?

1. 背景 当你在使用导航、打车、定位等等场景下&#xff0c;一定会有形或者无形的使用位置服务&#xff0c;位置服务的基础功能功能就是向你提供位置信息&#xff0c;而经纬度是位置信息的主要信息&#xff0c;一般情况可以简单的认为位置信息就是经纬度信息。经纬度使用小数进…

静态随机存储器(SRAM)

目录 介绍 基本的 SRAM 存储单元阵列 1. SRAM 存储单元 2. SRAM 阵列 3. SRAM 阵列的读写操作 4. SRAM 阵列的扩展 5. SRAM 阵列的应用 6. SRAM 阵列的优缺点 基本的 SRAM 逻辑结构 1. 存储单元 2. 存储单元阵列 3. 译码器 4. 读写电路 5. 控制逻辑 6. SRAM 逻辑…

多旋翼+发电机:国债应急系留照明无人机技术详解

多旋翼发电机技术的应急系留照明无人机是一种集成了先进飞行技术、发电技术和照明技术的无人机系统。这种无人机具有高度的灵活性、移动性和适应性&#xff0c;能够在各种复杂环境下迅速部署&#xff0c;为夜间搜救、救援等应急任务提供高效、可靠的照明支持。 无人机参数&…

微软改进WSL子系统 新版将支持镜像宿主机网络接口及使用外部DNS

Windows SubSystem for Linux (即 WSL) 是微软在 Windows 10/11 中开发的子系统功能&#xff0c;该功能允许用户在 Windows 上安装 Linux 系统和相关环境&#xff0c;对开发者来说可以构建 Linux 开发环境进行工作。不过 WSL 系统在功能上也有不少缺点&#xff0c;典型的就是默…

18.并发编程原子性、可见性、有序性原理

文章目录 原子性、可见性、有序性原理1.CPU物理缓存结构1.1.寄存器1.2.缓存1.3.物理内存 2.并发编程的三大问题2.1.原子性2.2.可见性2.3.有序性2.3.1.指令重排 2.4.总结 原子性、可见性、有序性原理 原子性&#xff0c;可见性&#xff0c;有序性&#xff0c;是并发编程中所面临…

四轮麦轮平衡车四个轮子安放位置要求,以及编码器测速注意事项(强调,否则无法正常平移)——基于STM32F103ZET6

轮子推荐ABBA&#xff0c;当然BAAB也可以 如图安放&#xff1a; 这两种安防位置可以实现平移效果 若要实现平移则需要先实现PID控制平衡&#xff0c;这里用到520编码电机&#xff0c;相较于370电机他的动力更足&#xff0c;在调节PID时能节约不少时间而且更加容易。 需要注意…

AI应用案例:AI就是这么牛,聊天就能分析股票。

今天给大家介绍一个可能跟你切身相关的案例“大模型股票分析“&#xff01;首先申明这不是教你怎么炒股的方法&#xff0c;而是告诉你可以通过AI协助你去分析股票。 像我是程序员出身&#xff0c;有数据给我&#xff0c;我可以写SQL语句查数据库&#xff0c;或者通过写代码来分…

QT上位机开发

目录 前言一、环境搭建1.1 IDE下载1.2 添加环境变量 二、Qt Creator的使用2.1 快捷键2.2 创建QT项目2.3 帮助文档使用 三、Qt信号与槽3.1 标准信号与槽的使用3.2 自定义信号与槽 四、Qt控件4.1 QMainWindow4.2 按钮4.3 容器4.4 窗口4.5 布局管理 五、SerialPort5.1 修改.Pro文件…