HTTP Basic Auth:BA 认证

1. 背景

梳理 BA 认证的过程,以及每一步的意义和解决的问题:

  1. 加密算法
  2. 明文输入
  3. 数字签名
  4. 潜在风险:是否可能被攻破

note:

HTTP BA(基本认证)原始 BA 认证:

  • HTTP 头部:Authorization
  • Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  • 其「数字签名」默认 Base64 编码,能够被解密出来

HTTP BA 定制:

  • HTTP 头部:Authorization
  • Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  • 其「数字签名」定制的「签名算法」,「私钥」
    • 计算数字签名过程中,加入「请求参数」和「时间」
    • 防止篡改和重放攻击(时间窗口)

2. HTTP BA 认证

HTTP BA 基本数字签名:

针对用户名和密码,进行 Base64 编码:

  1. 每 3 个8Bit的字节,转换为4 个 6 Bit的字节;
  2. 6 Bit再添 2 位高位 0;
  3. 组成四个8Bit的字节;
  4. 3*8 = 4*6 = 24
  5. 3 个字节,变为 4 个字节,字符串长度增长 1/3
  6. Base64 的元字符:数字、字母、+、/

Base64 编码:是最简单的数字签名,能够避免人眼识别,但机器都可以解码出原文。

2.1. HTTP 请求中,未携带 BA 认证信息

客户端请求(没有认证信息)


GET /private/index.html HTTP/1.0

Host: localhost

服务端应答:401 未授权


HTTP/1.0 401 Authorization Required

Server: HTTPd/1.0

Date: Sat, 27 Nov 2004 10:18:15 GMT

WWW-Authenticate: Basic realm="Secure Area"

Content-Type: text/html

Content-Length: 311

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

 "<a href="http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd" "="" style="text-decoration-line: none; border-radius: 0px; background: 0px center; border: 0px; bottom: auto; float: none; height: auto; left: auto; line-height: 20px; margin: 0px; outline: 0px; overflow: visible; padding: 0px; position: static; right: auto; top: auto; vertical-align: baseline; width: auto; box-sizing: content-box; min-height: inherit; color: rgb(0, 51, 102) !important;">http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">

<HTML>

  <HEAD>

    <TITLE>Error</TITLE>

    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">

  </HEAD>

  <BODY><H1>401 Unauthorized.</H1></BODY>

</HTML>

2.2. HTTP 请求中,携带 BA 认证信息

客户端的请求(用户名“"Aladdin”,口令, password “open sesame”)


GET /private/index.html HTTP/1.0

Host: localhost

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

服务端的应答


HTTP/1.0 200 OK

Server: HTTPd/1.0

Date: Sat, 27 Nov 2004 10:19:07 GMT

Content-Type: text/html

Content-Length: 10476

2.3. 工具测试 Base64 编码

可以使用 shell 来测试 base64 编码:


# 编码

$ echo -n "Aladdin:open sesame" | base64

QWxhZGRpbjpvcGVuIHNlc2FtZQ==

 

# 解码

$ echo -n "QWxhZGRpbjpvcGVuIHNlc2FtZQ==" | base64 -D

Aladdin:open sesame

3. HTTP BA 定制数字签名

HTTP BA 定制数字签名的作用:

  • 安全通信:防止参数篡改(无法防止窃听)

HTTP BA 认证,需要提前沟通的内容:

  1. client_id:字符串,一般推荐 16个字符,代表调用方
  2. secret:跟 client_id 绑定,每个 client_id 对应一个 secret
  3. 数字签名算法:使用 secret,对 HTTP 请求行内容,计算数字签名
    1. 使用 Secret
    2. HTTP 请求头:请求方法、uri、date、param(param 利用 TreeMap 按照字典序排序)
    3. signature = base64 ( HMAC-SHA1 ( ( string_to_sign, appkey ) ) );
    4. string_to_sign

HTTP BA 签名的基本过程:

  1. 计算数字签名,Client 端:根据 client_id,使用对应 secret,对 string_to_sign 进行数字签名运算

    1. string_to_sign:uri、date、param
  2. 传输数字签名,HTTP 头部携带数字签名
    1. Authorization:头部
    2. Authorization: MWS shanghai:frJIUN8DYpKDtOLCwozzyllqDzg=
    3. MWS:M web service
    4. shanghai:client id
    5. frJIUN8DYpKDtOLCwozzyllqDzg=:具体的数字签名
  3. 验证数字签名,Server 端:根据 client_id 找出对应的 secret,并根据「签名算法」,计算签名,进行校验。

BA 认证:使用「私钥」计算数字签名,通过数字签名,验证消息的完整性和可信性。

  1. 私钥:双方线下沟通「身份标识」和「私钥」
  2. 签名算法:线下沟通「签名算法」和「签名原始字符串」
  3. 双方:都使用「私钥」、「签名算法」、「签名原始字符串」,验证数字签名的正确性

3.1. 具体算法

HMAC-SHA2

HMAC:Hash-based Message Authentication Code,使用 secret 对 message 进行hash 运算,具体 Hash 算法,MD5、SHA-1、SHA-2

  • MD5:输出 hash 值 128 bit

    • MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。128位长度。目前MD5是一种不可逆算法。
    • 具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。
  • SHA-1:输出 hash 值 160 bit
    • SHA1的全称是Secure Hash Algorithm(安全哈希算法) 。
    • SHA1基于MD5,加密后的数据长度更长,
    • 因此,比MD5更加安全,但SHA1的运算速度就比MD5要慢了。
    • 它对长度小于264的输入,产生长度为160bit的散列值。比MD5多32位。
    • 2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1
  • SHA-2:输出 hash 值 256 bit 等,具体实现不同,bit 位数也不同
    • 包含SHA-256 、SHA-512等
    • 暂未被攻破

Base64

  • 3 个 8 bit,变为 4 个 6 bit;
  • 高位 bit,填充 0;
  • 安全性:低,可以解码

4. 参考资料

时间: 2024-08-25 22:34:54

HTTP Basic Auth:BA 认证的相关文章

ios开发使用Basic Auth 认证方式

我们app的开发通常有2种认证方式   一种是Basic Auth,一种是OAuth:现在普遍还是使用OAuth的多,而使用Basic Auth认证的少,正好呢我今天给大家介绍的就是使用的比较少的Badic Auth认证方式,这种认证方式开发和调试简单, 没有复杂的页面跳转逻辑和交互过程,更利于发起方控制.然而缺点就是安全性更低,不过也没事,我们可以使用https安全加密协议,这样才更安全. 我使用的是AFNetworking发送的网络请求,因此我们用Basic Auth认证方式就不能再使用AF

java 发送带Basic Auth认证的http post请求

构造http header private static final String URL = "url"; private static final String APP_KEY = "key"; private static final String SECRET_KEY = "secret"; /** * 构造Basic Auth认证头信息 * * @return */ private String getHeader() { String

Nginx下配置Http Basic Auth保护目录

nginx basic auth指令 语法:     auth_basic string | off;默认值:     auth_basic off;配置段:     http, server, location, limit_except 默认表示不开启认证,后面如果跟上字符,这些字符会在弹窗中显示. 语法:     auth_basic_user_file file;默认值:     -配置段:     http, server, location, limit_except 1. 下载这个

HTTP验证大法(Basic Auth,Session, JWT, Oauth, Openid)

本文标签:   HTTP Auth OpenID HTTP验证大法 Session REST   服务器 成为一个"认证"老司机 本文翻译自 Auth-Boss . 如果有翻译的不恰当或不对的地方, 欢迎指出. 成为一个认证老司机, 了解网络上不同的身份认证方法. 本文档的目的是记录和编目Web上的身份验证方法. 认证指的是创建一个系统的过程,用户可以通过该系统"登录"在线服务,并授予对受保护资源的访问权限. 以下引用可能更好地总结我想要解释的内容: 客户端认证涉及

Basic Auth攻击

Basic Auth攻击 1.Basic Auth认证简介 Basic身份认证,是HTTP 1.0中引入的认证方案之一.虽然方案比较古老,同时存在安全缺陷,但由于实现简单,至今仍有不少网站在使用它. 例如Apche Tomcat.路由器等. 2.认证步骤 1.如下,用户访问受限资源 /protected_docs.请求报文如下: GET /protected_docs HTTP/1.1 Host: 127.0.0.1:3000 2.服务端发现 /protected_docs 为受限资源,于是向用

ThinkPHP的Auth类认证

Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 .  RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了,比如页面上面的操作按钮, 我想判断用户权限来显示这个按钮, 如果没有权限就不会显示这个按钮:  再比如我想按积分进行权限认证,  积分在0-100时能干什么, 在101-200时能干什么.  这些权限认证用RABC都很困难.     下面介绍 Auth权限认证, 它几乎是全能的, 除了能进行节点认

比RBAC更好的权限认证方式(Auth类认证)

Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了,比如页面上面的操作按钮, 我想判断用户权限来显示这个按钮, 如果没有权限就不会显示这个按钮: 再比如我想按积分进行权限认证, 积分在0-100时能干什么, 在101-200时能干什么. 这些权限认证用RABC都很困难. 下面介绍 Auth权限认证, 它几乎是全能的, 除了能进行节点认证, 上面说的R

elasticsearch&#39;s basic auth plugin &quot;Jetty&quot;

Elasticsearch本身是沒有安全性的功能, 我們得透過plugin來安裝, 這次我選擇了elasticsearch-jetty,此外也有人用nginx反向代理來進行控制. 首先我們得先注意到Elasticsearch與Jetty Plugin的版本號對應, 在這裡可以查看, 如果版本號沒對應上就無法正常工作了. 這次範例是用1.2.1版本(Elasticsearch & Jetty Plugin), 到es的bin目錄下執行 plugin -url https://oss-es-plug

thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)

thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证) Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了,比如页面上面的操作按钮, 我想判断用户权限来显示这个按钮, 如果没有权限就不会显示这个按钮: 再比如我想按积分进行权限认证, 积分在0-100时能干什么, 在101-200时能干什么. 这些权限认证用RABC都很困难.