当前位置: 首页 > news >正文

《白帽子讲 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 ospassword = "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><input type="submit" value="登录"></form>
</body>
</html>

(三)客户端证书

客户端证书主要用于验证服务器的可信性,在企业内部网络环境中应用较为广泛。

其工作原理是客户端和服务器之间通过交换数字证书来验证彼此的身份。数字证书由权威的证书颁发机构(CA)颁发,包含了证书持有者的公钥、身份信息以及 CA 的数字签名等内容。

例如,企业内部的员工在访问公司的内部办公系统时,员工的电脑上安装有公司颁发的客户端证书,当员工尝试访问系统时,服务器会要求客户端提供证书进行验证。只有当服务器验证客户端证书合法且与员工身份匹配时,才允许员工访问系统

客户端证书的安全性极高,因为证书的私钥存储在客户端设备中,只有拥有该设备的用户才能使用证书进行认证。而且,证书的颁发和管理由企业或权威机构严格把控,大大降低了被伪造的风险。然而,实施客户端证书认证也存在一定的成本。企业需要投入资金建立证书颁发机构,为员工发放和管理证书,同时员工也需要在设备上安装和维护证书,这在一定程度上增加了企业的管理成本和员工的使用成本。

(四)一次性密码(OTP)

一次性密码,也就是我们常说的动态口令,是一种基于密钥和时间戳生成的临时密码。它的工作机制是一个典型的挑战 / 应答过程。以常见的基于时间的一次性密码(TOTP)为例,用户在使用支持 OTP 的应用时,首先需要在手机上安装相应的 OTP 生成器应用,并将其与需要认证的账户进行绑定。绑定过程中,服务器会为用户生成一个唯一的密钥,并将其存储在服务器端和用户的 OTP 生成器应用中。

当用户需要登录时,OTP 生成器应用会根据当前的时间戳以及之前绑定的密钥,按照特定的算法生成一个一次性密码。这个密码在一定时间内(通常为 30 秒到 1 分钟)有效。用户将这个一次性密码输入到登录页面,服务器收到密码后,使用相同的密钥和当前时间戳,按照同样的算法计算出一个预期的一次性密码。若两者一致,则认证成功。这种方式极大地提高了账户的安全性,因为即使黑客获取了用户的用户名和密码,由于一次性密码的时效性,他们也无法利用这些信息成功登录。

import pyotp# 生成一个新的密钥
secret = pyotp.random_base32() 
totp = pyotp.TOTP(secret)# 获取当前的一次性密码
current_otp = totp.now() 
print(f"当前的一次性密码: {current_otp}")

OTP动态口令实现 

// Google Authenticator算法核心
public class TOTP {public static String generateCode(String secret) {long time = System.currentTimeMillis() / 30000;byte[] key = Base32.decode(secret);byte[] data = ByteBuffer.allocate(8).putLong(time).array();// HMAC-SHA1运算...return truncate(hash).toString();}
}

(五)多因素认证

多因素认证,顾名思义,是通过多种不同类型的认证因素来确认用户身份。

常见的认证因素包括用户知道的信息(如密码)、用户拥有的物品(如手机、令牌)以及用户本身的生物特征(如指纹、面部识别)。多因素认证的强度明显高于单因素认证。

例如,在银行的网上转账业务中,用户不仅需要输入密码,还需要输入手机收到的动态验证码,甚至可能需要进行指纹识别。这样,即使黑客获取了用户的密码,由于他们没有用户的手机或指纹,也无法完成转账操作

在实际应用中,正常情况下可以使用单因素认证,以提高用户体验的便捷性。

比如用户在日常登录一些普通的资讯类网站时,使用用户名和密码进行认证即可。但当出现异常情况,如用户在异地登录、更换设备登录或者进行涉及资金等重要操作时,就需要启用多因素认证来提升安全性,确保用户账户的安全。

(六)FIDO

FIDO(Fast Identity Online)发布了开放的身份认证标准,其中包含 UAF(Universal Authentication Framework)和 U2F(Universal Second Factor)协议

FIDO 标准支持生物识别等多种认证方式,为用户提供了更加便捷和安全的认证体验。以 U2F 协议为例,它允许用户使用支持 U2F 的设备,如 USB 密钥、手机等,作为第二因素进行认证。当用户登录支持 U2F 的网站时,网站会向用户的 U2F 设备发送一个挑战信息,用户只需将 U2F 设备插入电脑或在手机上确认操作,设备就会生成一个响应信息发送回网站,完成认证过程。

这种方式可以实现无密码或多因素认证。对于无密码认证场景,用户可以通过生物识别(如指纹、面部识别)解锁 U2F 设备,然后使用设备进行认证,无需再记忆复杂的密码。而在多因素认证场景中,结合用户已有的用户名和密码,再加上 U2F 设备的认证,大大增强了账户的安全性。FIDO 标准的推广和应用,有望改变传统的密码认证模式,为用户提供更加安全、便捷的身份认证解决方案。

FIDO无密码认证流程

sequenceDiagramparticipant Userparticipant Clientparticipant Authenticatorparticipant Relying PartyUser->>Client: 发起登录Client->>Relying Party: 获取挑战Relying Party->>Client: 返回挑战+参数Client->>Authenticator: 签名请求Authenticator->>User: 生物识别验证User->>Authenticator: 完成验证Authenticator->>Client: 返回签名Client->>Relying Party: 提交认证Relying Party-->>Client: 登录成功

四、攻击方式与单点登录

(一)暴力破解和撞库

  1. 暴力破解:暴力破解是一种简单粗暴的攻击方式。黑客事先准备好一个包含大量弱密码的列表,同时结合常用的用户名列表,通过自动化工具不断尝试用这些用户名和密码组合去登录目标系统。例如,黑客可能会使用一个脚本,从用户名列表中依次取出用户名,再从弱密码列表中依次取出密码,不断向目标网站的登录接口发送请求。如果某个组合能够成功登录,那么黑客就获取了用户的账户信息。这种攻击方式对于那些使用弱密码的用户来说,具有很大的威胁性。
  2. 撞库:撞库攻击利用了用户在不同网站使用相同用户名和密码的习惯。黑客通过各种非法手段获取到某个网站的用户数据库,其中包含用户名和密码(可能是经过哈希处理的)。然后,他们将这些用户名和密码在其他网站上进行尝试登录。因为很多用户为了方便记忆,会在多个网站使用相同的账号密码组合,所以撞库攻击往往能够成功获取用户在其他网站的账户信息。比如,黑客获取了一个小型论坛的用户数据库,然后用其中的用户名和密码尝试登录一些知名的电商平台或社交网站,一旦有用户在这些平台使用了相同的账号密码,其账户就可能被盗用。
  3. 现代撞库攻击链
    # Hydra暴力破解示例
    hydra -L userlist.txt -P passlist.txt ftp://192.168.0.1# 防御策略四层架构:
    1. 网络层:IP信誉库(如Cloudflare防火墙)
    2. 应用层:验证码(Google reCAPTCHA v3)
    3. 数据层:密码策略(zxcvbn强度评估)
    4. 监控层:异常登录检测(UEBA系统)

(二)单点登录

在传统的应用架构中,每个应用都拥有独立的账号系统。这意味着用户在使用多个应用时,需要分别在每个应用中注册账号并记住不同的用户名和密码。例如,用户在使用公司内部的办公系统、邮件系统、文件共享系统等多个应用时,需要为每个应用设置不同的账号密码,这给用户带来了极大的不便。而且,对于企业来说,管理多个独立的账号系统也增加了管理成本和安全风险。

单点登录(Single Sign-On,简称 SSO)的出现,有效地解决了这一问题。单点登录允许用户使用一组凭证(如用户名和密码)登录到一个中心认证系统,然后在访问其他相关应用时,无需再次输入用户名和密码。以企业内部的办公环境为例,用户通过单点登录系统登录到公司的统一认证平台后,当他访问公司的邮件系统、OA 系统等其他内部应用时,这些应用会自动从单点登录系统获取用户的认证信息,确认用户身份后允许用户直接访问,无需用户再次进行登录操作。这样,不仅提高了用户的使用便捷性,也降低了企业的管理成本和安全风险。

(三)Aereo CAS 安全注意事项

Aereo CAS 是一种特定的单点登录解决方案。官方建议通过服务管理工具来处理 service 中的 URL,这是因为如果直接公开 service 中的 URL,可能会导致互联网上的非法用户轻易访问到相关服务,从而引发安全风险。同时,要避免 service 中的 URL 跳转至不可信网站。例如,如果一个恶意攻击者通过某种手段篡改了 service 中的 URL,使其跳转到一个钓鱼网站,那么用户在使用 Aereo CAS 进行单点登录时,就可能会在不知情的情况下将自己的账号密码输入到钓鱼网站,导致账户信息泄露。

在使用 Aereo CAS 时,默认密钥问题也需要特别关注。在一些低版本的 Aereo CAS 中,存在反序列化漏洞风险。黑客可以利用这些漏洞,通过构造恶意的序列化数据,在应用程序反序列化这些数据时执行任意代码,从而获取系统权限或者进行其他恶意操作。为了避免这种风险,用户应及时修改默认密钥,使用高强度、随机生成的密钥,以增强系统的安全性。

CAS协议安全实现

@startuml
actor User
participant "应用系统 (SP)" as SP
participant "CAS Server" as CASUser -> SP: 访问资源
SP -> User: 重定向到CAS登录
User -> CAS: 提交凭证
CAS -> User: 颁发Service Ticket
User -> SP: 提交Ticket
SP -> CAS: 验证Ticket
CAS -> SP: 返回用户身份
SP -> User: 授权访问资源
@enduml

五、认证相关安全概述

认证在 Web 应用安全中起着至关重要的作用,它解决了 “用户是谁” 的关键问题,是保障整个应用安全的核心环节。认证手段多种多样,不同的认证方式各有其优缺点。通过将多种认证方式组合使用,可以有效地增强安全强度。例如,结合密码认证和一次性密码认证,即使密码被泄露,由于一次性密码的时效性,黑客也无法轻易登录用户账户。

传统的密码认证方式虽然使用广泛,但由于弱密码的存在以及密码泄露的风险,正逐渐受到新的认证方式的挑战。随着技术的不断发展,如生物识别技术、FIDO 标准等新的认证方式和标准不断涌现,它们为用户提供了更加安全、便捷的认证体验。

主流的单点登录系统在提升用户登录便捷性方面发挥了重要作用。然而,如果使用不当,也会带来一定的风险。比如,单点登录系统的认证中心一旦被攻破,黑客就可能获取到所有用户的认证信息,进而访问用户在各个相关应用中的账户。此外,在一些单点登录系统中,还存在用户无法完全退出的问题。例如,用户在使用完某个应用后,虽然在该应用中点击了退出登录,但由于单点登录系统的某些机制问题,用户在其他相关应用中仍然处于登录状态,这可能会导致用户的账户信息在不知情的情况下被泄露

六、OAuth 相关

OAuth 2.0 是目前互联网领域中极为重要的授权协议。它定义了不同类型的授权模式,每种模式都有其特定的适用场景和操作流程。

  1. 授权码模式:这是 OAuth 2.0 中最为常用的授权模式。以用户使用第三方应用(如某音乐播放器)登录到某音乐平台为例,用户在音乐播放器中点击登录该音乐平台的按钮后,音乐播放器会将用户重定向到音乐平台的授权页面。在授权页面,用户需要输入自己在音乐平台的账号密码进行登录,并授权音乐播放器访问自己在音乐平台的相关资源(如音乐收藏列表)。音乐平台验证用户身份并获得用户授权后,会生成一个授权码,并将用户重定向回音乐播放器,同时在重定向的 URL 中带上这个授权码。音乐播放器收到授权码后,使用自己在音乐平台注册时获得的客户端 ID 和客户端密钥,向音乐平台的令牌端点发送请求,换取访问令牌。音乐播放器获得访问令牌后,就可以使用这个令牌访问用户在音乐平台的相关资源。
  2. 隐式授权模式:隐式授权模式适用于一些纯前端的应用,如在浏览器中运行的 JavaScript 应用。在这种模式下,用户同样在第三方应用中发起登录请求,第三方应用将用户重定向到授权服务器的授权页面。用户授权后,授权服务器会直接在重定向回第三方应用的 URL 中返回访问令牌,而不需要通过中间的授权码交换步骤。这种模式的优点是简单直接,但由于访问令牌直接暴露在 URL 中,存在一定的安全风险,所以适用于一些对安全性要求相对较低且资源访问权限有限的场景。
  3. 客户端凭证模式:客户端凭证模式主要用于服务端应用之间的授权。例如,一个企业内部的数据分析系统需要访问企业的数据库获取数据进行分析。在这种情况下,数据分析系统作为客户端,向授权服务器申请访问令牌时,使用的是自己的客户端 ID 和客户端密钥,而不需要用户的参与。授权服务器验证客户端的身份后,会为其颁发访问令牌,客户端使用这个令牌就可以访问授权范围内的资源,如数据库中的特定数据表。

刷新令牌机制

在 OAuth 2.0 中,刷新令牌机制是一项重要的特性。访问令牌通常有较短的有效期,这是为了降低令牌泄露带来的风险。一旦访问令牌过期,应用就无法再使用它访问受保护的资源。而刷新令牌的作用就是在访问令牌过期时,用于获取新的访问令牌,而无需用户再次进行完整的授权流程。

继续以音乐播放器为例,当音乐播放器使用授权码模式获取到访问令牌和刷新令牌后,在访问令牌的有效期内,它可以顺利访问用户在音乐平台的资源。假设访问令牌的有效期是 1 小时,当 1 小时过去后,音乐播放器再次尝试访问资源时,音乐平台会返回一个表示令牌过期的错误响应

七、OIDC 相关

OIDC(OpenID Connect)构建于 OAuth 2.0 协议之上,它为 OAuth 2.0 增添了关键的身份认证功能,从而使开发者能够轻松实现用户身份的验证与授权。许多知名社交网站,如 Google、Facebook 等,都大力支持 OIDC,这为用户登录各类应用带来了极大的便利。

从技术层面深入剖析,OIDC 在 OAuth 2.0 的基础上引入了一系列新的概念与规范。它定义了专门用于描述用户身份信息的 ID 令牌(ID Token)。当用户使用支持 OIDC 的社交账号登录第三方应用时,流程如下:用户在第三方应用中点击使用社交账号登录的按钮,第三方应用随即引导用户跳转至对应的社交网站授权页面。用户在该页面输入账号密码并授权第三方应用访问其部分信息后,社交网站作为 OIDC 的身份提供者(Identity Provider,简称 IdP),会生成一个包含用户身份信息的 ID 令牌以及用于访问用户资源的访问令牌。这两个令牌会通过特定的重定向流程传递回第三方应用。第三方应用收到令牌后,通过验证 ID 令牌的签名等方式,确认用户身份的真实性与合法性,进而完成整个登录过程。

以用户使用 Google 账号登录一款在线文档编辑应用为例,用户在文档编辑应用中选择用 Google 登录,页面跳转到 Google 的登录与授权界面。用户登录并授权后,Google 会向文档编辑应用返回 ID 令牌和访问令牌。文档编辑应用验证 ID 令牌,从中获取用户的邮箱、姓名等身份信息,为用户创建或关联对应的应用账号,使用户能便捷地开始使用应用功能,而无需在该应用中重新注册账号。这种方式不仅简化了用户注册登录流程,还减少了用户因需记忆众多不同平台账号密码而带来的困扰,同时借助社交平台强大的安全体系,提升了整个登录过程的安全性。

八、SAML 相关

SAML(Security Assertion Markup Language),即安全断言标记语言,在身份提供者(IdP)和服务提供者(Service Provider,简称 SP)之间扮演着关键的数据交换桥梁角色,主要用于交换身份验证和授权数据。它采用 XML 格式来结构化和传输这些重要信息,具有良好的通用性和扩展性。

在简化的 SAML 协议认证流程中,用户首先访问服务提供者(SP)的应用系统。

例如,一家企业员工试图访问外部合作公司提供的特定业务应用(该应用作为 SP)。当员工尝试访问时,该应用发现员工未经过身份验证,于是将用户的浏览器重定向到身份提供者(IdP)的认证页面,通常是企业内部的统一身份认证系统。员工在身份提供者页面输入自己的企业账号密码进行登录。身份提供者验证员工身份无误后,会生成包含用户身份信息、权限信息等内容的 SAML 断言(Assertion)。这个断言本质上是一个经过数字签名的 XML 文档,以确保信息的完整性和真实性。随后,身份提供者将用户的浏览器重定向回服务提供者的应用,并在重定向的请求中携带 SAML 断言。服务提供者接收到断言后,通过验证签名等步骤确认断言的有效性,从而获取用户的身份和授权信息,完成用户的认证过程,允许用户访问相应的应用功能。

SAML 协议在企业间的跨域单点登录场景中应用极为广泛。比如,企业与多个合作伙伴有业务往来,员工需要访问合作伙伴提供的各类服务系统。通过 SAML 协议,企业内部的身份认证系统作为身份提供者,能够与合作伙伴的服务提供者系统进行高效对接,实现员工在不同企业应用间的便捷切换,无需重复登录,同时保障了身份验证和授权信息在不同系统间安全、准确地传递。

九、CAS 相关

CAS(Central Authentication Service),即中央认证服务,是一种广泛应用的单点登录解决方案。它致力于解决用户在访问多个相互关联的应用系统时,避免重复输入用户名和密码的繁琐问题。

其工作流程具有清晰的逻辑架构。当用户尝试访问某个应用(我们称之为客户端应用)时,客户端应用首先检查用户是否已经通过认证。若未认证,客户端应用会将用户的请求重定向到 CAS Server。

例如,在一个大型企业内部,员工试图访问公司的财务报销系统,而该系统与 CAS Server 集成。当员工访问报销系统时,报销系统发现员工未登录,于是将员工的浏览器重定向到公司统一的 CAS Server 登录页面。员工在 CAS Server 页面输入自己的企业账号密码进行认证。CAS Server 验证用户身份成功后,会为用户生成一个唯一的票据(Ticket),这个票据类似于一把临时钥匙。随后,CAS Server 将用户的浏览器重定向回客户端应用(财务报销系统),并在重定向的 URL 中附上这个票据。客户端应用接收到票据后,会将票据发送回 CAS Server 进行验证。CAS Server 确认票据有效后,向客户端应用返回用户的身份信息,客户端应用据此确认用户身份,允许用户访问系统资源,完成整个认证流程。

通过 CAS 实现单点登录,大大提升了企业内部多个应用系统的用户体验,员工只需在 CAS Server 进行一次登录,即可顺畅访问多个关联应用,同时减轻了企业对多个应用系统分别进行用户认证管理的负担,集中化的认证管理也有助于提高整体的安全性,降低因多套认证系统带来的安全风险。

总结

在 Web 应用安全领域,身份认证犹如一座大厦的基石,其涉及的各类技术和协议相互交织,共同为用户和企业的数据安全保驾护航。随着技术的不断演进,我们需时刻关注这些认证机制的发展与变化,以应对日益复杂的网络安全挑战。

相关文章:

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

目录 引言 一、概述 二、密码安全性 三、认证方式 &#xff08;一&#xff09;HTTP 认证 &#xff08;二&#xff09;表单登录 &#xff08;三&#xff09;客户端证书 &#xff08;四&#xff09;一次性密码&#xff08;OTP&#xff09; &#xff08;五&#xff09;多因…...

发行基础:宣传片

转载自官方文件 --------------- 宣传片 概览 作为 Steam 发行流程的一部分&#xff0c;您需要上传自己产品的宣传片。 宣传片将会显示在您的产品商店页的顶端&#xff0c;通常是您的潜在客户第一眼会看见的内容。 最佳实践 在 Steam 平台上&#xff0c;宣传片是产品营销中…...

PAT线上考试注意细节(甲/乙级)

闲谈 从此以后&#xff01;参加竞赛&#xff01; 都要为自己留够足够的时间练习&#xff01; 都要为自己留够足够的时间练习&#xff01; 都要为自己留够足够的时间练习&#xff01; 重要的事情说三遍&#xff0c;毕竟这只是我参加各种竞赛的开始&#xff01; \(&#xff…...

测试用大模型组词

已经把hanzi-writer的js的调用、hanzi-writer调用的数千个汉字的json文件&#xff0c;全都放在本地了。虽然用的办法还是比较笨的。我注意到 大模型也可以部署本地&#xff0c;虽然使用频率低的情况下不划算。 尝试直接通过html的javascript通过api key调用大语言模型&#x…...

【算法 C/C++】一维差分

2025 - 03 - 08 - 第 69 篇 Author: 郑龙浩 / 仟濹 【一维差分】 文章目录 前缀和与差分 - 我的博客差分(一维)1 大体介绍(1)**1 原数组 2 差分数组 3 差分数组的前缀和数组**&#xff08;2&#xff09;记录区间操作的边界 2 差分原理是什么&#xff1f;&#xff1f;&#xff…...

前后端数据加密传输【最佳方案】

AES和RSA区别 算法类型安全性密钥长度/输出长度速度应用场景AES对称加密高128位、192位、256位快适用于大规模数据加密&#xff0c;入HTTPS协议的数据传输RSA非对称加密高1024位、2048位、4096位较慢适用于数据安全传输、数字签名和身份验证 综上&#xff1a;兼顾安全性和性能…...

爬虫案例七Python协程爬取视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例七协程爬取视频 提示&#xff1a;以下是本篇文章正文…...

算法每日一练 (9)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (9)最小路径和题目描述解题思路解题代码…...

对接RAGflow的API接口报错

对接RAGflow的API接口&#xff0c;报错&#xff1a; {"status":"success","message":"API连接正常","response":{"code":109,"data":false,"message":"Authentication error: API key …...

智慧城市智慧社区项目建设方案

一、项目背景 在全球化进程加速的今天&#xff0c;城市化问题日益凸显&#xff0c;传统的城市管理模式已难以满足现代社会对高效、智能化管理的需求。智慧城市和智慧社区的概念应运而生&#xff0c;其核心目标是通过信息技术手段&#xff0c;提升城市资源的利用效率&#xff0…...

Orale数据文件加错位置,你直接rm引发的故障

数据库可能面临硬件故障、人为错误、恶意攻击、自然灾害等多种潜在风险&#xff0c;那么今天这个故障就是由于业务人员加错数据文件的位置&#xff0c;然后直接从物理层面rm -f了&#xff0c;导致了生产的故障&#xff01; 以下是针对Oracle数据库物理删除数据文件后的快速修复…...

Web网页开发——水果忍者

1.介绍 复刻经典小游戏——水果忍者 2.预览 3.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…...

51 单片机中断控制寄存器 TCON

在 51 单片机中&#xff0c;中断控制寄存器 TCON&#xff08;Timer/Counter Control Register&#xff0c;定时器 / 计数器控制寄存器&#xff09;主要用于控制定时器 / 计数器的启动、停止以及外部中断的触发方式等。它既可以按字节寻址&#xff0c;也可以按位寻址&#xff0c…...

电脑如何在系统默认的壁纸中切换自己喜欢的

1、声明&#xff1a;该切换壁纸仅支持win10。 当你想去切换系统默认的壁纸&#xff0c;但是不知道该怎么切换&#xff0c;别慌&#xff0c;小亦教你几招帮你快速切换自定义壁纸。 我们平常使用的win10桌面壁纸大部分都是 简单、朴素的壁纸&#xff0c;但如果你想要切换自己喜…...

AcWing 600. 仰视奶牛 单调栈模板题

https://www.acwing.com/problem/content/description/602/ 找x右边第一个大于x的数的位置 const int N 1e5 10,T 20;int n; LL a[N],stk[N],top,r[N];void solve() {cin >> n;for (int i 1;i < n;i ) cin >> a[i];for (int i n;i > 1;i --){while(top…...

使用Galaxy创建生物信息学工作流的步骤详解

李升伟 整理 Galaxy 是一个基于 Web 的生物信息学平台&#xff0c;提供了直观的用户界面和丰富的工具&#xff0c;帮助用户创建和管理生物信息学工作流。以下是使用 Galaxy 创建生物信息学工作流的主要步骤&#xff1a; 1. 访问 Galaxy 平台 打开 Galaxy 的官方网站&#xff…...

OmniDrive(2):环境搭建

文章目录 1. 环境安装1.1 cuda 和cudnn安装1.2 依赖包安装2. 准备数据集及权重2.1 下载nuScenes数据2.2 下载预训练权重3. 模型训练及推理3.1 训练3.2 推理根据OmniDrive 官方的环境配置 Environment Setup python 3.9 ubantu 22.04 cuda 11.7 torch1.13.11. 环境安装 1.1 cu…...

计算机底层知识一——从编程语言到可执行程序

好久没写博客了&#xff0c;近段时间事情比较杂&#xff0c;最近终于有时间回归了。其余代码写久了就会遇到许多奇奇怪怪的问题&#xff0c;这些问题绕不开许多底层知识&#xff0c;比如缺少动态依赖库、idea编译失败等等&#xff0c;虽然通过百度等搜索引擎&#xff0c;亦或是…...

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践

HarmonyOS Next~鸿蒙系统ArkCompiler跨平台编译技术的革新实践 引言 在万物互联时代&#xff0c;操作系统对编译技术的需求已从单纯的代码转换演变为跨设备协同、高效资源调度与极致性能优化的综合挑战。华为鸿蒙系统&#xff08;HarmonyOS&#xff09;自主研发的ArkCompiler…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_modules

声明在 src/core/ngx_module.h ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);实现在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modul…...

Java多线程与高并发专题——关于CopyOnWrite 容器特点

引入 在 CopyOnWriteArrayList 出现之前&#xff0c;我们已经有了 ArrayList 和 LinkedList 作为 List 的数组和链表的实现&#xff0c;而且也有了线程安全的 Vector 和Collections.synchronizedList() 可以使用。 首先我们来看看Vector是如何实现线程安全的 &#xff0c;还是…...

Wpf-ReactiveUI-Usercontrol与主界面交互

文章目录 Usercontrol与主界面方法一、使用属性绑定UserControl 部分(MyUserControl.xaml.cs)UserControl 视图模型部分(MyUserControlViewModel.cs)主界面部分(MainWindow.xaml)主界面视图模型部分(MainWindowViewModel.cs)方法二、使用消息传递UserControl 视图模型部…...

MySQL中like模糊查询如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中like模糊查询如何优化?】面试题。希望对大家有帮助&#xff1b; MySQL中like模糊查询如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;LIKE 模糊查询虽然非常常见&#xff0c;…...

用Ruby的Faraday库来进行网络请求抓取数据

在 Ruby 中&#xff0c;Faraday 是一个非常强大的 HTTP 客户端库&#xff0c;它可以用于发送 HTTP 请求并处理响应。你可以使用 Faraday 来抓取网页数据&#xff0c;处理 API 请求等任务。下面我将向你展示如何使用 Faraday 库进行网络请求&#xff0c;抓取数据并处理响应。 1.…...

2025天梯训练1

PTA | L3-1 直捣黄龙 30分 思路&#xff1a;多关键字最短路&#xff0c;同时还要记录最短路径条数。 typedef struct node{int from,d,pass,kl;bool operator<(const node &x)const{if(d!x.d) return d>x.d;if(pass!x.pass) return pass<x.pass;return kl<x.…...

DeepSeek教我写词典爬虫获取单词的音标和拼写

Python在爬虫领域展现出了卓越的功能性&#xff0c;不仅能够高效地抓取目标数据&#xff0c;还能便捷地将数据存储至本地。在众多Python爬虫应用中&#xff0c;词典数据的爬取尤为常见。接下来&#xff0c;我们将以dict.cn为例&#xff0c;详细演示如何编写一个用于爬取词典数据…...

揭开AI-OPS 的神秘面纱 第四讲 AI 模型服务层(自研方向)

AI 模型服务层技术架构与组件选型分析(自研方向) 基于自有开发寻训练方向 AI 模型服务层 是 AI-Ops 架构的 核心智能引擎,负责构建、训练、部署、管理和监控各种 AI 模型,为上层应用服务层提供智能分析和决策能力。 AI 模型服务层需要提供一个灵活、可扩展、高性能的平台…...

[通俗易懂C++]:std::optional

[通俗易懂C]:std::optional 考虑下面这样一个函数: int doIntDivision(int x, int y) {return x / y; }如果调用者传入一个语义上无效的值&#xff08;例如 y 0 &#xff09;&#xff0c;此函数无法计算一个返回值&#xff08;因为除以 0 在数学上是未定义的&#xff09;。在…...

深入理解与配置 Nginx TCP 日志输出

一、背景介绍 在现代网络架构中&#xff0c;Nginx 作为一款高性能的 Web 服务器和反向代理服务器&#xff0c;广泛应用于各种场景。除了对 HTTP/HTTPS 协议的出色支持&#xff0c;Nginx 从 1.9.0 版本开始引入了对 TCP 和 UDP 协议的代理功能&#xff0c;这使得它在处理数据库…...

使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出

使用 vxe-table 导出 excel&#xff0c;支持带数值、货币、图片等带格式导出&#xff0c;通过官方自动的导出插件 plugin-export-xlsx 实现导出功能 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;htt…...

Spring-事务

Spring 事务 事务的基本概念 &#x1f539; 什么是事务&#xff1f; 事务是一组数据库操作&#xff0c;它们作为一个整体&#xff0c;要么全部成功&#xff0c;要么全部回滚。 常见的事务场景&#xff1a; 银行转账&#xff08;扣款和存款必须同时成功&#xff09; 订单系统…...

开源项目介绍:Native-LLM-for-Android

项目地址&#xff1a;Native-LLM-for-Android 创作活动时间&#xff1a;2025年 支持在 Android 设备上运行大型语言模型 &#xff08;LLM&#xff09; &#xff0c;具体支持的模型包括&#xff1a; DeepSeek-R1-Distill-Qwen: 1.5B Qwen2.5-Instruct: 0.5B, 1.5B Qwen2/2.5VL:…...

vocabulary is from your listening,other speaking and your thought.

不要把单词放在自己的大脑里&#xff0c;放在自己的嘴巴里&#xff0c;自己在那疯狂重复的recite&#xff0c;its futile.只是单点记忆单词&#xff0c;记住也是temporary&#xff0c;而且是单点的记忆&#xff0c;当别人说此词汇&#xff0c;你也听不懂或分辨就是这个单词&…...

前端知识点---路由模式-实例模式和单例模式(ts)

在 ArkTS&#xff08;Ark UI 框架&#xff09;中&#xff0c;路由实例模式&#xff08;Standard Instance Mode&#xff09;主要用于管理页面跳转。当创建一个新页面时&#xff0c;可以选择标准实例模式&#xff08;Standard Mode&#xff09;或单实例模式&#xff08;Single M…...

Matplotlib库中color 参数颜色有多少种

**当我们绘图超过十几种颜色。我都是 定义颜色列表&#xff08; ** colors [blue, green, red, cyan, magenta, yellow, greenyellow, orange, purple, brown, pink, gray]1、 颜色名称 Matplotlib常用的颜色名称&#xff1a; red 或 r green 或 g blue 或 b yellow 或 y cy…...

LINUX虚拟机中,不能播放RTSP设备,怎么办

首先&#xff0c;主机能够打开RTSP设备。虚拟机无法打开。 虚拟机网络设置 桥接网卡&#xff0c;选择正确的网卡。 虚拟机IP设置 需要是同一个网段。交换机的设备是192.168.1.192 用ffplay测试...

宝塔的ssl文件验证域名后,会在域名解析列表中留下记录吗?

在使用宝塔面板进行SSL证书验证域名后&#xff0c;通常不会在域名解析列表中留下记录。验证过程中添加的TXT记录仅用于验证域名的所有权&#xff0c;一旦验证完成&#xff0c;就可以安全地删除这些记录&#xff0c;不会影响SSL证书的正常使用。根据搜索结果&#xff0c;DNS验证…...

mitt 依赖库详解

一、概述 mitt 是一个极其轻量级的 JavaScript 事件发射器库&#xff0c;实现了发布-订阅模式。该模式允许对象间松散耦合&#xff0c;一个对象&#xff08;发布者&#xff09;可以发布事件&#xff0c;而其他对象&#xff08;订阅者&#xff09;可以监听这些事件并作出响应。…...

OSPF网络类型:NBMA与P2MP

一、NBMA网络 NBMA网络的特点 连接方式&#xff1a; 支持多台设备连接到同一个网络段&#xff0c;但网络本身不支持广播或组播。典型例子&#xff1a;帧中继、ATM。 DR/BDR选举&#xff1a; 由于网络不支持广播&#xff0c;OSPF需要手动配置邻居。 仍然会选举DR&#xff08…...

VUE叉的工作原理?

Vuex 是 Vue.js 的一个专门用于状态管理的库&#xff0c;其工作原理基于单向数据流和集中式存储&#xff0c;旨在解决跨组件之间状态共享和管理的复杂性。以下是 Vuex 的核心工作原理及其关键组成部分&#xff1a; 核心概念 State&#xff08;状态&#xff09; Vuex 使用一个单…...

H.264语法结构分析之frame_cropping_flag

技术背景 开发者对接我们轻量级RTSP服务的时候&#xff0c;利用部分开源的播放器&#xff0c;播放流数据的时候&#xff0c;说分辨率不对&#xff0c;导致看到的图像有问题&#xff0c;用我们的player或常见的通用播放器&#xff0c;又都是好的&#xff0c;这就扯到了今天的主…...

【智能体】本地安装Conda和搭建OpenManus环境

整理不易&#xff0c;请不要令色你的赞和收藏。 1. 前言 没体验到 Manus&#xff1f;不妨使用 MetaGPT 开源的 OpenManus 搭建自己的 Manus。本文将带你安装 Conda 并搭建自己的 Manus。 2. 前提条件 已安装 conda&#xff0c;没安装的话&#xff0c;下文有介绍。 OpenManu…...

【linux网络编程】套接字编程API详细介绍

在C语言中&#xff0c;套接字&#xff08;Socket&#xff09;编程主要用于网络通信&#xff0c;尤其是在基于TCP/IP协议的应用程序开发中。常用的套接字编程API主要基于Berkeley Sockets&#xff08;伯克利套接字&#xff09;接口&#xff0c;这些函数通常在<sys/socket.h&g…...

杂项知识笔记搜集

1.pygame pygame可以画出来图形界面&#xff0c;pygame Python仓库 PyGame游戏编程_游戏程序设计csdn-CSDN博客 2.V4L2库 V4L2是Linux上的Camera采集器的框架 Video for Linux &#xff0c;是从Linux2.1版本开始支持的。HDMI视频采集卡采集到的视频通过USB3.0输出&#xff0…...

模型微调——模型性能提升方法及注意事项(自用)

名词补充 人为为训练数据标注的标签称为黄金标准或真实值&#xff0c;这个过程一定程度上保证训练的准确性&#xff0c;但是其人工标注的成本和时间很高&#xff0c;并且标注的标签受人的主观因素影响。 导致模型性能不佳的因素和解决办法 ①不同类别的数据不平衡&#xff1a;统…...

RabbitMQ之旅(1)

相信自己,终会成功 目录 主流MQ产品 1.kafaka 2.RocketMQ 3.RabbitMQ 在xshell上安装RabbitMQ RabbitMQ七种工作模式 1.简单模式 ​编辑 2.工作队列模式 3.发布/订阅模式 4.路由模式 5.通配符模式 6.RPC模式 AMQP.BasicProperties 设置消息属性的类 7.发布确认模…...

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…...

跟着 Lua 5.1 官方参考文档学习 Lua (11)

文章目录 5.4.1 – PatternsCharacter Class:Pattern Item:Pattern:Captures: string.find (s, pattern [, init [, plain]])例子&#xff1a;string.find 的简单使用 string.match (s, pattern [, init])string.gmatch (s, pattern)string.gsub (s, pattern, repl [, n])例子&…...

<script setup>和export default { setup() { ... } }区别

在 Vue 3 组合式 API&#xff08;Composition API&#xff09;中&#xff0c;<script setup> 和 export default setup() {} 都用于定义组件的逻辑&#xff0c;但它们有一些重要的区别&#xff1a; 1️⃣ <script setup>&#xff08;推荐&#xff09; ✅ 更简洁、…...

leetcode hot100--动态规划【五步总纲】

五步&#xff1a; 1.dp数组以及下标定义 dp[i] 2.递推公式 dp[n]dp[n-1]dp[n-2] 3.dp数组如何初始化 注意&#xff1a;判断边界条件&#xff0c;n0dp[1]就不存在【斐波那契】 4.遍历顺序 for循环顺序 5.打印数组【debug】 第一题&#xff1a;斐波那契数列 首先回顾了…...