哈希算法(上):如何防止数据库中的用户信息被脱库?

哈希算法(上):如何防止数据库中的用户信息被脱库?

如何存储用户密码重要的数据?仅仅MD5加密一下存储就够了吗?

什么是哈希算法?

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,通过原始数据映射之后得到的二进制值串就是哈希值

为了设计一个优秀的哈希算法并不容易,需要满足几点要求:

  • 从哈希值不能反向推导出原始数据,即单向哈希算法
  • 对输入数据敏感,哪怕只修改一个Bit,最后得到的哈希值也不相同
  • 散列冲突的概率很小。对于不同的原始数据,哈希值相同的概率非常小
  • 执行效率尽量高效

分别对“今天我来讲哈希算法” 和"jiajia"两个文本,计算MD5哈希值,得到两串看起来冒无规律的字符串(MD5的哈希值是128Bit长度,为了方便表示,转化为16进制编码)无论要哈希的文本有多长,通过哈希之后,得到的哈希值长度都是相同的,得到的哈希值看起来像一堆随机数,没有规律

这两个相似的文本,“我今天讲哈希算法”和“我今天讲哈希算法!”只有一个!的区别,用哈希算法分别计算,得到的哈希值完全不同

哈希算法应用非常广,安全加密、唯一标识、数据校验、散列函数等等

应用一:安全加密

MD5和SHA(安全散列算法)是最常用的

不管是什么哈希算法,只能尽量减少碰撞冲突的概率,理论上是没办法做到完全不冲突的,哈希算法产生的哈希值的长度是固定且有限的,比如前面的MD5,哈希值是固定的128位二进制串,最多能表示2^128个数据,而我们要哈希的数据是无穷的,所以一般情况下,哈希值越长的哈希算法,散列冲突的概率越低

应用二:唯一标识

要在海量的图库中搜索一张图是否存在,不能单纯的用图片的元信息(比如图片的名称)来比对,因为可能出现名称相同但是内容不一样等等情况,所以任何文件在计算中都可以表示成二进制码串,所以笨方法就是拿要查找的图片的二进制码串与图库中所有图片的二进制码串一一比对,我们可以给每一个图片取一个唯一标识,或者是信息摘要,比如,从图片的二进制码串开头取100字节,从中间取100字节,最后取100字节,将这300字节放到一块,通过哈希算法得到一个哈希字符串,作为图片的唯一标识,通过这唯一标识判定图片是否在图库中,再提高效率,可以把每个图片的唯一标识和相应图片文件再图库中的路径信息都存储在散列表中,先通过唯一标识查找是否在图库中,如果在的话就通过散列表中存储的文件路径获取到这个已经存在的图片,跟现在要插入的图片做全量比对,看是否完全一样

应用三:数据校验

BT下载的原理是基于P2P协议的,从多个机器上并行下载一个2GB的电影,可能会被分割成很多文件块,等所有文件块都下载完成之后,再组装成一个完整的电影文件即可,但是网络传输是不安全的,下载的文件块可能出现错误,那如何校验文件块的安全、正确和完整呢?

通过哈希算法对100文件块分别取哈希值,并且保存在种子文件中,哈希算法有一个特点就是对数据很敏感,只要文件块有一点点改变,最后出现的哈希值就会完全不同,所以当文件块下载完成之后,通过相同的哈希算法对下载好的文件块逐一求哈希值,然后和种子文件中保存的哈希值对比

扫描二维码关注公众号,回复: 9867967 查看本文章

应用四:散列函数

散列函数是设计一个散列表的关键,直接决定了散列冲突的概率和散列表的性能,即便出现了个别散列冲突,也可以通过开放寻址法和链表法解决,散列函数中算法更加关注能否平均散列在各个槽中

如何防止数据库中的用户信息被脱库?

可以通过哈希算法,对用户密码进行加密之后再存储,选择相对安全的加密算法,比如SHA,MD5可能已经被破解了,但是也不能加密之后存储就万事大吉了

如果用户信息被脱库,黑客拿到的是加密之后的密文,但可以通过猜的方式来破解,因为很多人习惯用00000,123456等方式组合做密码,所以我们需要维护一个常用密码的字典表,把字典中的每个密码用哈希算法计算哈希值,然后拿哈希值跟脱库后的密文做比对,如果相同,加密之后的密码对应的明文就是字典中的这个密码,针对字典攻击,引入一个salt,跟用户的密码组合在一起,增加密码的复杂度,拿组合之后的字符串来做哈希算法加密,将它存储到数据库中,进一步增加破解难度

采用无论密码长度多少,计算字符串hash时间都固定或者足够满的算法(PBKDF2WithHmacSHA1)来降低硬件计算hash速度,减少不同长度字符串计算hash所需时间不一样而泄漏字符串长度信息,进一步减少风险(Timing Attack)

区块链用的是哪种哈希算法?是为了解决什么问题而使用的呢?

区块链是一块块区块组成的,每个区块分为两部分:区块头和区块体

头保存着自己区块体和上一个区块头的哈希值,因为这种链式关系和哈希值的唯一性,只要区块链上任意一个区块被修改过,后面所有区块保存的哈希值就不对了

区块链使用SHA256哈希算法,计算哈希值非常耗时,篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值

发布了76 篇原创文章 · 获赞 9 · 访问量 9199

猜你喜欢

转载自blog.csdn.net/ywangjiyl/article/details/104317094