文档章节

Golang计算MD5

YangJunjie
 YangJunjie
发布于 2014/12/30 11:28
字数 1516
阅读 192
收藏 1

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值的接口了。

本文来自:CSDN博客

感谢作者:cz_it

查看原文:Golang计算MD5


本文转载自:http://blog.csdn.net/cz_it/article/details/24733773

共有 人打赏支持
上一篇: java 注意点
下一篇: java 权限
YangJunjie
粉丝 0
博文 13
码字总数 1515
作品 0
福州
私信 提问
golang中MD5值计算问题

朋友发来一个一段用golang写的计算MD5值的codes: [cpp] view plaincopy在CODE上查看代码片派生到我的代码片package main import ( ) func main() { } [cpp] view plaincopy在CODE上查看代码片...

alexstocks
2015/01/15
0
0
Golang IO包的妙用

作者 丨reboot饼干 Golang 标准库对 IO 的抽象非常精巧,各个组件可以随意组合,可以作为接口设计的典范。这篇文章结合一个实际的例子来和大家分享一下。 背景 以一个RPC的协议包来说,每个包...

馨宁
2017/05/09
0
0
windows 下的 eclipse安装goclipse 配置golang开发环境

下载goclipse eclipse plugins http://goclipse.googlecode.com/svn/trunk/goclipse-update-site/ (建议使用proxy下载,除非你能直接访问;)) 我在百度网盘上传了最新的goclipse插件包,提...

hotkit
2014/11/22
0
0
iGO实现之路 —— Security

本文为转载,原文:iGO实现之路 —— Security Golang 介绍 在我们写代码的过程中,可能会遇到很多的数据安全问题。比如我们在后端进行http请求的时候,url编码问题;用户登录密码数据库的保...

ChainZhang
2018/01/23
0
0
如何判断两个长json是否相同?

RT。 想过转化成字符串然后md5,怎奈两个json转换成字符串后,里面属性的顺序会变(比如第一个json里name在前age在后,第二个json有时就会age在前name在后),这样的话明明是两个相同的json,字...

神州浪子
2014/09/25
979
5

没有更多内容

加载失败,请刷新页面

加载更多

linux 扩展lv

相关概念 逻辑卷可以实现硬盘空间的动态划分和管理。 1】 物理卷 LV 处于最低层,可以是物理硬盘上的分区,也可以是整个物理硬盘 2】 卷组 VG 卷组建立在物理卷之上,一个卷组至少要包括一个...

hnairdb
30分钟前
1
0
如何快速定位Ruby函数源码

如何快速定位Ruby函数源码 1、gem gem which sidekiq 2、bundle bundle show redis 3、CTags Sublime extend ActiveSupport::Concernrescue_fromcurrent_company.cc_ad_tasks.creat......

mingle
31分钟前
1
0
基于 DataLakeAnalytics 的数据湖实践

随着软硬件各方面条件的成熟,数据湖(Data Lake)已经越来越受到各大企业的青睐, 与传统的数仓实践不一样的是,数据湖不需要专门的“入仓”的过程,数据在哪里,我们就从哪里读取数据进行分析...

阿里云云栖社区
33分钟前
1
0
word文档处理成富文本生成sql语句导入mysql

问题:需要将大量的已存在的word文档导入到web项目里在网站展示,不可能通过编辑录入的方式处理,通过程序实现。 解决思路:通过读取word文档处理成html,再获取html富文本内容,拼接成sql,...

S三少S
39分钟前
43
0
WAF开放规则定义权:专家策略+用户自定义策略=Web安全

在第一期“漫说安全”栏目中,我们用四格漫画的形式介绍了基于深度学习的阿里云WAF到底智能在哪里,能帮客户解决什么问题。 在今天的这期栏目里,我们依然通过漫画这种通俗易懂的方式,与大家...

迷你芊宝宝
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部