《白帽子讲 Web 安全》之身份认证

目录

引言

一、概述

二、密码安全性

三、认证方式

(一)HTTP 认证

(二)表单登录

(三)客户端证书

(四)一次性密码(OTP)

(五)多因素认证

(六)FIDO

四、攻击方式与单点登录

(一)暴力破解和撞库

(二)单点登录

(三)Aereo CAS 安全注意事项

五、认证相关安全概述

六、OAuth 相关

刷新令牌机制

七、OIDC 相关

八、SAML 相关

九、CAS 相关

总结


引言

在 Web 应用的安全领域中,身份认证是至关重要的一环。吴翰清和叶敏所著的《白帽子讲 Web 安全》一书中的身份认证章节,为我们深入剖析了这一关键领域。接下来,让我们一同对这一章节的内容进行全面总结与知识分享。

一、概述

在 Web 应用的安全体系里,“认证” 和 “授权” 是两个截然不同却又紧密关联的概念。

认证,其核心作用在于识别用户究竟是谁,就好比在一个大型派对门口,保安通过查看邀请函或者证件来确认每一位来宾的身份。

授权,则是决定用户能做什么,比如在派对中,有些区域只有 VIP 嘉宾才能进入,这就是授权在发挥作用。身份认证作为 Web 应用的基本安全功能,是保障用户数据和应用功能安全的第一道防线。

常见的认证方式中,用户名与密码的组合是最为大众所熟知的,无论是我们日常使用的社交账号、电子邮箱,还是各种在线服务平台,用户名和密码的输入框总是如影随形。

二、密码安全性

密码,作为最为常见的认证手段,拥有使用成本低的显著优势。几乎所有互联网用户都能轻松理解并运用密码来保护自己的账户。然而,它也存在一个致命的弱点,那就是极易被破解。在现实生活中,我们常常能听到一些用户因为设置了过于简单的密码,导致账户被盗用的新闻。为了提升密码的安全性,在设计密码策略时,诸多因素需要纳入考量。

密码长度是一个重要因素,一般来说,长度越长的密码,其被破解的难度就越大。例如,一个 8 位纯数字密码,通过计算机暴力破解可能只需要几分钟甚至更短时间,而一个 16 位包含数字、字母、特殊字符的密码,破解时间则可能会延长到数年甚至更久。

密码复杂度同样不容忽视。复杂的密码应包含大小写字母、数字以及特殊字符的组合。

以 “Abc@123456” 这样的密码为例,它既有大写字母 “A”,小写字母 “bc”,数字 “123456”,还有特殊字符 “@”,相较于单纯的数字或字母密码,安全性大大提高。同时,用户应避免使用弱密码,像 “123456”、“password”、“admin” 这类过于简单且常见的密码,几乎是黑客破解账户的首选目标。

对于网站和应用开发者而言,存储密码时进行哈希处理并 “加盐” 是至关重要的操作。

哈希处理是将密码通过特定的哈希函数转换为一串固定长度的哈希值进行存储,这样即使数据库被泄露,黑客获取到的也只是哈希值而非明文密码。而 “加盐” 则是在哈希处理前,向密码中添加一段随机字符串,增加密码的复杂度。比如,用户密码为 “mypassword”,盐值为 “randomsalt”,那么实际进行哈希处理的是 “mypasswordrandomsalt”,这使得黑客通过彩虹表等方式破解密码的难度大幅增加。

import hashlib
import os

password = "mypassword"
salt = os.urandom(16)   # 生成随机盐值
hashed_password = hashlib.pbkdf2_hmac('sha256',  password.encode('utf-8'),  salt, 100000)

print(f"盐值: {salt}")
print(f"哈希后的密码: {hashed_password}")

三、认证方式

(一)HTTP 认证

  1. 基本认证:基本认证是 HTTP 协议中较为简单的一种认证方式。当用户访问需要认证的资源时,服务器会返回一个 401 Unauthorized 响应,提示用户输入用户名和密码。用户输入的用户名和密码会以明文的形式,经过 Base64 编码后在 HTTP 请求头中发送给服务器。例如,用户名 “user” 和密码 “password” 经过 Base64 编码后变为 “dXNlcjpwYXNzd29yZA==”,并在请求头中以 “Authorization: Basic dXNlcjpwYXNzd29yZA==” 的形式发送。这种方式存在明显的密码泄露风险,因为 Base64 编码很容易被解码,一旦网络被监听,用户名和密码就会暴露无遗。
  2. 摘要认证:摘要认证在一定程度上弥补了基本认证的安全缺陷。它不再以明文形式传输密码,而是通过计算密码的哈希值来进行认证。在摘要认证过程中,服务器会发送一个包含随机数(nonce)的挑战信息给客户端,客户端使用用户名、密码、随机数以及其他相关信息计算出一个摘要值,再将这个摘要值发送给服务器。服务器收到摘要值后,使用相同的算法和信息计算出一个预期的摘要值,若两者一致,则认证成功。这种方式相较于基本认证,安全性更高,因为即使黑客截获了网络数据包,也无法轻易获取用户的密码。

(二)表单登录

表单登录是我们在日常上网过程中最为常见的登录方式。无论是购物网站、社交媒体平台还是在线办公系统,几乎都采用表单登录的形式。用户在登录页面输入用户名和密码,点击登录按钮后,表单数据会被提交到服务器进行验证。

然而,这种登录方式面临着钓鱼攻击的严峻威胁。钓鱼攻击通常通过仿冒正规网站的登录页面,诱使用户输入用户名和密码。

例如,黑客可能会创建一个与知名银行网站极为相似的假网站,当用户误以为是真实银行网站而输入账号密码时,这些信息就会被黑客获取。

在表单登录过程中,前端加密密码的实际意义并不大。因为前端代码是运行在用户浏览器中的,黑客可以通过各种手段,如查看网页源代码、使用浏览器插件等,轻松获取前端加密的方式和密钥,从而破解加密后的密码。此外,应用在处理用户登录错误时,应模糊给出错误信息。

比如,当用户输入错误的用户名或密码时,统一提示 “用户名或密码错误”,而不是明确指出是用户名错误还是密码错误。这是因为如果明确指出错误类型,黑客可以通过不断尝试用户名,根据错误提示来确定有效的用户名,进而进行针对性的密码破解攻击

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表单登录示例</title>
</head>
<body>
    <form action="login.php"  method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username"><br>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password"><br>
        <inp
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值