散列函数(Hash function)又称散列算法、哈希函数,散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values)的指纹。这种转化是一种压缩映射,也就是散列值的空间通常远小于输入值的空间,不同的输入可能会散列成相同的输出,二不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要函数

散列函数性质

通过使用单向散列函数,即便是确认几百MB大小的文件的完整性,也只要对比很短的散列值就可以了。那么,单向散列函数必须具备怎样的性质呢?我们来整理一下。

  • 根据任意长度的消息计算出固定长度的散列值

  • 能够快速计算出散列值

计算散列值所花费的时间短。尽管消息越长,计算散列值的时间也会越长,但如果不能在现实的时间内完成计算就没有意义了。

  • 消息不同散列值也不同

  • 难以发现碰撞的性质称为抗碰撞性(collisionresistance)。密码技术中所使用的单向散列函数,都需要具备抗碰撞性。强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。在这里,散列值可以是任意值。密码技术中的单向散列函数必须具备强抗碰撞性。

  • 具备单向性

单向散列函数必须具备单向性(one-way)。单向性指的是无法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单行路是无法反过来走的。

散列函数的应用

散列函数应用具有多样性

安全加密:

  • 保护资料,散列值可用于唯一地识别机密信息。这需要散列函数是抗碰撞(collision-resistant)的,意味着很难找到产生相同散列值的资料。如数字签名、消息认证码。

数据校验:

  • 确保传递真实的信息:消息或数据的接受者确认消息是否被篡改的性质叫数据的真实性,也称为完整性。
  • 错误校正:使用一个散列函数可以很直观的检测出数据在传输时发生的错误。

负载均衡:

  • 通过hash算法,对客户端IP进行计算hash值,将取到值与服务器数量进行取模运算。

分布式存储:如一致性hash。

常用单项散列函数

MD4 MD5

MD5在1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

SHA-1 SHA-2

SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。

SHA-2:2001年发布,包括SHA-224SHA-256SHA-384SHA-512SHA-512/224SHA-512/256SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。 比特币使用的sha-256进行的数字签名

算法和变体 输出散列值长度 (bits) 中继散列值长度 (bits) 资料区块长度 (bits) 最大输入消息长度 (bits)
MD5 128 128 (4 × 32) 512 无限
SHA-0 160 160 (5 × 32) 512 264 − 1
SHA-1 160 160 (5 × 32) 512 264 − 1
SHA-2 SHA-224 SHA-256 224 256 256 (8 × 32) 512
SHA-384 SHA-512 SHA-512/224 SHA-512/256 384 512 224 256 512 (8 × 64) 1024 2128 − 1

Go语言中使用散列函数

Go语言使用MD5

方式一:

md5.Sum("123")

方式2:

func getMD5_2(str []byte) string {
// 1. 创建一个使用MD5校验的Hash对象`
myHash := md5.New()
// 2. 通过io操作将数据写入hash对象中
io.WriteString(myHash, "hello")
//io.WriteString(myHash, ", world")
myHash.Write([]byte(", world"))
// 3. 计算结果
result := myHash.Sum(nil)
fmt.Println(result)
// 4. 将结果转换为16进制格式字符串
res := fmt.Sprintf("%x", result)
fmt.Println(res)
// --- 这是另外一种格式化切片的方式
res = hex.EncodeToString(result)
fmt.Println(res) return res
}

Go语言SHA-1、SHA-2的使用

方法一:

sha512.Sum512()
sha256.Sum256()

方法二与md5的使用类似

常用加密算法学习总结之散列函数(hash function)的更多相关文章

  1. 常用加密算法学习总结之数字证书与TLS/SSL

    数字证书 对于一个安全的通信,应该有以下特征: 完整性:消息在传输过程中未被篡改 身份验证:确认消息发送者的身份 不可否认:消息的发送者无法否认自己发送了信息 显然,数字签名和消息认证码是不符合要求的 ...

  2. 常用加密算法的Java实现总结

    常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 A ...

  3. Day5 - Python基础5 常用模块学习

    Python 之路 Day5 - 常用模块学习   本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...

  4. 常用加密算法的Java实现(一)

    常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 摘自:http://www.blogjava.net/amigoxie/archive/2014/06/01/414299.html ...

  5. python常用算法学习(4)——数据结构

    数据结构简介 1,数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.简单来说,数据结构就是设计数据以何种方式组织并存贮在计算机中.比如:列表,集合与字 ...

  6. java常用加密算法

    常用加密算法的Java实现(一) ——单向加密算法MD5和SHA 日期:2014/6/1 文:阿蜜果 1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安 ...

  7. hash function比较

    http://blog.csdn.net/kingstar158/article/details/8028635 由于工作需要,针对千万级别的数据,使用stl::map着实存在着效率问题,最后使用bo ...

  8. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  9. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

随机推荐

  1. 【linux】制作deb包方法 **

    目录 前言 概念 ** 创建自己的deb包 文件源码 前言 制作deb的方式很多 使用 dpkg-deb 方式 使用 checkinstall 方式 使用 dh_make 方式 修改原有的 deb 包 ...

  2. 使用Azure API Management, Functions, Power Apps和Logic App构建应用

    ASP.NET OpenAPI 可以非常方便的将我们的Web API项目自动文档化,除了自动文档化以外,我们还可以利用Azure API Management将Open API自动文档化了的Web A ...

  3. python进阶(一)变量与数据类型、python之禅

    一.变量: 1.变量组成:由数据.字母与下划线组合 2.不能以数字开头 3.python关键字与函数名不能作为变量名 4.当字符串变量中包含引号时,可使用单引号与双引号进行区分,或转义 print(& ...

  4. Vim快速使用教程

    Vim Vim是从vi发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富. Vi/Vim的使用 基本上分为三种模式,分别是命令模式(commad mode),输入模式(Inse ...

  5. 日志收集之filebeat使用介绍

    此系列文章一共分为三部分,分为filebeat部分,logstash部分,es部分.这里会按照每天几百亿条的数据量来考虑,去设计.部署.优化这个日志系统,来最大限度的利用资源,并达到一个最优的性能.本 ...

  6. goloader - golang动态加载的实现

    github地址:https://github.com/dearplain/goloader 这里有以前的一些思路:http://www.cnblogs.com/dearplain/p/8145985 ...

  7. IIS6目录解析漏洞的实验

    ​​​​​​​​​​Windows 打开IIS管理器的方式 这个是网站IIS网站目录 右击默认网站中的属性,可以查看网站的属性,比如网站根目录,或者是端口 这个是网站的目录C:\www,有三个文件分别 ...

  8. Dockerfile多阶段构建

    多阶段构建 之前的做法: 在Docker17.05版本之前,构建Docker镜像,通常采用两种方式: 1.全部放入一个Dockerfile 一种方式是将所有的构建过程全都包含在一个Dockerfile ...

  9. 13.PHP_ThinkPHP

    ThinkPHP 先把百度百科上对这个框架的介绍粘贴过来: ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且 ...

  10. Linux-鸟菜-5-目录配置-FHS

    Linux-鸟菜-5-目录配置-FHS 这节内容比较休闲,主要就是介绍Linux的目录配置,也就是那些目录通常是干啥的,这个比较重要,需要我们去了解.但是我觉得通常看一遍记不住啥,也就记个大概,主要还 ...