浅谈哈希算法
Posted 尧字节
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈哈希算法相关的知识,希望对你有一定的参考价值。
这篇文章算是极客时间上,王争老师开设的《数据结构与算法之美》的课程里面的关于哈希算法的整理和思考。
言归正传,哈希算法是在计算机软件领域运用非常广泛的算法,也同时是非常重要的算法,什么是哈希算法,哈希算法也叫散列算法,Hash算法,简单来说就是通过一个函数将任意长度的二进制串(计算机里面二进制串可以是文字,图片,视频)映射(计算输出)成固定长度的二进制值串,这个函数就称为hash函数,这个映射得到的二进制串也叫哈希值,常用的Hash算法有MD5(Message Digest algorithm 5,信息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。
哈希算法一般具有以下的特点:
1)哈希算法得到的值是固定长度的二进制串。
2)哈希算法非常敏感,两个具有微小差异的二进制串映射后的哈希值会完全不同。
3)从哈希算法的值很难推导出原始的报文信息。
4)哈希算法的执行的效率一般都要求很高,要快速计算出hash值。
5)很难找到两个不同的值,但是哈希值是一样的数据。
基于哈希算法的特点,哈希算法的应用说明如下:
###1)用密码的哈希值当作用户的密码使用。
也就是常说的哈希加密,这里面说加密是不准确的,因为加密就存在这解密,而从哈希值是无法推导出原始密码的;方法就是在后台的数据库中不直接保存用户的密码,而是保存用户密码的哈希值,用户登录的时候再通过密码的哈希值和数据库里面的保存的哈希值对比,如果一致就说明用户的密码是对的;实际上,这样仍然是不安全的,因为如果数据库被黑客脱库(意思是把数据库内容盗走),黑客虽然无法通过哈希值得到用户的真实密码,但是黑客可以通过对简单的密码计算哈希值再和数据库里面的哈希值一一比对,如果比对一致就可以当这个用户的密码是这个简单密码,黑客有强大的常用密码库,通过这种方法,简单的密码很容易被破解,再利用这个用户名和密码到其他网站尝试登录(这个俗语叫撞库),从而盗走用户信息。
基于以上特点,在真正保存密码的时候,不会直接用密码的哈希值,而是在密码上加点“盐”,再进行哈希计算,比如可以用一个固定的字符串拼接在密码的后面,做哈希,或者干脆用用户名的几位拼接密码,然后做哈希。
###2)用作唯一标识
既然哈希算法是对信息的摘要,而且很难找到不同的信息,但是哈希值相同的情况,那么在一些场合就可以用这个哈希值来表示复杂的信息,举个例子,你在建一个网盘系统,网盘系统上保存着大量的图片,为了节省空间,要对重复的内容只保留一份,如何做到那,最简单的办法,假如要保存一张图片,在保存之前,对现存的网盘中的图片和你要保存的图片做一一对比,如果一致将不保存同样的图片,只做个链接;但是网盘中的图片这么多,一一比对图片实在是太浪费时间,有没有更好的办法那,有个简单的办法就是在保存图片的时候同时保存这个图片的hash值,另外一张图片也要上传到网盘的时候,这时候对这张图片,也许只是这张图片的头200字节,尾部200个字节的数据做哈希计算,如果计算出来的哈希值已经在现有的网盘中了,那就挑出相同hash值的图片,做一一比对,因为哈希算法还存在着冲突的可能,所谓的冲突就是不同的数据,计算出相同的哈希值来,所以要对数据再做进一步的一一字节的比对。
这个我们在利用qq传送离线文件的时候也应该深有体会,有的几个G的文件可以秒传,原因我猜想qq系统通过比对哈希值判断出来这个文件在qq的临时中转空间上已经存在,所以只需要建个链接即可,无需真正上传,所以快。
###3)散列函数
在计算机的大部分语言中,有一种性能很好的数据结构就是哈希表,可以在O(1)的时间完成数据的查询,插入,删除操作(当然具体性能是不是O(1),还要看具体的情况),性能非常好。
底层原理是,哈希表这种数据结构一般是一种数组+链表的组合,通过对Key值做哈希计算,然后计算的结果对数组的总长度取余,就知道这个数据应该放入到那个数组的槽中,如果存在了hash冲突,即两个不同的Key计算出相同的hash值,那么就通过链表的形式,将数据串联在链表中(当然解决hash冲突的办法还有二次探测法,也不一定用链表,也许是红黑树,也许就保存在数组的空闲位置中)。
由于数组高性能地支持按照下标访问数据,而且数组是对缓存友好的,所以可以通过这种结构支持高性能的增删改查操作。
### 4)安全校验
所谓的安全校验,这里面应该算是完整性校验,大家应该都有下载软件的经历,在下载软件的时候,特别是在国外的网站下载软件,一般都有校验码,以Solr这个搜索软件为例:
如果点击PGP会得到:
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEE5YpvTVsrSKxm1eU71PGBiBpC+eYFAl0xwkMACgkQ1PGBiBpC
+eZ/ag//bFEPdSneF3SpId6tA5GemAJGiVDGCgxNc/kp7I/3ejyA/LPwozT5o2fa
ZBI/+rOKeEcEDWcJuppD40zNE35l+BHtXaJTNoZqEWbcrUULb9Aw61LKjllSQdEv
1gq8juFYcfofShbx4YxT2Zi/kz0A7xnS4GB7ycQ5TW3jLC67gkSqepmYrmPo4m/b
bucCXfhnwxT+SCA1v/C/AFmbKVZx0lUecwSbfA8b/vMR8xV9p18bDJOJk5MOUSNc
uGzjoBY7RolCMMXQoc1QXchieUhYDZlYFBoaK+dFxACB94ve4zWx7C8LzrU4R6gm
oCM2v6rvVeLxiGnCSNGBlBokrvDJpS7KdX1WYAz/XPUuDgroCmNDYoHzz6SkSY0X
4Kyly852D6dMimxVk7R4ve696inSBzJ8GwhLGHOdMjpSFNEZxDmTTFfOx/T7GMzq
67G9zZtfwqw0g0ZJbUkD7hFaAbkkEyrQjmnirA8HCxK4ntEcFd6d4YOK5JOvcH21
yH5NOXO9Kzk3JH318wMhbT0d0DZDU8kwP2kmuzoGQ+WqAQdNmx9GA0S9GPD3dkSa
erooMio4hxGMGLqEf2vx49SH4MX/PQaP6kWbDyB6i8FnFDl30lBtnX1qKikblm1T
04niKdx9UZkz6e+fz19mlUiO1sTcDV1ZygzRfhv37IFuQSFme98=
=S6/i
-----END PGP SIGNATURE-----
如果点击SHA512会得到一串数字:
7f53c99905bb4bd3b5fecee43a0b511d2d158b0830d494e1ab2cbc4bcae4a0fed4d21348f4e1f3c7675640b04c310fc3d53f87199a65910a552249818de6f51b
这两者起到的作用就是对solr这个软件的完整性校验,当然PGP更复杂,算是数字签名,这个我有时间再写一篇文字来介绍。
完整性校验的目的是为了防止网上的黑客对发布的软件做修改,例如在软件中植入木马等,所以利用哈希算法对数据敏感的特性,一旦软件发生轻微的改动,计算出来的哈希值都是完全不同的。我们下载软件后可以通过工具计算这个软件对应的哈希值,如果和官网中的哈希值不一致,那么说明软件一定被修改过,可能含有木马,不要使用;当然你可能会说,如果黑客连这个校验码也改了那,那不就校验不出来了吗,这就是数字签名要防止的问题了。
好了今天就聊到这里,下次接着聊。
祝大家一切都好!
----明翼 2019年8月26日 于成都
以上是关于浅谈哈希算法的主要内容,如果未能解决你的问题,请参考以下文章