HTTP Basic和Digest认证介绍与计算

2023-05-16

转载自:HTTP Basic和Digest认证介绍与计算 - 诸子流 - 博客园



HTTP Basic和Digest认证介绍与计算 

一、说明

web用户认证,最开始是get提交+把用户名密码存放在客户端的cookie中的形式;在意识到这样不安全之后逐渐演变成了post提交+把用户凭证放到了服务端的session中的形式(当然sessionid还在cookie中)。

不过其实最初给http设计的认证方式,既不是“get+cookie”也不是“post+session”,而是Basic和Digest。但Basic和Digest并不流行我想主要是因为麻烦,一是说Basic和Digest使用的Authorization头并不会被浏览器自动发往服务器,二是说对于Digest计算很麻烦。

二、Basic认证形式

2.1 Basic认证请求示例

请求示例如下,主要是Authorization头(位置不重要,http头一般都不分先后)

复制代码


GET /GetDeviceInfo HTTP/1.1
Host: 192.168.220.128
Authorization: Basic YWRtaW46MTIzNDU2
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept-Encoding: gzip, deflate
Accept: */*
Cache-Control: no-cache
Cookie: Secure
Connection: close  

复制代码

2.2 Basic认证计算方法

前边请求Authorization头的YWRtaW46MTIzNDU2,实际上是用户名admin密码123456使用以下计算方法得到:


base64(username:password)  

Python计算代码如下:

复制代码


import base64

def get_basic_authorization_header_value(username,password):
    # base64编码前后都(要)是字节码形式
    authorization_value = base64.b64encode((f"{username}:{password}").encode()).decode()
    authorization_header_value = f"Basic {authorization_value}"
    return authorization_header_value  

复制代码

三、Digest认证形式

3.1 Digest认证请求示例

复制代码


GET /GetDeviceInfo HTTP/1.1
Host: 192.168.220.128
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0
Authorization: Digest username="admin",realm="TVT API Test Tool",nonce="d4f95e85dc5a39a4914db61b67878f5b",uri="GetDeviceInfo",algorithm="MD5",cnonce="d4f95e85dc5a39a4914db61b67878f5b",nc=00000001,qop="auth",response="1cc4cf126d3c4a70d2de34c5d8c2943c"
Accept-Encoding: gzip, deflate
Accept: */*
Cache-Control: no-cache
Cookie: Secure
Connection: close  

复制代码

username----系统用户名;客户端自行填充

realm----领域;服务端通过WWW-Authenticate头返回内容可以自己随便定,但其目的是用于提示客户端当前是什么系统,所以规范来说应类似于“myhost@testrealm.com”的形式。

nonce----服务端通过WWW-Authenticate头返回的随机数

uri----请求接口或资源(似乎规范来说应用GET或POST后的一样,上边例子中少了/是因为服务端没按规范实现)

algorithm----后边response用的计算方法

cnonce----client nonce,客户端生成的随机数

nc----nonce count,用于标识进行请求的次数。(但你一直不变服务端也不会管你对不对)

qop----quality of protection,进一步限定response的计算方法,服务端通过WWW-Authenticate头返回。

response----认证最主要的值,前面各字段除algorithm外全要参与该值的计算。

3.2 Digest认证计算方法

在最开始的RFC 2069中规定response计算方法如下:


HA1 = MD5(username:realm:password)
HA2 = MD5(method:uri)
response = MD5(HA1:nonce:HA2)  

随后的RFC 2617对计算方法进行了增强,规定计算方法如下(当algorithm值为MD5或未指定、qop未指定时等同RFC 2069):

复制代码


# HA1部分
# 当algorithm值为"MD5"或未指定时,HA1计算方法如下
HA1 = MD5(username:realm:password)
# 当algorithm值为"MD5-sess"时,HA1计算方法如下
HA1 = MD5(MD5(username:realm:password):nonce:cnonce)

# HA2部分
# 当qop值为"auth"或未指定时,HA2计算方法如下
HA2 = MD5(method:uri)
# 当qop值为"auth-int"时,HA2计算方法如下;entityBody是指整个body(?)
HA2 = MD5(method:uri:MD5(entityBody))

# response部分
# 当qop值为"auth"或"auth-int"时,response计算方法如下
response = MD5(HA1:nonce:nonceCount:cnonce:qop:HA2)
# 当qop未指定时,response计算方法如下
response = MD5(HA1:nonce:HA2)  

复制代码

 Python计算代码如下:

复制代码


import hashlib

# body初始值不要是None,不然下边encode时会报错
def get_basic_authorization_header_value(username, password, uri, method, realm, nonce, nc, cnonce, algorithm=None, qop=None, body=""):
    response_value = calc_digest_response_value(username, password, uri, method, realm, nonce, nc, cnonce, algorithm, qop, body)
    authorization_header_value = f'Digest username="{username}",realm="{realm}",nonce="{nonce}",uri="{uri}",algorithm="{algorithm}",cnonce="{cnonce}",nc={nc},qop="{qop}",response="{response_value}"',
    return authorization_header_value

def calc_digest_response_value(username, password, uri, method, realm, nonce, nc, cnonce, algorithm=None, qop=None, body=""):
    # HA1部分
    # 当algorithm值为"MD5"或未指定时,HA1计算方法如下
    if algorithm == "MD5" or algorithm == "" or algorithm is None:
        HA1 = hashlib.md5((f"{username}:{realm}:{password}").encode()).hexdigest()
    # 当algorithm值为"MD5-sess"时,HA1计算方法如下
    elif algorithm == "MD5-sess":
        HA1 = hashlib.md5((f"{username}:{realm}:{password}").encode()).hexdigest()
        HA1 = hashlib.md5((f"{HA1}:{nonce}:{cnonce}").encode()).hexdigest()
    else:
        response_value = '"the value of algorithm must be one of "MD5"/"MD5-sess"/""/None'
        return response_value

    # HA2部分
    # 当qop值为"auth"或未指定时,HA2计算方法如下
    if qop == "auth" or qop == "" or qop is None:
        HA2 = hashlib.md5((f"{method}:{uri}").encode()).hexdigest()
    # 当qop值为"auth-int"时,HA2计算方法如下;entityBody是不是指整个body我其实不太确定
    elif qop == "auth-int":
        HA2 = hashlib.md5((f"{body}").encode()).hexdigest()
        HA2 = hashlib.md5((f"{method}:{uri}:{HA2}").encode()).hexdigest()
    else:
        response_value = '"the value of qop must be one of "auth"/"auth-int"/""/None'
        return response_value

    # response部分
    # 当qop值为"auth"或"auth-int"时,response计算方法如下
    if qop == "auth" or qop == "auth-int":
        response_value = hashlib.md5((f"{HA1}:{nonce}:{nc}:{cnonce}:{qop}:{HA2}").encode()).hexdigest()
    # 当qop未指定时,response计算方法如下
    elif qop == "" or qop is None:
        response_value = hashlib.md5((f"{HA1}:{nonce}:{HA2}").encode()).hexdigest()
    else:
        response_value = "unknown error"
    return response_value  

复制代码

参考:

https://en.wikipedia.org/wiki/Digest_access_authentication

rfc2069

rfc2617

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP Basic和Digest认证介绍与计算 的相关文章

随机推荐

  • Postman安装与使用(转载)

    转载自 xff1a https www cnblogs com fnng p 9136434 html Postman安装与使用 2018 06 04 22 58 虫师 阅读 418868 评论 13 编辑 收藏 举报 Postman一款非
  • Python requests HTTP验证登录实现流程

    对我而言最重要的是这几句 假设url为http xxx yyy zzz 用户名为admin 密码为123456 则访问的网址应该为http admin 123456 64 xxx yyy zzz http username password
  • 记一次Ubuntu 18.04 内核升级(转载)

    https zhuanlan zhihu com p 75669680 记一次Ubuntu 18 04 内核升级 CCCCCaO 闷骚得很 前言 原本使用 Ubuntu Server 18 04 2 LTS 来搭建一个NextCloud服务
  • 有图形化工具升级linux内核 ukuu-gtk

    有图形化工具升级linux内核 ukuu gtk https zhuanlan zhihu com p 75669680 转载自 xff1a https os 51cto com art 201905 596204 htm 借助UKUU在U
  • 网络通信1—TCP程序编写步骤(参照 Ubuntu 16.04 版本)(转载)

    转载自 xff1a https blog csdn net wenfei11471 article details 79478105 网络通信1 TCP程序编写步骤 xff08 参照 Ubuntu 16 04 版本 xff09 wenfei
  • select实现简单TCP通信(ubuntu 18.04)

    用法 cilent IP地址 然后在终端输入内容敲回车就可以了 端口号在代码里写的 转载自 xff1a https www cnblogs com soldierback p 10701684 html select实现简单TCP通信 ub
  • C语言网络编程(2)— TCP通信(转载)

    转载自 xff1a C语言网络编程 xff08 2 xff09 TCP通信 Willliam william的博客 CSDN博客 c语言tcp网络编程 C语言网络编程 xff08 2 xff09 TCP通信 Willliam william
  • 在ubuntu+vs code上通过HTTP协议实现服务器端和客户端通信(转载)

    转载自 xff1a 在ubuntu 43 vs code上通过HTTP协议实现服务器端和客户端通信 DP323的博客 CSDN博客 在 ubuntu 43 vs code上通过HTTP协议实现服务器端和客户端通信 DP323 2021 06
  • 常见元件、封装及尺寸

    封装类型 贴片元器件封装形式是半导体器件的一种封装形式 表面贴片技术 xff08 SMT xff09 所涉及的零件种类繁多 xff0c 有许多已形成业界通用标准 xff0c 这主要是一些芯片电容电阻等 xff1b 有许多仍在不断的变化 xf
  • C++:C语言实现HTTP的GET和POST请求

    似乎写代码发HTTP请求需要自己把完整的协议帧写出来 xff1f 而不是单纯填个URL就行了 xff0c 那既然完整协议帧都写出来了 xff0c 那我直接TCP发不就可以了 xff1f 还是说不能这样 基本你百度搜 c 43 43 发送ht
  • 字符串连接函数strcat,这个可以好好用用

    字符串连接函数strcat xff0c 这个可以好好用用 C 43 43 xff1a C语言实现HTTP的GET和POST请求 方方和圆圆 博客园 C 43 43 编写的Linux下Http请求 c 43 43 httplinux 其它代码
  • HTTP 账号密码验证

    http请求带用户名和密码验证 wdk的博客 CSDN博客 url带用户名和密码 转载自 xff1a HTTP 账号密码验证 qq 25600055的专栏 CSDN博客 HTTP 账号 密码验证 173300598 2018 05 28 1
  • http authorization 基本认证

    转载自 xff1a http authorization 基本认证 szchenrong 博客园 http authorization 基本认证 http协议是无状态的 xff0c 浏览器和web服务器之间可以通过cookie来身份识别 桌
  • HTTP报文(这篇讲得比较详细)

    转载自 xff1a HTTP报文 逆心 博客园 之前写过一篇HTML报文 xff0c 但是感觉写完之后还是不懂 xff0c 最近终于有时间开始看 HTTP权威指南 xff0c 看完之后觉得还是比之前的理解更加深入了 xff0c 提取HTTP
  • libcurl可以发送http请求

    libcurl可以发送http请求 轻量级C 43 43 实现的httpserver和httpclient c 43 43 httpserver C 43 43 代码类资源 CSDN下载 转 libcurl库使用方法 xff0c 好长 xf
  • Http Get请求简单实例(C++)

    转载自 xff1a 掘金 https juejin cn post 6844903897161531400 Http Get请求简单实例 xff08 C 43 43 xff09 HTTP报文 HTTP请求报文 请求行 xff1a GET H
  • 纯C++实现的HTTP请求封装(POST/GET)

    转载自 xff1a 纯C 43 43 实现的HTTP请求封装 xff08 POST GET xff09 阳光柠檬 的技术笔记 CSDN博客 纯C 43 43 实现的HTTP请求封装 xff08 POST GET xff09 时间 2016
  • [转]www-authenticate认证过程浅析

    转载自 xff1a 转 www authenticate认证过程浅析 maoliran的博客 CSDN博客 转 www authenticate认证过程浅析 新一下的兰天 2016 07 06 18 22 20 18002 正在上传 重新上
  • http Digest认证计算方法整理

    摘要认证及实现HTTP digest authentication 简书 HTTP Basic和Digest认证介绍与计算 诸子流 博客园 不要不知道上面说的URI是什么意思啊 图解HTTP 第 8 章 确认访问用户身份的认证 简书 8 1
  • HTTP Basic和Digest认证介绍与计算

    转载自 xff1a HTTP Basic和Digest认证介绍与计算 诸子流 博客园 HTTP Basic和Digest认证介绍与计算 一 说明 web用户认证 xff0c 最开始是get提交 43 把用户名密码存放在客户端的cookie中