网站怎么经过身份验证
你打开一个网站,网站浏览器和服务器之间其实在悄悄对暗号。经过最常见的身份暗号叫“用户名+密码”,但这只是验证最表层的东西。真正决定你能不能进去、网站进去后能干什么的经过,是身份背后一整套验证机制。 拿我自己的验证经历来说。有一次我帮朋友排查他的网站小型电商站,用户登录后居然能看到别人的经过订单。问题出在哪?身份他只做了“密码对了就给通过”,没管这个用户到底是验证谁、该看什么。网站身份验证不是经过一道门,而是身份一串链条,任何一环断了都会出事。 服务器不会傻到直接存你的密码。它存的是密码经过哈希函数计算后的结果,比如bcrypt或argon2。你输入密码,服务器用同样的算法算一遍,比对两个哈希值。就算数据库被拖走,攻击者也很难反推出原始密码。这里有个细节:哈希还要加“盐”,就是随机字符串,防止两个相同密码产生相同的哈希。不加盐的哈希,用彩虹表一查就破。 HTTP本身是无状态的。你登录成功,下一个请求服务器怎么知道还是你?两种主流做法。一种是服务器生成一个session ID,存在Cookie里,服务器自己保留一份映射表。另一种是JSON Web Token(JWT),服务器把用户信息签个名,直接发给客户端,下次请求带回来,服务器验签就行,不用存。JWT省服务器内存,但注销麻烦——签出去的令牌在过期前一直有效。我见过一个项目用JWT做登录,用户改了密码,旧令牌还能用,这就是设计时没考虑失效机制。 光有密码不够。很多网站加第二因素:短信验证码、TOTP应用(比如Google Authenticator)、硬件密钥(YubiKey)。短信验证码容易被SIM卡劫持,TOTP更安全,硬件密钥最强。另一种思路是无密码登录,比如魔法链接——你输入邮箱,网站发一封带一次性链接的邮件,点进去就登录。或者WebAuthn,用设备指纹或PIN代替密码。GitHub早就支持WebAuthn,我试过,比输密码快,而且钓鱼网站拿不到凭证。 “用Google账号登录”背后是OAuth 2.0。你点按钮,跳到Google,Google验证你身份,然后发一个授权码给原网站,原网站拿授权码换访问令牌,再拿令牌去Google要你的基本信息(比如邮箱)。整个过程原网站碰不到你的Google密码。OAuth不是身份验证协议,它是授权协议,但OpenID Connect在它上面加了身份层,才变成“登录”。很多开发者搞混这两者,把OAuth当登录用,结果出现安全漏洞。 2018年,某社交平台的一个API端点只检查了“令牌是否有效”,没检查“令牌属于哪个用户”。攻击者拿自己的有效令牌,改一下请求里的用户ID,就能读写别人的数据。这叫水平越权。修复方法很简单:每个请求都要从令牌里解析出用户ID,而不是信任客户端传来的ID。但就是这种简单逻辑,很多团队在赶进度时会漏掉。 身份验证没有银弹。密码加盐哈希、会话管理、第二因素、OAuth,每层都有坑。写代码时多问一句:这个请求凭什么相信对方就是它声称的那个人?答案越具体,系统越安全。密码不是存成明文,而是存成“指纹”
会话与令牌:登录之后怎么记住你
双因素与无密码:多一层或换一种
OAuth与单点登录:让别人的网站帮你验证
一个真实案例:验证逻辑写错会怎样
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-