Go语言MD5加密用法实例

本文实例讲述了Go语言MD5加密用法。分享给大家供大家参考。具体实现方法如下:

复制代码 代码如下:
import (
    "crypto/md5"
    "encoding/hex"
)
func main() {
    h := md5.New()
    h.Write([]byte("sharejs.com")) // 需要加密的字符串为 sharejs.com
    fmt.Printf("%s\n", hex.EncodeToString(h.Sum(nil))) // 输出加密结果
}

/*******************************************************

Golang计算MD5

YangJunjie · 2014-12-30 12:00:01 · 11161 次点击 · 预计阅读时间 3 分钟 · 大约1分钟之前 开始浏览

这是一个创建于 2014-12-30 12:00:01 的文章,其中的信息可能已经有所发展或是发生改变。

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]uint32x   [chunk]bytenx  intlen 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值的接口了。

本文来自:开源中国博客

感谢作者:YangJunjie

查看原文:Golang计算MD5

Go语言MD5加密用法实例相关推荐

  1. fclose在c语言中的作用,c语言fcloseall函数用法实例介绍

    c语言fcloseall函数用法实例介绍.fcloseall函数的返回值,函数 fcloseall() 将所有打开的流与其底层的文件或功能集合关闭.任何缓冲的数据都将首先被写入,使用 fflush(3 ...

  2. php 易语言md5加密解密,详解易语言调用js实现md5加密方法

    易语言调用js需要用到拓展组件的脚本组件, 在窗口创建完毕的事件里给脚本组件初始化设置下脚本组件的语言属性,在这里以JScript为例: 脚本组件执行脚本的简单方法是:  脚本组件1.执行 ()  然 ...

  3. C语言MD5加密程序

    MD5算法是很常见的一种不可逆加密算法 主要加密过程是输入原值,经过计算得到一个key值 以下是C语言实现的MD5加密(运算结果可以到网上找解密MD5的网站去验证) ​ /** File:md5mai ...

  4. php crypt,PHP加密函数—crypt()函数加密用法实例

    PHP加密函数-crypt()函数加密 在介绍加密函数之前,我们先来介绍一下数据加密原理:就是对原来的明文件或者数据按照某种算法进行处理,使其成为不可读的一段代码,通常称之为"密文" ...

  5. php中md5加密函数怎么用,PHP加密函数—md5()函数加密实例用法

    PHP加密函数-md5()函数加密 什么是MD5()函数? MD5()函数是计算器字符串的 MD5散列值,使用MD5的算法,MD5的全称是Message-Digest Algorithm 5,它的作用 ...

  6. C语言/实现MD5加密

    本文详细视频讲解,已经发布到B站 https://www.bilibili.com/video/BV1uy4y1p7on/ 更多仔细,请关注公众号:一口Linux 一.摘要算法 摘要算法又称哈希算法. ...

  7. C语言实现MD5加密,竟如此简单!

    一.摘要算法 摘要算法又称哈希算法. 它表示输入任意长度的数据,输出固定长度的数据,它的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密. 目前可以被解密逆向的只有CRC32算法,只有输入相 ...

  8. php md5加密(并小写),PHP常见加密函数用法示例【crypt与md5】

    本文实例讲述了PHP常见加密函数用法.分享给大家供大家参考,具体如下: 1.crypt()函数 crypt()函数用于返回使用DES.Blowfish或MD5算法加密过后的字符串,crypt(str, ...

  9. c语言字符串md5加密解密,.net core使用MD5加密解密字符串

    本文实例为大家分享了.net core使用MD5加密解密字符串的具体代码,供大家参考,具体内容如下 /// /// 加密 /// /// 要加密的文本 /// 秘钥 /// public static ...

最新文章

  1. 实验六JDBC数据库操作_JAVA
  2. Android使用CountDownTimer倒计时
  3. CF1305E Kuroni and the Score Distribution
  4. 容器编排技术 -- 了解Kubernetes对象
  5. YOLOv3 提升 5.91 mAP,IoU在目标检测中的正确打开方式
  6. python 商城_python 开源商城安装
  7. java编译速度_[译] Kotlin VS Java:编译速度大比拼
  8. 2. 使用keras-神经网络来做线性回归问题
  9. 51学习记录基于51单片机的简单音乐盒
  10. Latex排版技巧:上下方可输入文字的箭头
  11. Perl笔记:07、以正则表达式进行匹…
  12. 挑战华为社招:不止面试题,笔记源码统统都有,最强技术实现
  13. PM小课堂 项目管理中的甘特图妙用
  14. CF1612C Chat Ban
  15. css硬件加速_CSS动画的硬件加速简介
  16. L298N 驱动电机与单片机的线路连接图
  17. iphone字体大小使用的像素
  18. 仿《文明》游戏制作日志3
  19. Matlab画密度函数分布图
  20. 从0到1实现一个Android路由(6)——拦截请求再跳转

热门文章

  1. Golang slice原理
  2. LOJ#2127「HAOI2015」按位或
  3. 关于flink的日志文件设置
  4. 你不一定真正理解的NAT术语
  5. GDI+ 学习记录(27): Bitmap
  6. matlab未定义函数lp,matlab未定义函数或变量(附上源代码)
  7. mysql 查询重写_mysql 学习 - 查询重写规则
  8. Redis---持久化
  9. Oracle和Mysql获取uuid的方法对比
  10. Shell--shell中的判断