安全面试中的一个基础问题:你如何在数据库中存储密码?
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元/年,续费同价记录接口调用前后的参数变化是一个常见的需求,这不仅有助于调试和…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
