0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

艾体宝洞察 一文读懂最新密码存储方法,揭秘密码存储常见误区!

laraxu 来源:laraxu 作者:laraxu 2024-09-14 17:37 次阅读

信息安全的诸多领域之中,密码的安全存储无疑已然成为最为核心的问题之一。随着攻击技术的不断演进,传统的密码存储方法已无法抵御现代复杂的威胁。更为安全、健壮的密码存储机制也成为当代信息安全从业者的关注点。本篇文章将引入并介绍密码存储中的基石,关于密码哈希、盐加密(Salting)、密钥派生函数(KDF)的原理及其应用,揭示密码存储中的常见误区,并分享一系列安全实践。

一、为什么不能使用明文存储密码

直接将密码以明文存储在数据库中无异于为攻击者打开了方便之门。一旦数据库遭遇泄露,攻击者将轻而易举地获得所有用户的明文密码。更严重的是,这些密码可能被用于其他攻击场景,尤其是“凭证填充攻击”(Credential Stuffing)。此类攻击是指攻击者利用已知的用户名和密码组合尝试登录其他系统,时至今日,许多用户仍在多个系统中重复使用同一个密码。得益于此,这类攻击在实际中往往具有极高的成功率。凭证填充攻击还可能导致极为严重的后果,从电子邮件账户的入侵到银行账户的盗窃,还有可能进一步引发连锁效应。

因此,明文存储密码在现代信息安全领域是绝对不可取的。信息安全从业者必须采用适当的哈希或加密技术讲原始密码进行处理后再存储至数据库中,即便攻击者获取了数据库中的数据,也无法轻易还原出用户的密码。

二、哈希与加密的区别:为什么密码存储需要哈希?

在密码存储的讨论中,我们首先需要明确哈希加密的本质区别。

加密与哈希

加密是一个可逆的过程,通过特定的算法将明文转换为密文,并且在拥有正确密钥的前提下,密文可以被还原为明文。加密算法在数据传输和敏感数据保护中发挥着不可替代的作用。但与一般的认知可能恰恰相反,加密技术并不适合用于密码存储。原因在于,一旦存储密文的密钥遭到泄露,攻击者便可以通过解密操作直接恢复用户密码。鉴于此,加密在密码存储领域的应用相对有限。

哈希则是不可逆的。这意味着一旦数据经过哈希处理,理论上无法通过哈希值逆推出原始数据。哈希算法通过固定的规则对输入进行处理,并输出一个固定长度的哈希值。同样的输入必然会生成相同的输出,这使得哈希算法在验证数据一致性方面具有独特的优势。对于密码存储来说,哈希算法的不可逆性使得攻击者即便获取了哈希值,他们也无法轻易还原出原始密码。

wKgaomblWNSAa15BAALBBqF08Ic970.png

并非所有哈希算法的设计初衷并都用于安全保护。实际上大部分的哈希算法设计初衷都用于数据完整性校验。因此,在密码存储中,我们应优先选择那些针对密码存储需求特别优化的哈希函数,如密码哈希函数和密钥派生函数。

哈希算法的选择

常见的哈希算法包括 MD5、SHA1、SHA2、SHA3等。然而,MD5和 SHA1已被证明具有较弱的抗碰撞性,因此不再被推荐用于密码存储。当前,推荐使用更为安全的算法,例如 SHA256或更高级的专为密码存储设计的 KDF算法(如 bcrypt、Argon2等)。

常见的哈希算法包括 MD5、SHA1、SHA256等。随着密码学领域的发展,MD5和 SHA1的抗碰撞性已被证明不足以抵御现代攻击,尤其是针对彩虹表(Rainbow table)攻击和碰撞攻击,这部分内容我们将在稍后讲到。因此,这些算法已不再被推荐用于密码存储。

目前,安全专家建议使用更为安全的哈希算法,SHA256或 SHA3都是比较好的选择。在密码存储场景中,使用专门设计的密码哈希函数则更为合适。例如,bcryptArgon2PBKDF2都是目前被广泛使用的密码哈希函数。其不仅能够提供比通用哈希函数更强的安全性,还具备可调的计算复杂度,能够有效抵御暴力破解攻击和硬件加速攻击(包括 GPUASIC攻击等)。

三、加盐(Salt):防御彩虹表攻击的必然选择

尽管哈希算法具备不可逆性,但它们本质上是确定性的:相同的输入总会生成相同的哈希值。彩虹表是一种预计算的哈希值与对应明文的查找表,攻击者可以利用彩虹表等预计算攻击手段,轻松破解常见的密码。

为了解决这一问题,密码存储中普遍引入了“加盐”技术。盐(Salt)是一个随机生成的值,它会在密码进行哈希处理之前与密码组合。通过这种方式,即使两个用户使用了相同的密码,由于使用了不同的盐值,最终存储在数据库中的哈希值也将不同。这种策略有效抵御了彩虹表攻击,攻击者无法为每个可能的盐值与密码组合生成预计算的哈希表。

如何正确使用盐值?

盐值的使用虽然简单,但其安全性依赖于几点重要原则:

唯一性:每个用户的密码哈希都应使用不同的盐值。这样,即使两个用户选择了相同的密码,其对应的哈希值也会不同。

足够长度:盐值的长度应足够长,通常建议至少为 16字节或更长,为盐值提供随机性和不可预测性。

安全生成:盐值必须通过安全的随机数生成器生成,避免使用伪随机数生成器(PRNG),伪随机数可能会导致盐值的可预测性,进而削弱安全性。

知其原理,而在我们实际的开发过程中,目前主流的编程语言与安全框架均已集成成熟的盐值算法库,按需调用即可。

四、密钥派生函数(KDF):密码存储的坚实防线

虽然加盐哈希在抵御彩虹表攻击上有显著效果,但它并不能完全防止暴力破解等其他形式的攻击。攻击者可以通过持续尝试可能的密码组合,最终得出正确的密码。因此,进一步增强密码存储的安全性成为当务之急,这就引入了密钥派生函数(Key Derivation Function,KDF)

什么是 KDF?

KDF是一种增强版的哈希函数,其核心目的是通过增加计算成本来阻止攻击者的暴力破解。与标准哈希函数相比,KDF的工作原理是通过反复多次迭代原始输入(通常会包括密码和盐值),从而使得每次哈希计算都更加耗时和资源密集。通过这种方式,KDF有效地增加了密码哈希计算的难度和时间,使得即便拥有强大计算能力的攻击者也无法快速破解密码。

wKgZomblWO2ATPllAAEy07s_Vu4768.png

常见的 KDF算法包括上述提及的bcryptPBKDF2Argon2。这类算法就是专门设计用于提高密码存储的安全性,不仅增加了计算复杂度,还可以通过调整参数来平衡安全性与性能之间的关系。

Argon2的优势

Argon2值得独自拿来说一下。作为近年来最为推荐的 KDF算法之一,Argon2在 2015年密码学竞赛中获得了最高奖项。Argon2被设计为可以抵抗现代硬件加速的暴力破解攻击,特别是在 GPU、FPGA和 ASIC等硬件上,其通过增加内存消耗使得这些攻击的实施变得更加困难。

Argon2有三个版本:Argon2d侧重于抗 GPU并行攻击,Argon2i侧重于抗时间侧信道攻击,而Argon2id则结合了两者的优点,通常被认为是密码存储的最佳选择。通过合理调整 Argon2的内存和计算参数,可以根据实际需求实现较好的安全性与性能平衡,在对抗现代攻击手段方面表现尤为出色。

五、彩虹表攻击

彩虹表攻击是一种通过查找预计算哈希值来破解密码的技术。攻击者会生成一个包含大量常见密码及其哈希值的查找表,随后将这些哈希值与数据库中的密码哈希进行匹配,从而快速找出对应的明文密码。该攻击方法特别适用于使用弱密码且未进行加盐处理的系统。

wKgaomblWPmAevCTAAFTY9Zep14295.png

相对地,彩虹表的有效性极大地依赖于预计算的范围和密码的复杂性。通过引入“加盐(Salt)”技术,每个密码在哈希处理前加入一个独特的随机盐值,这意味着即便两个用户使用相同的密码,最终生成的哈希值也会完全不同。由于盐值的随机性,攻击者很难为每种盐值与密码组合生成彩虹表,从而有效地抵御此类攻击。

六、MD5和 SHA1:为何不再安全?

曾几何时,MD5SHA1是广泛应用于密码存储和数据完整性校验的常用算法。然而,随着计算能力的提升和密码学研究的深入,这两种算法的弱点逐渐暴露,尤其是在抗碰撞性方面的不足,使得它们在当今的安全场景中不再适用。

MD5:早在 2004年,研究人员就已发现了 MD5的严重碰撞漏洞。碰撞攻击的出现使得攻击者可以生成两个不同的输入,它们具有相同的哈希值,从而削弱了 MD5的安全性。

SHA1:2017年,Google公开了一种有效的碰撞攻击方法,证明 SHA1的安全性已经不再足够强大。由于碰撞攻击的成本显著降低,SHA1逐渐退出了密码存储和数据完整性验证的主流应用。

目前,在密码存储和数据完整性验证中,建议使用更为安全的哈希算法,如SHA256SHA3,它们在抗碰撞性和抗暴力破解方面提供了更强的保障。此外,上文中提到的 KDF也不失为一种较好的选择。

七、密码存储的最佳实践

为了确保密码存储的安全性,安全行业有着以下公开的最佳实践,这些实践已经得到广泛采用,并应用于各类安全敏感的系统中:

永远不要以明文形式存储密码。这是密码存储中的基本原则,一旦数据库泄漏,将给系统中的用户信息带来灾难性后果。

使用强哈希算法或 KDF。推荐使用如Argon2bcryptPBKDF2这样的专用密码哈希函数,以提高暴力破解的难度。

为每个密码使用唯一的盐值。即使多个用户使用相同的密码,生成的哈希值也是唯一的,防止彩虹表攻击。

避免使用已被证明不安全的算法。如 MD5和SHA1等算法已不再适用于密码存储,应选择更为安全的替代方案。

定期审查和更新密码存储策略。密码存储的安全性并非一劳永逸,随着攻击技术的进步,持续跟踪密码学领域的最新发展,并对系统进行相应的调整,才是确保安全的长久之策。

结语

密码存储的安全性直接关系到整个系统的安全。随着现代攻击手段的不断升级,采用合理的加盐哈希技术、密钥派生函数,并定期更新安全策略,才能有效降低数据泄露的风险,保障用户的隐私与安全。在这个动态变化的领域中,持续的学习与实践是每一个安全从业者的必修课。

了解网络安全更多信息,欢迎前往【艾体宝】官方网站

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4257

    浏览量

    85646
  • 算法
    +关注

    关注

    23

    文章

    4599

    浏览量

    92617
  • 数据库
    +关注

    关注

    7

    文章

    3759

    浏览量

    64265
收藏 人收藏

    评论

    相关推荐

    电子密码

    ,所有输入清除。3、修改密码:在开锁状态下,再)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入新密码并按【D】,会听到两声提示音,表示重设
    发表于 07-26 15:59

    求4*4数字密码锁的C程序

    要求初始密码为六位,可以输入和保存新密码,最好是有图和程序,新人刚接触单片机,找份参考
    发表于 12-24 20:07

    单片机密码锁设计资料

    即可开锁,开锁后,开锁指示灯亮。修改密码时,首先按下“ # ”键,紧急着输入正确的6位原始密码后再次下“ # ”键,开锁指示灯亮,之后接着输入6位新密码后,再按下“ # ”键,再次输入新密码
    发表于 04-01 15:22

    基于单片机的电子密码

    初始密码,然后按“确认”键;②再按“设置”键,输入新密码,然后按“确认”键;③再次输入新密码,然后按“确认”键。这样密码设置就完成了。4、开锁者只有输入
    发表于 05-09 21:47

    基于单片机的电子密码锁设计

    初始密码,然后按“确认”键;②再按“设置”键,输入新密码,然后按“确认”键;③再次输入新密码,然后按“确认”键。这样密码设置就完成了。4、开锁者只有输入
    发表于 05-09 22:09

    数码管电子密码

    电子 密码锁,可设定新密码。推荐课程:课程名称:PCB电磁兼容设计案例分析与仿真解析课程链接:http://url.elecfans.com/u/05942d9ef
    发表于 10-24 10:27

    急急急!!!求C语言编写的单片机电子密码锁程序

    则开锁,表示不正确显示密码错误重新输入密码,当三次密码错误则发出报警;锁用发光二极管表示,亮表示锁开,当用户需要修改密码时,先按下键盘设置键后输入原来的
    发表于 04-18 10:24

    超全面!破解window开机密码方法

    忘记开机密码、简单的方法:  开机启动windows,进入欢迎界面后,会出现输入用户名密码提示框,这时候,同时按住Ctrl+Alt+Delete,会跳出
    发表于 06-03 14:40

    基于51单片机的密码

    并按下 # 键,此时听到两声提示,输入新的六位密码并按 D 键,再重复输入新密码并按 D ,会听到两声提示音,表示重设密码成功,内部保存新密码
    发表于 10-18 22:57

    教你如何修改NAS网络存储中的用户密码

    点击用户设置; 3.输入原密码新密码,点击应用; 4.应用后进入登录界面,输入新设置的密码,即可登录TOS系统。 第二种1.TOS桌面-控制面板-访问权限-用户; 2.选择用户,点击编辑; 3.输入
    发表于 02-01 17:44

    有没有方法在不使用STM32H7的情况下更新下个电源周期可用的密码运行时间呢?

    环境进行开发。目前使用Nucleo板。该应用程序是个嵌入式 Web 服务器,而浏览器是用户登录设备以更改设置等的客户端。我确实遇到过些文章,这些文章确实说可以更新存储在 MCU 闪存上的
    发表于 12-22 06:34

    i.MX6ULL ---- ElfBoard 的ELF1 板卡重新烧写完成后带默认密码方法

    New password: //在此处输入要更换的新密码密码不显示,直接输入即可 Bad password: too short. Warning: weak password (enter
    发表于 10-20 09:46

    基于明文长度的构建椭圆曲线密码方法

    针对存储椭圆曲线密码加密生成的密与明文相比需要的存储空间较多的问题,提出了种基于明文长度的构建椭圆曲线
    发表于 01-02 17:19 0次下载
    基于明文长度的构建椭圆曲线<b class='flag-5'>密码</b>密<b class='flag-5'>文</b>的<b class='flag-5'>方法</b>

    不知道嵌入式Linux系统下的root密码,修改新密码并进入系统

    今天朋友问不知道root 密码怎么修改。他这个系统是海思平台的嵌入式Linux系统。然后尝试了修改并进入系统。嵌入式Linux中的root 密码忘记了或者想破解别人系统的密码登陆进去
    发表于 11-01 17:59 14次下载
    不知道嵌入式Linux系统下的root<b class='flag-5'>密码</b>,修改<b class='flag-5'>新密码</b>并进入系统

    账号密码存储生成

    账号密码存储生成资料分享
    发表于 11-23 15:17 2次下载