数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

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

安全性与攻击成本的博弈
防止字典攻击:使用盐值增加复杂度
加密密码并存储
不关心反向解密,注重散列均匀和执行效率
散列表的关键,决定散列冲突概率和性能
比对哈希值与种子文件中的哈希值
通过哈希算法校验文件块的安全、正确、完整
散列表存储唯一标识和文件路径
用于图库中搜索图片是否存在
通过哈希算法生成唯一标识
鸽巢原理:哈希算法无法做到零冲突
要求:难以反向推导、冲突概率低
常用加密算法:MD5、SHA、DES、AES
要求:不能反向推导出原始数据、敏感度高、冲突概率低、高效计算
映射规则即为哈希算法,得到的值为哈希值
将任意长度的二进制值串映射为固定长度的二进制值串
解决的问题
使用的哈希算法
密码存储
应用四:散列函数
应用三:数据校验
应用二:唯一标识
应用一:安全加密
定义和原理
区块链
哈希算法

该思维导图由 AI 生成,仅供参考

还记得 2011 年 CSDN 的“脱库”事件吗?当时,CSDN 网站被黑客攻击,超过 600 万用户的注册邮箱和密码明文被泄露,很多网友对 CSDN 明文保存用户密码行为产生了不满。如果你是 CSDN 的一名工程师,你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 要想搞清楚这个问题,就要先弄明白哈希算法。
哈希算法历史悠久,业界著名的哈希算法也有很多,比如 MD5、SHA 等。在我们平时的开发中,基本上都是拿现成的直接用。所以,我今天不会重点剖析哈希算法的原理,也不会教你如何设计一个哈希算法,而是从实战的角度告诉你,在实际的开发中,我们该如何用哈希算法解决问题

什么是哈希算法?

我们前面几节讲到“散列表”“散列函数”,这里又讲到“哈希算法”,你是不是有点一头雾水?实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,我们常听到有人把“散列表”叫作“哈希表”“Hash 表”,把“哈希算法”叫作“Hash 算法”或者“散列算法”。那到底什么是哈希算法呢?
哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法而通过原始数据映射之后得到的二进制值串就是哈希值。但是,要想设计一个优秀的哈希算法并不容易,根据我的经验,我总结了需要满足的几点要求:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

哈希算法在数据库中存储用户信息时发挥着重要作用,尤其是在防止用户信息被脱库方面。本文介绍了哈希算法的定义和原理,以及其在实际开发中的应用。文章以MD5算法为例,说明了哈希算法的特点和要求,包括不可逆推原始数据、对输入数据敏感、散列冲突概率小以及高效执行效率。此外,文章还介绍了哈希算法在安全加密、唯一标识、数据校验和散列函数等方面的应用。在安全加密方面,MD5和SHA等算法被广泛使用,但文章也指出了哈希算法无法完全避免散列冲突的问题。最后,文章提到了密码学界一直在寻找快速且难以破解的哈希算法,而在实际开发中需要权衡破解难度和计算时间来选择合适的加密算法。 文章还详细介绍了哈希算法的四个应用场景:唯一标识、数据校验、安全加密和散列函数。唯一标识通过哈希算法对大数据做信息摘要,用于快速搜索图片库中的图片;数据校验则利用哈希算法对文件块进行校验,确保下载的文件块完整和正确;安全加密方面介绍了哈希算法对用户密码进行加密存储,并提出了盐的概念增加密码复杂度;散列函数则是哈希算法的一种应用,用于设计散列表的关键,决定散列冲突的概率和散列表的性能。 总的来说,本文通过介绍哈希算法的原理和应用,以及在实际开发中的权衡考量,为读者提供了全面的了解和思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(141)

  • 最新
  • 精选
  • Smallfly
    课后思考: 区块链是一块块区块组成的,每个区块分为两部分:区块头和区块体。 区块头保存着 自己区块体 和 上一个区块头 的哈希值。 因为这种链式关系和哈希值的唯一性,只要区块链上任意一个区块被修改过,后面所有区块保存的哈希值就不对了。 区块链使用的是 SHA256 哈希算法,计算哈希值非常耗时,如果要篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值,短时间内几乎不可能做到。

    作者回复: 👍

    2018-11-07
    20
    633
  • oyt
    加salt,也可理解为为密码加点佐料后再进行hash运算。比如原密码是123456,不加盐的情况加密后假设是是xyz。 黑客拿到脱机的数据后,通过彩虹表匹配可以轻松破解常用密码。如果加盐,密码123456加盐后可能是12ng34qq56zz,再对加盐后的密码进行hash后值就与原密码hash后的值完全不同了。而且加盐的方式有很多种,可以是在头部加,可以在尾部加,还可在内容中间加,甚至加的盐还可以是随机的。这样即使用户使用的是最常用的密码,黑客拿到密文后破解的难度也很高。

    作者回复: 👍

    2018-11-13
    24
    209
  • Jerry银银
    原来“散列冲突”的数学原理是鸽巢原理,为啥大部分算法书上讲解散列表的时候,不提一下呢。搞得我平时向朋友解释为什么存在冲突的时候,用得都是“鸽巢原理的白话版”,而且在讲解的时候还不知道那就是鸽巢原理,很尬! 离散数学的课必须得好好补完

    作者回复: 👍

    2018-11-07
    8
    122
  • 小龙的城堡
    老师您好,我有一个疑问就是hash算法用于加密数据,但是我理解的加密是需要对应解密的,但是hash算法并不能解密,这用应用更像是数字签名,不知道我理解是不是有问题,感谢!

    作者回复: 没错 可以理解为数字签名

    2018-11-07
    3
    60
  • 🐱您的好友William🐱
    其实我感觉hash不可能做到无冲突的原理可以用机器学习里面的免费午餐理论解释,因为hash追求的其实就是机器学习中的best seperate,就是mapping之后,不只是把两个不一样的东西分开,还要保证两者足够远(最大margin),因为hash函数是要面对所有类型的数据分布,而免费午餐理论告诉我们:不存在一种完美的算法对所有类型的数据分布都能做到完美的分离,最好的算法一定是根据特定的数据分布特定设计出来的。所以像hash函数这种需要应对不特定数据分布的,需要广泛使用的,是一定不会将数据完美seperate的。

    作者回复: 👍

    2018-11-08
    4
    37
  • FLYING
    越是复杂哈希算法越难破解,但同样计算时间也就越少。这句话应该是越多吧?

    作者回复: 谢谢指出 笔误 本来是想写“长”的 写成了“少”

    2018-11-07
    22
  • 伯安
    哈希算法的特点有一条:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)。 可是JAVA中的MD5类不是有加密和解密方法吗?解密的过程,是不是代表哈希算法能够反向推导出原始数据呢?就这块比较困惑。。

    作者回复: 应该没有吧。有破解方法 但也是基于碰撞的。但它也只是最近才被破解的

    2018-11-07
    3
    8
  • Tintin
    个人认为hash算法不能做加密用,因为解密不出来,文中说的不是准确

    作者回复: 我再去研究下 有没有要求说加密算法必须能解密才叫加密算法。这里你看以理解为数字签名

    2018-11-11
    3
    4
  • 色即是空
    迷迷糊糊的,知道个大概,没用过

    作者回复: 慢慢来啊,一口吃不成大胖子

    2019-09-14
    1
  • Jed
    安全加密部分提到散列冲突的概率要小于 1/2^128,不是应该等于1/2^128?不是很理解

    作者回复: 你说的貌似有道理,我改下。

    2019-07-17
    1
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部