跳到正文

密码哈希

Password Hashing

高级通用

密码哈希(Password Hashing)是把用户密码经过专门的单向算法处理后,再把结果存进数据库的做法。它解决的是数据库泄露时明文密码直接暴露的问题;用户登录时,系统会用同一套方案验证输入的密码,而不是取出原密码比对。

你可能会说:「帮我做注册和登录功能,数据库里别存用户原来的密码,但登录时还能核对他输得对不对。」

读之前建议先了解(这是一个高级概念)

动手看看

注册密码用户输入哈希处理生成随机盐账号库登录结果
1

注册时,用户设置密码。系统先生成随机盐,再用专门的密码哈希算法处理密码,不直接保存原文。

要点

  1. 1

    注册时只保存验证所需的信息

    用户设置密码后,后端用专门的密码哈希算法处理它,保存哈希结果和验证需要的参数。因为数据库里没有原密码,之后也就不能靠“读出密码”来完成登录。

  2. 2

    登录时验证输入而非还原密码

    用户登录时,后端读取该账号保存的哈希信息,再用密码验证函数检查这次输入。验证函数会按保存的参数处理输入并判断是否匹配;产品只拿到通过或失败的结果。

  3. 3

    盐值和计算成本各有作用

    每个密码配不同的随机盐值,可以让相同密码不直接产生相同的存储结果;有计算成本的密码哈希算法,则让攻击者批量猜密码更费资源。盐值可以随哈希结果一起保存。

  4. 4

    忘记密码走重设而非找回

    既然系统没有可读的原密码,“找回旧密码”就做不到。用户忘记密码时,我们先核实他对账号的控制权,再让他设置新密码,并用新密码生成新的哈希结果。

容易混淆的地方

普通哈希也能把输入变成摘要,但通常算得很快,不适合直接存人类设置的密码;密码哈希会加入盐值,并采用可配置计算成本的专门算法。加密则能用密钥解密,适合确实需要取回原文的数据。密码哈希负责保存登录凭据时降低泄露风险,不等于完成了整个身份认证流程。

什么时候用

适合用

  • 你在做网站或 App 的账号注册与密码登录,需要在服务端保存可供验证、却不能直接读回的密码信息。
  • 你给现有后台加入修改密码功能,需要验证旧密码,并在用户设置新密码后更新存储结果。
  • 你在设计忘记密码流程,需要让 AI Agent 明白只能重设密码,不能从数据库取回旧密码。

不适合用

  • 产品只支持第三方登录,自己不接收也不保存用户密码;这时接入 OAuth 等登录流程,不必建立密码哈希存储。
  • 你要保存之后还得展示给用户的私密资料;密码哈希无法还原内容,这类需求要按访问方式考虑加密与权限控制。
  • 你要存的是系统生成的高熵 API 密钥,而不是用户自设密码;可以设计密钥摘要验证方案,不必直接套用密码哈希流程。

练一练

你让 AI Agent 给一个新网站做邮箱密码登录。它提出三种数据库设计,你会选哪一种?

让 AI 帮你做

请为这个网站实现邮箱密码注册与登录:在服务端使用成熟的密码哈希方案,保存哈希结果及验证所需参数,不保存或记录明文密码;登录时调用对应的验证函数。忘记密码走身份核实后的重设流程,并说明你选用的库与测试方式。

接下来学什么