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

news2024/11/29 22:44:07

文章来源于极客时间前google工程师−王争专栏。
2011年CSDN“脱库”事件,CSDN网站被黑客攻击,超过600万用户的注册邮箱和密码明文被泄露,很多网友对CSDN明文保存用户密码行为产生了不满。如果你是CSDN的一名工程师,你会如何存储用户密码这么重要的数据吗?仅仅MD5加密一下存储就够了吗?

实际开发中,我们该如何用哈希算法解决问题?

什么是哈希算法?

散列表也叫哈希表,散列函数也叫哈希函数、哈希算法,都源于英文Hash。

哈希算法的定义和原理:

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

一个优秀的哈希算法需要满足几点条件:

  • 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)
  • 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同
  • 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
  • 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值

MD5的哈希值是128位的Bit长度,为了方便表示,转化为16进制编码

MD5(" 今天我来讲哈希算法 ") = bb4767201ad42c74e650c1b6c03d78fa
MD5("jiajia") = cd611a31ea969b908932d44d126d195b

尽管只有一字之差,得到的哈希值也是完全不同的

MD5(" 我今天讲哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb
MD5(" 我今天讲哈希算法 ") = a1fb91ac128e6aa37fe42c663971ac3d

通过"a1fb91ac128e6aa37fe42c663971ac"很难推断出对应的文本。

对于非常长的文本,要求哈希算法的计算时间很短。比如一篇4000多个汉字的文章,用MD5计算哈希值,用不了1ms的时间。

哈希算法的应用非常非常多,最常见的7个,分别是安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。

应用一:安全加密(理解成数字签名)

最常用于安全加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。

除了这两个之外,还有DES(数据加密)、AES(高级加密)等。

实际上,不管是什么哈希算法,我们只能尽量减少碰撞冲突的概率,理论上是没办法做到完全不冲突的。

这里就基于组合数学中一个非常基础的理论,鸽巢原理(抽屉原理)。这个原理是说,如果有10个鸽巢,有11只鸽子,那肯定有1个鸽巢中的鸽子数量多于1个,换句话说,肯定有2只鸽子在1个鸽巢内。

有了鸽巢原理的铺垫之后,我们再来看,为什么哈希算法无法做到零突破?

哈希算法产生的哈希值的长度是固定且有限的。MD5哈希值是固定的128位二进制串,能表示的数据是有限的,最多能表示2128个数据,而我们要哈希的数据是无穷的。基于鸽巢原理,如果我们对2128+1个数据求哈希值,就必然会存在哈希值相同的情况。一般情况下,哈希值越长的哈希算法,散列冲突的概率越低。

2^128=340282366920938463463374607431768211456

如下两段字符串经过MD5哈希算法加密之后,产生的哈希值是相同的。
image

即便哈希算法存在冲突,但是在有限的时间和资源下,哈希算法还是被很难破解的。

除此之外,没有绝对安全的加密。越复杂、越难破解的加密算法,需要的计算时间也越长。

应用二:唯一标识

先举一个例子:如果要在海量的图库中,搜索一张图是否存在,我们不能单纯地用图片的云信息(比如图片名称)来比对,因为有可能存在名称相同但图片内容不同,或者名称不同图片内容相同的情况。那我们该如何搜索呢?

任何文件在计算机中都可以表示成二进制码串,所以,比较笨的办法就是,拿要查找的图片的二进制码串与图库中所有图片的二进制码串一一比对。如果相同,则说明图片在图库中存在。但是,每个图片小则几十KB、大则几MB,转化成二进制是一个非常长的串,比对起来非常耗时。有没有比较快的方法呢?

我们可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取100个字节,从中间取100个字节,从最后再取100个字节,然后将这300个字节放到一块,通过哈希算法(比如MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样可以减少很多工作量。

如果还想继续提高哦效率,我们可以把每个图片的唯一标识,和相应的图片文件在图库中的路径信息,都存储在散列表中。当要查看某个图片是不是在图库中的时候,我们先通过哈希算法对这个图片取唯一标识,然后再散列表中查找是否存在这个唯一标识。

如果不存在,那就说明这个图片不在图库中;如果存在,我们再通过散列表中存储的文件路径,获取到这个已经存在的图片,跟现在要插入的图片做全量的比对,看是否完全一样。如果一样,就说明已经存在;如果不一样,说明两张图片尽管唯一标识相同,但是并不是相同的图片。

应用三:数据校验

电驴这样的BT下载软件的原理是基于P2P协议的。我们从多个机器上并行下载一个2GB的电影,这个电影文件可能会被分割成很多文件块(比如可以分成100块,每块大约20MB)。等所有的文件块都下载完成之后,再组装成一个完整的电影文件就行了。

我们知道网络传输是不安全的,下载的文件块有可能是被宿主机器恶意修改过的,又或者下载过程中出现了错误,所以下载文件块可能不是完整的。如果我们没有能力检测这种恶意修改或者文件下载出错,就会导致最终合并后的电影无法观看,甚至导致电脑中毒。

问题是:如何来检验文件块的安全、正确、完整呢?

BT协议很复杂,校验方法也有很多,我们来看一种方法的思路。

我们通过哈希算法,对100个文件块分别取哈希值,并且保存在种子文件中。**哈希算法有一个特点,对数据很敏感。**只要文件块的内容有一丁点改变,最后计算出的哈希值就会完全不同。所以,当文件块下载完成之后,我们可以通过相同的哈希算法,对下载好的文件块逐一求哈希值,然后跟种子文件中保存的哈希值比对。如果不同,说明这个文件块不完整或者被篡改了,需要重新从其他宿主机器上下载这个文件块。

应用四:散列函数

我们知道,散列函数是设计一个散列表的关键。相对于哈希算法的其他应用,散列函数对于散列算法冲突的要求要低很多。即便出现个别散列冲突,只要不是过于严重,我们都可以通过开放寻址法或者链表法解决。

散列函数对于是否反向解密也不关心。散列函数中用到的散列算法,更加关注散列后的值是否能平均分布,也就是,一组数据是否能均匀地散列在各个槽中。除此之外,散列函数执行的快慢,也会影响散列表的性能,所以散列函数用到的散列算法一般都比较简单,比较追求效率。

解答开篇

我们可以通过哈希算法,对用户密码进行加密之后再存储,不过最好选择相对安全的加密算法,比如SHA等(因为MD5已经号称被破解了)。不过仅仅这样加密之后存储就万事大吉了吗?

字典攻击听说过吗?如果用户信息被“脱库”,黑客虽然拿到是加密之后的密文,但可以通过“猜”的方式来破解密码,这是因为有些用户的密码太简单。

那我们就需要维护一个常用密码的字典表,把字典中的每个密码用哈希算法计算哈希值,然后拿哈希值跟脱库中的密文比对,如果相同,基本上就可以认为,这个加密之后的密码对应的明文就是字典中的这个密码(哈希算法存在散列冲突,也有可能出现,尽管密文相同,但是明文并不一样的情况)

针对字典攻击,我们可以引入一个盐(salt),跟用户的密码组合在一起,增加密码的复杂度。我们拿组合之后的字符串来做哈希算法加密,将它存储到数据库中,进一步增加破解的难度。我认为安全和攻击是一种博弈关系。不存在绝对的安全。所有的安全措施,只是增加攻击的成本而已。

思考

区块链是一个很火的领域,不过底层的实现原理并不复杂。其中,哈希算法就是它的一个非常重要的理论基础。你能讲一讲区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?

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

区块头保存着 自己区块体 和 上一个区块头 的哈希值。

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

区块链使用的是 SHA256 哈希算法,计算哈希值非常耗时,如果要篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值,短时间内几乎不可能做到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1145488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目资源管理案例题

本文来自江山老师高项文档 规划资源管理 没有规划资源管理 资源管理计划项目经理一人制定,没有全员参与 资源管理计划内容不全面,有遗漏 质量工程师编写资源管理计划是不对的 资源管理计划应该各干系人参与,而且还需要经过评审 估算活…

基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理MATLAB程序

微❤关注“电气仔推送”获得资料(专享优惠) 参考文献: 基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理_董雷 仿真平台: MATLABcplex 主要内容: 主要为多虚拟电厂/微网的优化调度策略,模型…

实用篇-Nacos配置管理

Nacos不仅具有注册中心的功能,还具有注册管理的功能 一、Nacos实现配置管理 可以使用统一配置管理,来配置更改热更新,整体结构如下 前提条件: 你已经把上面的 实用篇-Nacos注册中心 学完了,并且项目也跟着做了。我们下面会使用到…

Python 接口自动化 —— requests框架

1.前言 Python内置的urllib模块,也可以用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。因此我们使用 requests 模块进行进行接口测试。 requests官方文档资料地址:http://cn.python-request…

操作系统:进程与线程(二)同步与互斥B

一战成硕 2.3.5 管程2.3.6 经典同步问题 2.3.5 管程 管程的特性保证了进程互斥,无需程序员自己实现互斥,降低了死锁发生的可能。 管程的定义 管程是一种高级的同步机制。 定义描述举例 条件变量 2.3.6 经典同步问题 生产者消费者问题 缓冲区没满&a…

会说话,得天下!演讲与口才训练必修课

会说话,得天下!演讲与口才训练必修课 口才是现代职场上一项非常重要的素质。有了好的口才,不仅可以很好地展示自己的思想和见解,还可以影响他人并获得支持,这对个人职业发展十分重要。所以,学习如何进行出…

详解 DES加密技术 | 凯撒密码 | 栅栏密码

目录 密码学 恺撒密码 栅栏密码 消息和加密 密码的三个特性 算法和密钥 对称算法 公开密钥算法 DES对称加密技术 DES算法的安全性 DES算法的原理 DES算法的实现步骤 IP置换表和IP-1逆置换表 函数f 子密钥ki S盒的工作原理 DES算法的应用误区 密码学 密码学是一门…

Oracle (7)Online Redo Log Files

目录 一、Oracle Online Redo Log Files及其相关内容介绍 1、Online Redo Log Files简介 2、Online Redo Log Files特点 3、Online Redo Log Files文件组 4、多路复用文件 5、联机重做日志文件工作方式 6、LGWR什么时候写重做 7、LS和LSN 8、删除Redo文件成员 9、删除…

【黑马程序员】mysql基础篇笔记

2023年10月26日12:21:09过一下 1.01.MySQL课程介绍(Av765670802,P1) 2.02. 基础-课程内容&数据库相关概念(Av765670802,P2) 3.03. 基础-概述-MySQL安装及启动(Av765670802,P3) 4.04. 基础-概述-数据模型(Av765670802,P4) 通过表来存储数据的数据库就叫做关系型数据库 …

centos7安装配置以及Linux常用命令

⭐⭐ linux专栏:linux专栏 ⭐⭐ 个人主页:个人主页 目录 一.CentOS的安装 使用vi编辑ifcfg-ens33 二. 下载MobaXterm软件 2.1MobaXterm的用途 2.2 MobaXterm的使用 2.3下载插件vim 三.Linux常用命令 3.4 vi或vim编辑器 3.4.1 命令模式 3.4.2.…

面试官:给你40亿个数,你应该如何快速判断一个数是否在这40亿个数中?—— 位图 [ C++入门 ]

阅读导航 引言一、位图的概念1. 官方文档2. 基本概念 二、位图的实现1. 插入2. 删除3. 查找C模拟实现🔴完整代码 总结 引言 在C编程中,位图是一种常用的数据结构,用于高效地表示大量的布尔值。它通过使用一个二进制位来表示每个元素的存在与…

集成电路自动化测试的优势是什么?

集成电路自动化测试的优势主要包括: 提高效率:自动化测试可以显著提高测试效率,因为可以24小时不间断地进行测试,同时避免了人工测试中的误差和疏漏,节省了大量时间和人力成本。 提升精度:自动化测试的精…

MySQL|基础操作+8大查询方式汇总

MySQL操作 一、操作数据库 MySQL中可以创建多个数据库用于存储不同场景的表结构,学习MySQL之前,我们要先理清如下的关系: 数据库 --> 数据表 --> 字段 抛开数据库存储上限去考虑,每个数据库中可以包含无数个数据表&#xf…

Apriori介绍及代码批注

一、Apriori原理解析 1. 概述 关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找到各项之间的关联关系,而这种关系并没有在数据中直接体现出来。以超市的销售数据为例,当存在很多商品时,可能的商品组合数量…

MySQL的数据库操作、数据类型、表操作

目录 一、数据库操作 (1)、显示数据库 (2)、创建数据库 (3)、删除数据库 (4)、使用数据库 二、常用数据类型 (1)、数值类型 (2&#xff0…

用Jmeter做微信小程序项目接口测试【案例】

公司新项目组开发一款微信小程序电商平台,为了更好保证产品质量,因此提出了需要进行接口测试。 从接口本身来讲,对其测试与其他项目应该是一样的。所以不难理解,我们要对小程序的接口测试需要准备的 材料有: 1、完备…

LCR 158. 库存管理 II 哈希 / 摩尔投票法

LCR 158. 库存管理 II - 力扣(LeetCode) 仓库管理员以数组 stock 形式记录商品库存表。stock[i] 表示商品 id,可能存在重复。请返回库存表中数量大于 stock.length / 2 的商品 id。 (1)方法一:先排序 题目…

​Profinet转EtherNET/IP从站连接欧姆龙plc与西门子200smart通讯的配置方法​

本案例是200smart plc与欧姆龙plc进行通讯的方法,远创智控YC-PNM-EIP网关可以读写全系列西门子 PLC 数据。一般不需要 PLC 里做特殊的设置。只需要把 PLC 的变量地址配置到网关中,网关就可以读取指定地址的数据或者写数据到指定的地址。 PLC 通过网线连接…

Android---Bitmap详解

每一个 Android App 中都会使用到 Bitmap,它也是程序中内存消耗的大户,当 Bitmap 使用内存超过可用空间,则会报 OOM。 Bitmap 占用内存分析 Bitmap 用来描述一张图片的长、宽、颜色等信息,可用使用 BitmapFactory 来将某一路径下…

浮点数在计算机中的二进制表示

文章目录 Part.I IntroductionPart.II 原理Part.III 代码验证Reference Part.I Introduction 首先要了解一下下面的知识: 1 位有两种状态:0 或 11 字节(byte) 8 位(bit) 2 7 128 2^7128 27128&#xff1…