用户密码怎么加密

先纠正一个概念,MD5不是加密是哈希,它把任意内容压成一段固定长度的一个指纹,单向不可逆,看起来很安全,问题出在它太快了,攻击者拿到密码字典一顿跑,每秒能算几亿次,这个叫暴力破解,更狠的是彩虹表,别人早就把海量常见的密码的哈希值提前算好,你库里的哈希一旦泄露,它直接查表,一秒就把密码还原了。
正确的加密流程:
(1)加盐,给每个用户生成一段随机的字符串,跟密码拼在一起再哈希,盐要和哈希结果一块存起来,这一步就能解决两个问题,彩虹表直接废了,因为攻击者提前算好的表,对不上你加了随机盐之后的结果,再一个两个用户就算密码一样,因为盐不同,存进去的哈希也完全不一样,攻击者没法一次撞出一片人,关键是,盐必须随机,每个用户都不一样,全站共用一个盐等于白加了。光加盐还不够,MD5算得快的毛病还在,所以现在真正主流的做法是专门为密码设计的慢哈希算法。比如,跟MD5反过来,故意设计得慢,正常用户登录,就验证一次,慢个零点几秒,完全没有感觉,攻击者暴力破解要算几十亿次,每次都要多算多花算力,破解成本直线上升,而且bcrypt这些算法,把盐内置在结果里,不用自己单独存。

AI回答:
这道题的核心考点是密码存储的安全性设计,首先要做一个基础概念纠偏:MD5 是哈希摘要算法,不是加密算法。


一、概念先理清:哈希 ≠ 加密

加密是双向可逆的过程,有加密必有对应的解密;而哈希是单向摘要算法,作用是将任意长度的输入映射为一段固定长度的摘要值(也叫数字指纹),理论上不可逆,无法从摘要值还原出原始输入。

二、为什么绝对不能直接用 MD5 存密码

MD5 的设计目标是快速完整性校验,计算速度极快,GPU 环境下单秒可完成数亿次哈希计算,直接用于密码存储存在两大致命风险:

  1. 暴力破解:攻击者拿到数据库的哈希值后,用密码字典批量计算哈希进行比对,每秒可尝试上亿种组合,弱密码很快就能被破解。
  2. 彩虹表攻击:攻击者预先计算好海量常见密码的哈希值,形成映射表;拿到数据库哈希后直接查表匹配,秒级就能还原出原始密码。

三、第一阶段优化:加盐哈希

针对彩虹表攻击,行业最早的标准方案是加盐(Salt)哈希:

  1. 实现逻辑:每个用户注册时,生成一段全局唯一的随机字符串(盐),将盐和用户密码拼接后再计算哈希,最终把「盐 + 哈希结果」一起存入数据库。
  2. 解决的核心问题
    • 让彩虹表彻底失效:盐是每个用户独立随机生成的,攻击者无法提前预计算出对应所有随机盐的哈希表。
    • 避免密码批量泄露:即使用户设置了相同的密码,因为盐不同,最终存储的哈希值也完全不同,攻击者无法一次碰撞出多个用户。
  3. 关键原则:盐必须随机、每个用户唯一;全站共用同一个盐等于没加,攻击者依然可以针对这个固定盐做预计算。
  4. 局限性:加盐只解决了彩虹表和批量碰撞问题,没有解决 MD5 本身计算速度快的问题,单条密码的暴力破解成本依然很低。

四、当前行业主流方案:密码专用慢哈希算法

这是目前生产环境的标准做法,它的设计思路和普通哈希完全相反:普通哈希追求计算越快越好,而密码专用哈希故意设计成计算缓慢、算力成本高,通过可配置的复杂度人为提升破解成本。

  1. 核心逻辑:正常用户登录只需要计算 1 次哈希,耗时几毫秒到几十毫秒,用户完全无感知;但攻击者暴力破解需要尝试上亿次组合,整体算力成本指数级上升,破解变得极不经济。
  2. 主流实现算法
    • bcrypt:工业界应用最广泛的方案,内置自动生成随机盐,最终输出的哈希字符串里已经内嵌了盐、迭代次数等参数,无需单独存储盐字段,迭代成本可灵活配置。
    • PBKDF2:基于迭代哈希的密钥派生算法,可自定义迭代次数和底层哈希函数,标准化程度高。
    • Argon2:目前密码学领域推荐的最新标准,支持配置时间成本、内存占用、并行度,对抗 GPU/ASIC 暴力破解的能力更强。

五、总结

密码存储的技术演进逻辑是:快速通用哈希 → 加盐哈希抵御彩虹表 → 专用慢哈希提升暴力破解成本,核心目标是在不影响正常用户体验的前提下,最大化攻击者的破解成本。

posted @ 2026-09-15 14:47  堭鍙銤  阅读(3)  评论(0)    收藏  举报