当前位置: 首页 > news >正文

安全面试中的一个基础问题:你如何在数据库中存储密码?

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元/年,续费同价记录接口调用前后的参数变化是一个常见的需求,这不仅有助于调试和…...

Sammy.js部署与运维:生产环境配置、性能监控与故障排查终极指南

Sammy.js部署与运维:生产环境配置、性能监控与故障排查终极指南 【免费下载链接】sammy Sammy is a tiny javascript framework built on top of jQuery, Its RESTful Evented Javascript. 项目地址: https://gitcode.com/gh_mirrors/sa/sammy Sammy.js是一个…...

告别Cline!用Roo Code在VSCode里打造你的专属AI编程搭档(附扫雷游戏实战)

从Cline到Roo Code:VSCode智能编程助手的进化实战 如果你曾经使用过Cline这类AI编程助手,可能会对它们提供的代码补全和简单问答功能感到满意。但当项目复杂度上升时,这些基础功能往往显得力不从心。这就是为什么越来越多的开发者开始转向Roo…...

python实现skip-gram(跳词)示例

文章目录示例什么是跳词? 一句话,就是用中心词,去预测它周围的词。它是 Word2Vec 里最常用的一种训练方式。 示例 1、安装依赖 pip install matplotlib # 其他torch等依赖早就安装了2、创建python文件skip_gram_demo.py,代码:…...

无线网络实战:从零配置AP与SSID,打通设备互联

1. 无线网络基础概念扫盲 刚接触无线网络时,我经常被各种专业术语搞得晕头转向。其实搭建一个简单的办公网络并不复杂,我们先来理清几个关键概念。**AP(接入点)**就像无线网络中的"信号中转站",负责把有线网…...

告别重复造轮子,用快马ai一键生成rabbitmq多模式高效代码模板

最近在项目中频繁使用RabbitMQ处理消息队列,发现手动编写各种模式的代码既耗时又容易出错。特别是当业务需要切换不同消息模式时,往往要重新查阅文档、调试参数。经过一番摸索,我总结出一套高效使用RabbitMQ的方法,并借助InsCode(…...

【微知】Mellanox网卡配置异常?mlxconfig reset全解与实战场景指南

1. Mellanox网卡配置异常?先别慌 遇到Mellanox网卡配置异常时,很多工程师第一反应是重装驱动或者更换硬件。其实在大多数情况下,用对mlxconfig reset这个神器就能快速解决问题。我处理过上百台配备Mellanox网卡的服务器,发现80%的…...

【院士、高层次专家齐聚 | 中南大学与布鲁内尔大学联合主办 | JPCS出版,EI , Scopus检索】第五届轻量化材料与工程结构国际会议(LIMAS 2026)

2026年第五届轻量化材料与工程结构国际会议(LIMAS 2026) 2026 5th International Conference on Lightweight Materials & Engineering Structures 2026年5月15-17日 ,中国长沙 大会官网:www.iclimas.net【参会投稿】 截稿…...

霞鹜文楷屏幕阅读版:2025年最佳屏幕阅读字体解决方案

霞鹜文楷屏幕阅读版:2025年最佳屏幕阅读字体解决方案 【免费下载链接】LxgwWenKai-Screen LXGW WenKai for Screen Reading. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenKai-Screen 还在为长时间盯着屏幕阅读而感到眼睛疲劳吗?&#x1…...

IPATool终极指南:如何用命令行轻松获取iOS应用安装包?

IPATool终极指南:如何用命令行轻松获取iOS应用安装包? 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trendin…...

用STM32F103做个智能门禁卡管理终端:RC522读卡、OLED菜单、4x4键盘改密码,附工程源码

基于STM32F103的智能门禁终端开发实战:从模块整合到系统优化 在物联网设备开发领域,将多个功能模块整合为一个稳定可靠的终端系统是开发者常面临的挑战。本文将深入探讨如何基于STM32F103RCT6微控制器构建一个功能完善的智能门禁管理终端,涵盖…...