赞
踩
因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。
注:Cookie+Session 认证属于Form认证,并不属于HTTP标准验证。
Form认证:即表单认证,表单认证一般都会配合cookie+sessiond的使用,现在绝大多数的Web站点都是使用此认证方式。用户在登录页中填写用户名和密码,服务端认证通过后会将sessionId返回给浏览器端,浏览器会保存sessionId到浏览器的Cookie中。因为Http是无状态的,所以浏览器使用Cookie来保存sessionId。下次客户端发送的请求中会包含sessionId值,服务端发现sessionId存在并认证过则会提供资源访问。
目前主流的访问权限控制/认证模式有以下几种:
Unauthorized
Authorization头中数据 Basic- HTTP/1.1 401 Unauthorized
-
- Date: Mon, 04 Feb 2014 16:50:53 GMT
-
- WWW-Authenticate: Basic realm="WallyWorld"
-
- //其中“WallyWorld”是服务器分配的用于标识保护空间的字符串。
SCRAM SHA-1的执行涉及四个消息的传输和处理;客户端和服务器各有两个。如上图所示,客户端通过发送 客户端第一消息开始该过程,并且响应于从客户端接收到格式正确的第一消息,服务器向客户端发送 服务器第一消息。客户端处理此消息,如果一切正常,则传输 客户端最终消息。正如预期的那样,服务器会处理此消息。在此任务结束时,服务器应该知道客户端是否成功通过身份验证。如果是,服务器发送 服务器最终消息,否则它会向客户端发送认证失败消息(或者可能不会)。随着 服务器最终消息的接收,客户端也能够对服务器进行身份验证
response headers
中加入WWW-Authenticate
头部,要求客户端带上认证信息以后再发一次请求Authoriaztion
头部,用来说明认证的用户名、密码、算法等信息用户ID
与密码
但
用户ID与密码不得包含任何控制字符
包含冒号字符的用户ID是无效的
许多用户代理会在不检查
用户提供的用户 ID 是否包含冒号的情况下生成用户传递字符串; 然后,收件人会将输入的用户名的一部分视为密码的一部分
冒号(:)
连接用户ID,来构造用户通行证,字符和密码base64
,使得方式转化为US-ASCLL
字符序列US-ASCLL
兼容为了传输安全,需要配合SSL使用。
出现在RFC 7235上,还是属于basic认证
HTTP Proxy-Authorization
请求标头包含用于向代理服务器认证用户代理的凭证,通常在服务器响应407
Proxy Authentication Required
状态和Proxy-Authenticate
标题后。
如:Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
如下图,就是基本的http认证,浏览器弹出基本的对话框
如果认证失败,则返回如下
当请求成功的时候,返回的数据包如下
HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64编码的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。
要对Apache服务器上的目录进行密码保护, 你需要一个 .htaccess
和 a .htpasswd
文件.
该 .htaccess
文件格式通常看起来像这样:
- AuthType Basic
-
- AuthName "Access to the staging site"
-
- AuthUserFile /path/to/.htpasswd
-
- Require valid-user
该 .htaccess
文件引用一个 .htpasswd
文件,其中每行用冒号(“:”)分隔的用户名和密码. 你不能看到真实的密码因为它们是 encrypted (在这个例子中是使用了 MD5). 你可以命名.htpasswd 文件 为你所喜欢的名字, 但是应该保证这个文件不被其他人访问. (Apache通常配置阻止访问 .ht* 类的文件).
- aladdin:$apr1$ZjTqBB3f$IF9gdYAGlMrs2fuINjHsz.
-
- user2:$apr1$O04r.y2H$/vEkesPhVInBByJUkXitA/
在nginx配置中,对需要保护的location你需要做如下配置:auth_basic指令提供密码保护域的名称;auth_basic_user_file
指令指定包含用户密文的证书的文件(与apache例子中一致)
在 nginx 中, 你需要指定一个保护区域和该 auth_basic 指令提供的保护区域名字. 然后该 auth_basic_user_file
指令指向一个.htpasswd 包含加密用户凭据的文件, 就像上面的 apache 例子.
- location /status {
-
- auth_basic "Access to the staging site";
-
- auth_basic_user_file /etc/apache2/.htpasswd;
-
- }
如下:
https://username:password@www.example.com/
Bearer即Bearer Token
为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token(Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称JWT)
关于JWT,师傅们可以看这篇文章入门
Bearer的关键点有以下:
Authorization :Bear
er
- GET /resource HTTP/1.1
-
- Host: server.example.com
-
- Authorization: Bearer mF_9.B5f-4.1JqM
access_token
参数将访问的令牌添加到请求正文中,必须满足以下条件:
ASCLL
字符组成- POST /resource HTTP/1.1
-
- Host: server.example.com
-
- Content-Type: application/x-www-form-urlencoded
-
- access_token=mF_9.B5f-4.1JqM
access_token
参数:其他参数必须以&
符号连接- GET /resource?access_token=mF_9.B5f-4.1JqM&p= HTTP/1.1
-
- Host: server.example.com
JWT可以存在伪造攻击,举例如CTFhub 中的题目
这次是摘要认证
- POST http://127.0.0.1:8087/digest/auth HTTP/1.1
-
- Accept: application/json
-
- cache-control: no-cache
-
- Postman-Token: 0d4e957a-f8ab-4b01-850f-4967ff10b8a0
-
- User-Agent: PostmanRuntime/7.6.0
-
- Connection: keep-alive
- HTTP/1.1 401
-
- WWW-Authenticate: Digest realm="digest#Realm", qop="auth", nonce="MTU1NTMzMDg2MDA4MDo5MTdiMGI4ZmIwMDc2ZTgzOWU5NzA4YzEyZWEwNzlmMg=="
-
- Cache-Control: no-cache, no-store, max-age=0, must-revalidate
-
- Pragma: no-cache
-
- Content-Type: application/json;charset=UTF-8
Authoriization
的请求头中,重新发送命令给服务器- POST http://127.0.0.1:8087/digest/auth HTTP/1.1
-
- Accept: application/json
-
- User-Agent: PostmanRuntime/7.6.0 Authorization: Digest username="123", realm="digest#Realm", nonce="MTU1NTMzMDg2MDA4MDo5MTdiMGI4ZmIwMDc2ZTgzOWU5NzA4YzEyZWEwNzlmMg==", uri="/digest/auth", algorithm="MD5", qop=auth, nc=00000001, cnonce="eYnywapi", response="0568a40f79a6960114e21f6ef2b60807"
-
- Connection: keep-alive
- HTTP/1.1 200
-
- Expires: 0
-
- Content-Type: application/json;charset=UTF-8
-
- Content-Length: 22
-
- ** digest auth is success **
realm
: 显示给客户端的字符串
nonce
: 服务端生成唯一的、不重复的随机值
- //RFC2617示例 nonce = BASE64(time-stamp MD5(time-stamp ":" ETag ":" private-key))
-
- //下面是spring-security的实现
-
- long expiryTime = System.currentTimeMillis() + (long)(this.nonceValiditySeconds * 1000);
-
- String signatureValue = DigestAuthUtils.md5Hex(expiryTime + ":" + this.key);
-
- String nonceValue = expiryTime + ":" + signatureValue;
-
- String nonceValueBase64 = new String(Base64.getEncoder().encode(nonceValue.getBytes()));
algorithm
: 默认MD5算法
qop
: auth/auth-int 会影响摘要的算法
stale
:密码随机数nonce过期
response
: 客户端根据算法算出的摘要值
username
: 要认证的用户名
realm
: 认证域,可取任意标识值
uri
: 请求的资源位置
qop
: 保护质量
nonce
: 每次随返回的 401 响应生成的任意随机字符串
nc
: 16进制请求认证计数器,第一次 00000001
algorithm
: 默认MD5算法
cnonce
: 客户端密码随机数
则 A1= <username>:<realm>:<passwd>
则 A2= <request-method>:<digest-uri-value>
response=MD5(MD5(A1):<nonce>:<nc>:<cnonce>:<qop>:MD5(A2))
response=MD5(MD5(A1):<nonce>:MD5(A2))
HTTP 源绑定身份验证
WWW-Authenticate
标头字段WEB
资源,并且试图强制访问。加入 过程被调用。这将创建一个密钥对并使 CPK服务器已知,以便服务器可以进行帐户需要的创建过程。HOBA auth-scheme
参数,来创建和签署HOBA
代签名。HOBA
结果HOBA-RES
,作为sig
值Authorization
头字段,使用HOBA”auth-scheme 并将 HOBA client-result 在名为“result”的 auth-param 中HOBA
客户端结果客户端确定它是否已经需要进行身份验证的 Web 源的 CPK。如果客户端有CPK,客户端就会使用它;如果客户端没有CPK,它会在预期服务器要求一个 CPK 时生成一个。
在签名阶段,客户端连接到服务器,服务器请求基于 HOBA 的身份验证,客户端通过签名一个 blob 信息进行身份验证,
- HOBA-TBS = len ":" nonce
-
- len ":" alg
-
- len ":" origin
-
- len ":" [ realm ]
-
- len ":" kid
-
- len ":" challenge
-
- len = 1*DIGIT
-
- nonce = 1*base64urlchars
-
- alg = 1*2DIGIT
-
- origin = scheme "://" authority ":" port

HOBA-TES是客户端签名过程的输入,本身过程中不会通过网络发送
包含以下内容:
HOBA
客户端中呈现给服务器的base64
编码值- HOBA-RES = kid "." challenge "." nonce "." sig
-
- sig = 1*base64urlchars
使用JavaScript的网站也可以执行源绑定身份验证,而无需涉及HTTP层。
WebCrypto
Window.localStorage - Web API 接口参考 | MDN
由于 JavaScript 的同源策略,子域中的脚本无法访问与其父域中的脚本相同的 localStorage。对于更大或更复杂的站点。
解决此问题的一种方法是使用会话 cookie,因为它们可以跨子域使用。也就是说,在 HOBA-js 中,用户可能使用单个知名域登录,然后在用户浏览站点时使用会话 cookie 。
HTTP双向认证
先说一下优缺点
在通信中根本不交换密码信息,避免了任何密码在网络传输中泄露的可能性,离线密码字典攻击无效
能够检测通信对方是否为伪造服务器,避免被网络钓鱼。
缺点
浏览器尚未原生支持
框架尚未内置,只能开发人员自己实现。
过程
GET localhost/resource
)- HTTP/1.1 401 Unauthorized
-
- WWW-Authenticate: Mutual
-
- realm="example_space_name",
-
- version=1,
-
- algorithm=SHA-256,
-
- validation=http://localhost:8000,
-
- auth-scope=localhost,
-
- reason=initial
Mutual
:表明认证方式为HTTP相互认证。
realm
:保护空间标识名称,告知客户端自动应用账密的范围,是 HTTP 认证框架(RFC 7235)定义的参数。
version
:表明服务器采用的相互认证协议的版本,用于避免未来版本不兼容的问题,目前只有一个版本,其值固定为1。
algorithm
:指定采用哪种算法计算kc1、ks1、vkc、vks,协议目前支持4种算法:iso-kam3-dl-2048-sha256、iso-kam3-dl-4096-sha512、iso-kam3-ec-p256-sha256、iso-kam3-ec-p521-sha512,算法详情定义在RFC 8121。
validation
:表明与服务器绑定的底层协议验证机制,客户端可以利用此机制来初步检查通信对方,以防止恶意服务器通过转发客户端凭据而向真实服务器冒充用户。当服务器底层是HTTP时,只能采用 host 验证机制,即参数值的格式为<scheme>://<host>:<port>,表明通过判断这三部分是否与真实服务器一致来检查通信对方。当服务器底层是HTTPS时,可以选择 tls-server-end-point 验证机制,即参数值为服务器TLS公钥证书散列值的八位字符串;或者选择 tls-unique 验证机制,即参数值为通道绑定材料。
auth-scope
:告知客户端自动应用会话秘钥的跨域范围。Single-server type:参数值的格式为<scheme>://<host>:<port>,例如:http://localhost:8000,表明scheme、host、port三个部分都相同时才自动应用会话秘钥,即不能跨域应用。Single-host type(缺省默认),参数值的格式为<host>,例如:localhost,表明只要host部分相同就可以跨域应用会话秘钥。Wildcard-domain type,参数值的格式为 *.example.com,表明只要一级域名相同就可以跨域应用会话秘钥。
reason:描述返回401的原因,initial表示请求中头没有包含Authorization字段。
validation
提供的方法来初步检查通信对方
- GET /resource HTTP/1.1
-
- Host: localhost
-
- Authorization: Mutual
-
- realm="example_space_name",
-
- version=1,
-
- algorithm=SHA-256,
-
- validation=host,
-
- auth-scope=localhost,
-
- user="jane",
-
- kc1="4e2e272a28d1802ca10daf4496794697cf"

- HTTP/1.1 401 Unauthorized
-
- WWW-Authenticate: Mutual
-
- realm="example_space_name",
-
- version=1,
-
- algorithm=SHA-256,
-
- validation=host,
-
- auth-scope=localhost,
-
- reason=initial
-
- sid="4563806698",
-
- ks1="daf4496794697cf8db5856cb6c1",
-
- nc-max=400,
-
- nc-window=128,
-
- time=60

Authorization
字段中通过Mutual
关键词传递sid、vkc(客户端计算的会话秘钥值)等参数,重新请求目标URI。- GET /resource HTTP/1.1
-
- Host: localhost
-
- Authorization: Mutual
-
- realm="example_space_name",
-
- version=1,
-
- algorithm=SHA-256,
-
- validation=host,
-
- auth-scope=localhost,
-
- user="jane",
-
- vkc="wE4q74E6zIJEtWaHKaf5wv/H5Q"

- HTTP/1.1 200 OK
-
- Authentication-Info: Mutual
-
- version=1,
-
- sid="4563806698",
-
- vks1="wE4q74E6zIJEtWaHKaf5wv/H5Q"
-
- # response body
reason=auth-failed
:表示身份验证失败。这个找了半天,真离谱
最后查到这个东西应该是windows下的认证 NTLM和kerberos,那应该是HttpClient+NTLM认证
WWW-Authenticate: NTLM realm="SIP Communications Service", targetname="server.domain.com", version=4
NTLM是NT LAN Manager的缩写,NTLM是基于挑战/应答的身份验证协议,是 Windows NT 早期版本中的标准安全协议。
Net-NTLMv1协议的基本流程如下:
Net-NTLMv1 response的计算方法为
这种方式相对脆弱,可以基于抓包工具和彩虹表爆破工具进行破解。
自Windows Vista起,微软默认使用Net-NTLMv2协议,其基本流程如下:
LM Hash(LAN Manager Hash) 是windows最早用的加密算法,由IBM设计。LM Hash 使用硬编码秘钥的DES,且存在缺陷。早期的Windows系统如XP、Server 2003等使用LM Hash,而后的系统默认禁用了LM Hash并使用NTLM Hash。
LM Hash的计算方式为:
KGS!@#$%
作为秘钥对这两组数据进行DES加密,得到16字节的哈希作为早期的算法,LM Hash存在着诸多问题:
aad3b435b51404ee
来判断密码长度不超过7位为了解决LM Hash的安全问题,微软于1993年在Windows NT 3.1中引入了NTLM协议。
Windows 2000 / XP / 2003 在密码超过14位前使用LM Hash,在密码超过14位后使用NTLM Hash。而之后从Vista开始的版本都使用NTLM Hash。
NTLM Hash的计算方法为:
Pass The Hash (PtH) 是攻击者捕获帐号登录凭证后,复用凭证Hash进行攻击的方式。
微软在2012年12月发布了针对Pass The Hash攻击的防御指导,文章中提到了一些防御方法,并说明了为什么不针对Pass The Hash提供更新补丁。
在禁用NTLM的环境下,可以用mimikatz等工具直接获取密码。
攻击者可以一定程度控制客户端网络的时候,可以使用中间人攻击的方式来获取权限。对客户端伪装为身份验证服务器,对服务端伪装为需要认证的客户端。
这个看了一下,,师傅写的很详细很全,,就直接摆上了
Spring Security OAuth 2.0 - 废物大师兄 - 博客园
HTTP SCRAM 是一种 HTTP 身份验证机制,其客户端响应和服务器质询消息是基于文本的消息,包含一个或多个以逗号分隔的属性值对。SCRAM-SHA-1 是为了与 RFC 5802 实现的数据库兼容而注册的,这些实现还希望公开对相关服务的 HTTP 访问,但不建议将其用于新部署。为了互操作性,所有支持 SCRAM 的 HTTP 客户端和服务器必须实现 SCRAM-SHA-256 身份验证机制
查了许多资料,发现在MongoDB中使用最多。
- Authorization: SCRAM-SHA-256 realm="testrealm@example.com",
-
- data=biwsbj11c2VyLHI9ck9wck5HZndFYmVSV2diTkVrcU8K
SCRAM SHA-1的执行涉及四个消息的传输和处理;客户端和服务器各有两个。如上图所示,客户端通过发送 客户端第一消息开始该过程,并且响应于从客户端接收到格式正确的第一消息,服务器向客户端发送 服务器第一消息。客户端处理此消息,如果一切正常,则传输 客户端最终消息。正如预期的那样,服务器会处理此消息。在此任务结束时,服务器应该知道客户端是否成功通过身份验证。如果是,服务器发送 服务器最终消息,否则它会向客户端发送认证失败消息(或者可能不会)。随着 服务器最终消息的接收,客户端也能够对服务器进行身份验证
SCRAM SHA-1 规范强烈 建议该协议应与另一个提供机密性的协议结合使用。换句话说,SCRAM SHA-1 消息应该通过加密通道进行交换。这个想法是为了防止窃听者在传输过程中提取这些消息的内容,然后使用其中包含的值发起离线字典攻击来提取密码。
要想发送推送通知,需要使用 VAPID 协议。
VAPID 是“自主应用服务器标识” ( Voluntary Application Server Identification ) 的简称。它是一个规范,它本质上定义了应用服务器和推送服务之间的握手,并允许推送服务确认哪个站点正在发送消息。这很重要,因为这意味着应用服务器能够包含有关其自身的附加信息,可用于联系应用服务器的操作人员。拥有像 VAPID 这样的标准就是向前迈出了一大步,因为这意味着最终所有浏览器都将遵循这个单一标准,即无论什么浏览器,开发者都可以使用 Web 推送进行无缝工作。
- POST /p/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV HTTP/1.1
-
- Host: push.example.net
-
- Push-Receipt: https://push.example.net/r/3ZtI4YVNBnUUZhuoChl6omU
-
- Content-Type: text/plain;charset=utf8
-
- Content-Length: 36
-
- Authorization: Bearer
-
- eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3B
-
- 1c2guZXhhbXBsZS5uZXQiLCJleHAiOjE0NTM1MjM3NjgsInN1YiI6Im1haWx
-
- 0bzpwdXNoQGV4YW1wbGUuY29tIn0.i3CYb7t4xfxCDquptFOepC9GAu_HLGk
-
- MlMuCGSK2rpiUfnK9ojFwDXb1JrErtmysazNjjvW2L9OkSSHzvoD1oA
-
- Crypto-Key: p256ecdsa=BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxH
-
- F6YK5h4SDYic-dRuU_RCPCfA5aq9ojSwk5Y2EmClBPs
-
- iChYuI3jMzt3ir20P8r_jgRR-dSuN182x7iB

实在找不到关于分析的文章了,,,看一下应用的地方吧
PWA(Progressive Web App)入门系列:Push_王乐平 技术博客-CSDN博客
编程语言实现HTTP认证
https://www.php.net/manual/zh/features.http-auth.php
https://ask.csdn.net/questions/768779
HTTP Bearer认证及JWT的使用 - 搬砖滴 - 博客园
HTTP的几种认证方式之DIGEST 认证(摘要认证) - wenbin_ouyang - 博客园
https://www.cnblogs.com/lsdb/p/10621940.html
摘要认证,使用HttpClient实现HTTP digest authentication - 代码先锋网
https://blog.csdn.net/HD243608836/article/details/109105469
HttpClient+NTLM认证_耳东的慢生活的博客-CSDN博客
https://www.codeproject.com/Articles/698219/Salted-Challenge-Response-Authentication-Mechanism
API 密钥认证(API Key Authentication):使用一个密钥对进行身份认证,通常由云厂商为每个用户分配一个唯一的 API 密钥,用于在 API 请求中进行身份验证。
OAuth 认证:OAuth 是一种开放标准的授权协议,允许用户授权第三方应用访问其受保护的资源。通过 OAuth 认证方式,用户可以授予应用有限的访问权限,而无需直接共享其密码。
证书认证(Certificate Authentication):该方式使用证书来验证 API 请求的身份。用户需要创建并上传相应的证书,然后在 API 请求中使用证书进行身份认证。
请求签名认证(Request Signing Authentication):该方式使用加密算法对 API 请求进行签名,并在请求中包含签名信息。服务器端根据请求中的签名信息验证请求的合法性。
集成服务认证(Service Account Authentication):通常用于与其他云服务集成时,采用预先分配的服务账号进行认证。服务账号具有独立的身份和权限。
[RFC 2617] Digest 签名摘要式认证 - 链滴
Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry
图解HTTP.pdf
HTTP 身份验证框架(Basic 认证)_mbh的博客-CSDN博客_身份验证框架
HTTP Origin-Bound Authentication (HOBA)
HTTPS双向认证(Mutual TLS authentication) - API 网关 - 阿里云
Web应用中基于密码的身份认证机制(表单认证、HTTP认证: Basic、Digest、Mutual)_u012324798的博客-CSDN博客_基于密码的身份认证
8.7. NTLM 身份验证 ‒ Web安全学习笔记 1.0 文档
Salted Challenge Response Authentication Mechanism (SCRAM) SHA-1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。