Skip to content

Instantly share code, notes, and snippets.

@arrayadd
Last active June 6, 2017 17:34
Show Gist options
  • Save arrayadd/9a9beac0083ac16b296be76466994280 to your computer and use it in GitHub Desktop.
Save arrayadd/9a9beac0083ac16b296be76466994280 to your computer and use it in GitHub Desktop.
到底什么是哈希Hash(3)

前面两篇扯了哈希函数是什么及有什么特性(内容多从网上筛选,稍许考证整理而来),这篇接着来说说有哈希函数都有什么应用


防止内容被篡改

  1. 我们经常在网上下载一些软件,例如Windows系统,Ecplise,Idea,JDK等,一般官方的下载页面下面除了给出下载链接外,还会提供一个文件的MD5或SHA-256值。如下图 那个官方给出的这个值,就是这个文件的二进制值经过哈希函数计算出来的哈希值。前面我们知道哈希函数有个特性抗篡改能力:对于一个数据块,哪怕只改动其一个 比特位,其hash值的改动也会非常大 所以,如果有人修改过这个文件,那么当我们下载后,计算出对应的哈希值,发现和官方给出的不一致,那么就可以知道,这个文件被改过。有可能是不安全的。

  2. 记得大概三四年前,给公司支付平台接入过微信支付功能,其中一项就是当你向微信接口提交订单信息时候,需要把提交的get参数按照字典顺序排序后,再拼接上一个应用密匙Key(这个值只加密时候用,不明文传输,微信那边也有一份),然后整体作为一个字符串,计算出一个MD5值,最后把这个计算出来的MD5值,作为签名数据,一同提交给微信。这样微信得到参数后,可以根据这个MD5值来判断提交的参数有没有被人修改过,这对应数据的安全性非常重要。当然一般还会加一个随机数作为参数,保证相同业务参数时,每次请求MD5值的不重复性,保证了签名的不可预测性。  上面加随机参数这种方式有点像密码加密时候的加盐salt,另外注意,密码加密时候盐不需要保密,只要盐是随机的话,彩虹表会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出彩虹表。


用来加密

之前文章提到,哈希函数是一种单向函数是“非对称”的,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程,但对于用户注册登陆这种场景,完全可以用来加密用户密码。

用户注册时候填写的密码,在数据库里面不会明文保存,避免数据库泄露后,被人一看就知道用户密码是什么,根本不敢想后续事情... 通常会在注册时候就把密码计算出一个哈希值,存在数据库里面,除用户外没人知道这个哈希值明文是什么,当用户下次登陆时候数据库加密的密码完全不影响密码校验,因为只需要把用户登陆时候输入的密码用同一个哈希函数计算下哈希值,和数据库里面的哈希值比较,如果一致就输入对了。

写的真他妈啰嗦。


哈希表

见下文

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment