安全面试中的一个基础问题:你如何在数据库中存储密码?
3分钟讲解。
上周的面试故事
职位:初级安全工程师,刚毕业。
开始面试。
我:“这里你提到对数据安全有很好的理解。你能举例说明哪些方面的数据安全吗?”
A:“当然。例如,当我们构建一个系统时,会有一个用户模块,当我们在数据库的用户表中存储密码时,我们需要在存储之前对其进行加密。”
我:“你确定是加密而不是哈希处理吗?”
A:“是的。”
我:“那你把密钥存在哪里?”
A:“什么密钥?”
我:“你用来加密密码的加密密钥。是对称加密还是非对称加密?每个用户都有一个密钥还是共享一个密钥?”
A:“嗯……我们没有使用这些。所以应该是哈希处理。”
我:“没关系。你能解释一下为什么我们需要在存储之前进行哈希处理,而不是存储明文吗?”
A:“是的。因为我们想要确保安全。当我们验证密码时,密码不能以明文形式从UI发送到服务器进行验证。”
我:“当你注册用户时,是否需要以明文形式发送密码和确认密码?”
A:“是的,但那是唯一一次我们发送明文。”
我:“好的,我明白你的意思。你认为在数据库中存储哈希值的原因是为了减少在API调用期间发送敏感数据为明文的机会?”
A:“没错。”
我:“那么你认为当数据库被人入侵时,存储哈希值会有意义吗?”
A:“哦,是的,这样原始密码就不会被黑客看到。哈希值可以防止这一点。”
我:“是的,但这还不够。有人仍然可能使用彩虹表攻击,通过哈希碰撞得到原始值。你知道什么是盐(salt)吗?”
A:“听说过。值应该是一个随机字符串,这会使密码存储更安全。”
我:“很好。你知道它是如何工作的吗?”
A:“不太清楚。”
我:“假设有人通过SQL注入或其他方式获取了数据库,然后使用彩虹表进行攻击,发生哈希碰撞并得到了原始文本,但他得到的是混合了随机字符串的原始密码,这样我们可以防止原始密码被窃取。这意味着我们阻止了一些人获取你的‘一键登录’密码来登录你的邮件、社交媒体甚至银行账户。”
A:“我明白了。”
我:“那么你们目前系统中使用的是哪种哈希算法?”
A:“我们知道md5不安全,所以我们使用了其他选项,比如sha3。”
我:“你能简要说明一下为什么md5不安全吗?为什么选择sha3来哈希密码?因为据我所知,sha3的KDF(如hmac-sha3)并不是为哈希密码设计的,而是用于其他用途,如JWT令牌签名。”
A:“md5被证明是不安全的,已经有一些报道。但是KDF是什么?”
我:“KDF是密钥派生函数。这意味着你使用的哈希算法会将密码作为输入生成哈希值。是的,有报道说md5不安全。但你知道为什么吗?”
A:“嗯,不太清楚。”
我:“简而言之,这是因为它的哈希碰撞抵抗力弱,可能被彩虹表攻击。”
A:“什么是彩虹表?”
我:“彩虹表是一种预计算的表格,包含从明文密码派生的哈希值链。这些链通过反复应用哈希函数生成,然后通过一系列还原函数将结果哈希值还原为明文密码。彩虹表通常用于密码破解攻击中,攻击者将存储在被入侵数据库中的哈希密码与彩虹表中的条目进行比较,以找到匹配的明文密码。”
A:“我明白了。”
我:“那你为什么使用sha3来生成密码?”
A:“我觉得它比MD5更安全。”
我:“是的,但可能有更好的密码哈希选项。比如2015年获奖的argon2,比sha3需要更多的迭代和更高的RAM,这意味着更高的时间复杂度和资源消耗,从而使攻击者更难以进行暴力破解。但sha3通常用于其他用途,例如数字签名,平衡安全性和性能。”
……
让我们逐个分析这个面试中的细节。
密码哈希
我们都知道,在21世纪,密码绝不能以明文形式保存。
然而,这不仅仅是为了减少在某些API调用期间发送密码值为明文的机会。 主要的关注点是当数据库落入坏人之手时,使其无法恢复原始文本。 接下来发生的事情是数据库将被“凭证填充攻击”。相同的凭证会在不同的账户上反复尝试:电子邮件、银行卡、社交媒体、学校,甚至是政府账户。
为什么不使用加密而是哈希?
关键区别在于可逆性。加密是一个可逆的过程,这意味着使用正确的密钥可以恢复原始的明文密码。这构成了一个安全风险,即使加密密钥被安全管理。 此外,管理加密密钥,如构建密钥链,可能会带来显著的成本和复杂性。
为什么需要盐(salt)
盐用于为每个哈希密码添加随机性,使攻击者使用预计算表如彩虹表来破解密码变得计算上昂贵。 没有盐,攻击者可以通过将哈希值与大型预计算哈希数据库进行比较来有效猜测密码。 此外,盐必须对每个密码唯一,而不仅仅是对每个用户唯一。这确保即使两个用户有相同的密码,由于唯一的盐,他们的哈希值也会不同,防止攻击者轻易识别重复的密码。
不同用途的哈希
Sha3比md5更安全,为什么不使用sha3?哈希不仅用于密码值,还有不同的使用场景:
数据完整性(如SHA3):哈希算法如SHA3通常用于指纹文件,确保其完整性保持不变。这些算法需要在速度和哈希碰撞抵抗之间找到平衡。虽然SHA3提供了良好的碰撞抵抗,但它也保持了文件指纹任务的合理性能。
校验和(如CRC32):当速度至关重要时,如在网络传输期间验证数据完整性,CRC32等算法表现出色。CRC32通常用于快速识别文件在传输过程中是否被修改,优先考虑效率而不是碰撞抵抗。
密钥生成(如Argon2、bcrypt、PBKDF2):为了安全地存储密码或生成加密密钥,首选专门的密钥派生函数(KDF)如Argon2、bcrypt或PBKDF2。这些算法故意引入“慢”哈希过程,通过增加计算复杂性来抵御哈希碰撞的暴力破解。
虽然SHA3适用于HTTPS连接或JWT令牌签名生成等任务,但它缺乏提供密码哈希所需的必要“慢”特性。
为什么KDF在密码哈希中很重要
KDF在密码哈希中通过故意减慢哈希过程起着关键作用。这种故意的减慢是通过多次迭代哈希值计算实现的。虽然这些迭代的技术细节可能很复杂,但它们本质上涉及重复操作如移位、反转和XOR-ing哈希值,执行数千轮。
使用KDF哈希密码的主要目标是:
减慢过程:通过引入计算开销,KDF使攻击者更难以暴力破解密码。计算哈希值所需的时间和资源增加,作为快速词典或彩虹表攻击的威慑。
资源消耗:KDF在哈希过程中还会消耗大量的CPU和内存资源。这种资源密集型特性进一步阻碍了攻击者,因为他们必须投入大量的计算能力和时间来破解哈希密码。
什么是彩虹表攻击?
简要解释:
词典表:在彩虹表之前,攻击者预计算所有哈希值,并在一个称为“词典表”的表中枚举所有哈希值。然后,在获取目标数据库表后,进行哈希碰撞并得到关联的原始密码值(这也是为什么盐如此重要)。
然而,词典表可能会迅速增长,最终包含大量行,变得不可用。
彩虹表可以被视为“词典表的高效版本”。
在彩虹表中,有两个函数。H:从明文获取哈希值,R:从哈希值获取明文。
存储多行,每行是一个“哈希链”,每行从一个明文开始,然后多次进行H和R。
对目标数据库表进行哈希碰撞,一旦哈希值匹配,进行R以获取明文。
最后
为什么md5(或sha1)不能用于密码哈希?如果可以,md5还有其他用途吗?
简单回答:弱哈希碰撞抵抗。
md5在2004年被证明具有弱哈希碰撞抵抗。
sha1也在2005年被证明具有相同的问题,并由谷歌在2017年宣布。
我们可以将md5用于其他用途吗?比如指纹或校验和?不行。已被证明,两个不同的文件可以生成相同的md5;如果用于校验和,crc32具有更快的性能。
md5没有使用场景,你永远不应该使用它。
感谢阅读,下篇见。
最后:
vue2与vue3技巧合集
VueUse源码解读
相关文章:
安全面试中的一个基础问题:你如何在数据库中存储密码?
3分钟讲解。 上周的面试故事 职位:初级安全工程师,刚毕业。 开始面试。 我:“这里你提到对数据安全有很好的理解。你能举例说明哪些方面的数据安全吗?” A:“当然。例如,当我们构建一个系统时,会…...
【python深度学习】——torch.min()
【python深度学习】——torch.min 1. torch.min()1.1 计算整个张量的最小值1.2 沿特定维度计算最小值1.3 比较两个张量 1. torch.min() torch.min()接受的参数如下: input: 输入的张量。dim: 沿指定维度寻找最小值。如果指定了该参数,返回一个元组,其中…...
华为校招机试 - 最久最少使用缓存(20240508)
题目描述 无线通信移动性需要在基站上配置邻区(本端基站的小区 LocalCell 与周边邻基站的小区 NeighborCelI 映射)关系, 为了能够加速无线算法的计算效率,设计一个邻区关系缓存表,用于快速的通过本小区 LocalCell 查询到邻小区 NeighborCell。 但是缓存表有一定的规格限…...
第三部分:领域驱动设计之分析模式和设计模式应用于模型
分析模式 分析模式是一种概念集合,用来表示业务建模中的常见结构。它可能只与一个领域有关,也可能跨越多个领域。“分析模式”这个名字本身就强调了其概念本质。分析模式并不是技术解决方案,他们只是些参考,用来指导人们设计特定领…...
PID传感器在光电显示行业VOC气体检测的应用
随着光电显示技术的飞速发展,液晶显示器等显示器件产品已经成为我们日常生活和工作中不可或缺的一部分。然而,在生产过程中,液晶显示器会释放大量的挥发性有机物(VOC)气体,对生产环境及工作人员的健康构成威…...
iOS推送证书过期处理
苹果推送证书的有效期都是一年,将要过期的时候,苹果官方会发邮件提醒。 一、过期 在电脑上找到并打开其它->钥匙串访问; 我的证书可以看到各个App的推送证书,如果过期了,显示红色X 二、重新创建 1、登陆apple开…...
蓝海卓越计费管理系统 agent_setstate.php SQL注入漏洞复现
0x01 产品简介 蓝海卓越计费管理系统是一套以实现网络运营为基础,增强全局安全为中心,提高管理效率为目的的网络安全运营管理系统,提供“高安全、可运营、易管理”的运营管理体验,基于标准的RADIUS协议开发,它不仅支持PPPOE和WEB认证计费,还支持802.1X接入控制技术,与其…...
【leetcode2765--最长交替子数组】
要求:给定一个数组,找出符合【x, x1,x,x-1】这样循环的最大交替数组长度。 思路:用两层while循环,第一个while用来找到符合这个循环的开头位置,第二个用来找到该循环的结束位置,并比较一下max进行记录。 …...
java文档管理系统的设计与实现源码(springboot+vue+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 文档管理系统的…...
西安航空学院电子工程学院领导莅临泰迪智能科技参观交流
5月26日,西安航空学院电子工程学院院长杨亚萍、专业教师刘坤莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技董事长张良均、副总经理施兴、产品中心负责周东平、校企合作经理吴桂锋与泰迪智能科技韩伟进行热情了接待。双方就专业建设、协同…...
C++|设计模式(二)|简单工厂和工厂方法模式
本文探讨两种广泛使用的创建型模式——简单工厂模式和工厂方法模式,解释他们的实现细节、优势以及应用场景。 在下一篇文章中,我会补充抽象工厂模式,其实工厂模式主要就是为了封装对象的创建过程,如果我们不进行封装,…...
C语言从头学12——流程控制(一)
C语言程序的执行顺序是从前到后依次序执行的。如果想要控制程序执行的流程,就必须使用 流程控制的语法结构,分为条件执行和循环执行。 1、if语句 if 语句在前面的举例中曾经出现过,这里做详细介绍。该语句用于条件判断,满…...
10大领域应该怎么记?
文章目录 5大过程组10大领域49个过程输出输入工具与技术 参考文档: https://mp.weixin.qq.com/s/BJ-Dpn0zxTP0TCbeoJXb9A 5大过程组 启动、规划、执行、监控、收尾 10大领域 巧记:【挣饭进城市,咨购风菜干】【狗子整范进—成人风采】 整…...
通过Ubuntu虚拟机+Linux移植LVGL并通过linux Frame buffer显示
文章参考:https://gitee.com/socbis/linux-lvgl lvgl on linux Frame buffer 主机环境: Ubuntu 18.04lvgl 8.0.1 获取源码并运行demo 获取源码 需要3样东西来构建demo : lvgl核心控件库: 从此处获取源码 lvgl,选择版本 Release v8.0.1. 显示和触摸接…...
M功能-支付平台(三)
target:离开柬埔寨倒计时-221day 前言 今天周六,但是在柬埔寨还是工作日,想着国内的朋友开始休周末就羡慕呀,记不清在这边过了多少个周六了,多到我已经习惯了。而且今天技术部还停电了,真的是热的受不了呀…...
5G工厂长啥样
5G工厂是一种新型的工业互联网基础设施,利用5G为代表的新一代信息通信技术集成,打造新型工业互联网基础设施。在5G工厂中,自动化和智能化设备广泛使用,高度互联的工厂网络得以实现,远程监控和管理成为可能,…...
使用Python操作Jenkins
大家好,Python作为一种简洁、灵活且功能丰富的编程语言,可以与各种API轻松集成,Jenkins的API也不例外。借助于Python中的python-jenkins模块,我们可以轻松地编写脚本来连接到Jenkins服务器,并执行各种操作,…...
网络协议测试仪设计方案:474-便携式手提万兆网络协议测试仪
便携式手提万兆网络协议测试仪 一、平台简介 便携式手提万兆网络协议测试仪,以FPGA万兆卡和X86主板为基础,构建便携式的手提设备。 FPGA万兆卡是以Kintex-7XC7K325T PCIeX4的双路万兆光纤网络卡,支持万兆网络数据的收发和网络协议…...
使用numpy手写一个神经网络
本文主要包含以下内容: 推导神经网络的误差反向传播过程使用numpy编写简单的神经网络,并使用iris数据集和california_housing数据集分别进行分类和回归任务,最终将训练过程可视化。 1. BP算法的推导过程 1.1 导入 前向传播和反向传播的总体…...
使用Spring AOP实现接口参数变更前后对比和日志记录
推荐一个程序员的常用工具网站,效率加倍,嘎嘎好用:程序员常用工具云服务器限时免费领:轻量服务器2核4G腾讯云:2核2G4M云服务器新老同享99元/年,续费同价阿里云:2核2G3M的ECS服务器只需99元/年,续费同价记录接口调用前后的参数变化是一个常见的需求,这不仅有助于调试和…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
