BA(Basic authentication)认证实践

2023-05-16

1、概念介绍

Basic authentication:是一种最简单的对Web资源进行访问控制的方法,属应用层的安全保障手段。常用的签名算法有:base64、HmacSHA1

1)优点:简单

  • 服务器无需维护session、cookie,方便curl测试。
  • 甚至可以不用登陆界面
  • 使用HTTP header中的标准字段,所以也不需要握手

2)缺点:如果只采用通过base64这种签名算法进行传输是不行的,因为很容易就被解码。所以为了保证BA的安全,要通过私钥定制签名算法

2、BA认证的过程

案例:服务A要通过restful的方式请求服务B,服务B采取了BA认证的方式来请求是合法的。

2.1 整体流程

B 事先给 A 分配了一对clientID和secret,约定好会校验会用到两个header:Authorization、Date,并将Authorization的格式告诉A。A发起请求的过程如下:

2.2 实现细节

BA认证重要的是设计理念,实现细节因人而异,这里我们讲一下比较通用的做法 

1)生成Authorization

格式:"MILK" + " " + "{clientID}" + ":" + "{signature}"

其中:

  • “MILK”:只是个示例,一般会用一个字符串常量,标识你的公司,或者系统;
  • {clientID}: B给A分配的clientID,格式自由定义
  • {signature}: 对一次请求的信息和时间进行签名加密

代码:

public static final String DATE_FORMAT = "EEE dd MMM yyyy HH:mm:ss 'GMT'";


    public static String getAuthorization(String uri, String method, String clientId, String secret) {
        String date = LocalDateTime.now(ZoneId.of("GMT")).format(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.US));
        String stringToSign = method + " " + uri + "\n" + date;
        String signature = getSignature(stringToSign, secret);
        return "MILK " + clientId + ":" + signature;
    }

    public static String getSignature(String data, String secret) {
        try {
            SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            byte[] rawHmac = mac.doFinal(data.getBytes());
            String result = Base64.encodeToString(rawHmac);
            return result;
        } catch (Exception e) {
            throw new IllegalStateException("Failed to generate HMAC : " + e.getMessage());
        }
    }

2)服务端进行校验

服务端进行校验,有两种思路:

  • 比较解码后的信息是否正确
  • 比较编码的结果是否正确:这个
    • 从Authorization中解码出clientID,拿到请求的uri、http方法、header中的date,查询对应的secret,进行加密,看下标准的authorization是否正确(加密过程和上面代码几乎一样)
    • 通常会增加一些时间窗口,先行检查下是否过期,过期就直接认为验证失败

代码:校验窗口时间:

    private static boolean checkDate(String date){
        if (StringUtils.isBlank(date)){
            return false;
        }
        try{
            DateTime date = DATE_FORMAT.parseDateTime(date);
            DateTime now = DateTime.now(DateTimeZone.forID("Etc/GMT"));
            return now.minusMinutes(10).isBefore(date) && now.plusMinutes(10).isAfter(date);
        }catch (Exception exception){
            return false;
        }
    }

3、Base64编码简介

  • 通过64个可打印字符来表示二进制数据,由于2^6=64,所以每6个比特为一组,表示一个可打印字符。
  • 可打印字符有:A-Z、a-z、0-9、+、"/"
  • 编码过程
    • 每 3 个8Bit的字节,转换为4 个 6 Bit的字节;
    • 6 Bit再添 2 位高位 0;
    • 组成四个8Bit的字节;
    • 3*8 = 4*6 = 24
    • 3 个字节,变为 4 个字节,字符串长度增长 1/3

Base64等,是一种编码算法,不是一种加密算法对数据进行编码是为了让数据更适合传输而不是让数据机密性变强

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

BA(Basic authentication)认证实践 的相关文章

  • 强制用户注销会话 PHP

    我似乎无法找到这个问题的直接答案 有没有办法强制登录用户注销 我的登录系统本质上只依赖于包含用户唯一 ID 存储在 mysql 数据库中 的会话 所以本质上只是 if isset SESSION user id echo You re lo
  • WCF net.tcp 绑定、消息格式和安全问题

    很抱歉问了一些愚蠢的问题 但有些事情我无法理解 对于以下问题的一些建议将不胜感激 在非常基础的层面上 WCF 使用二进制 Net Tcp HTTP 或 MSMQ 在线传输消息是否正确 然而 在所有情况下 无论数据如何传输 消息本身都是带有标
  • JWT 身份验证:使用 UI 令牌来验证 Graphene/Django (GraphQL) 查询?

    我正在开发一个具有以下架构的项目 UI 通过 Node 服务器 GraphQL 的 Apollo 客户端对客户端和服务器端渲染进行反应 API Django 通过 Graphene 处理 GraphQL 查询 我使用 Auth0 基于 JW
  • PHP“记住我”安全漏洞?

    我正在编写一个配备 记住我 的登录表单 到目前为止 我读过的教程 部分是为了确保我做得正确 都说将加密的密码存储在 cookie 中与用户名 然后 每次 PHP 检查当前用户是否未登录时 检查他们的 cookie 并查找这些值 如果用户名与
  • Sql 异常:管道的另一端没有进程

    我无法从 C 代码访问我的 sql 服务器连接 我收到此错误 Sql 异常 管道的另一端没有进程 这是我的 app config 中的连接字符串
  • Amplify 的completeNewPassword 方法针对用户数据抛出 TypeError

    我尝试将自定义 UI 与 aws Amplify 结合使用 但遇到了 Auth completeNewPassword 问题 任何使用此方法的尝试都会引发错误Error in v on handler TypeError Cannot re
  • 龙卷风 websocket 应用程序中的用户身份验证

    现在 我提高了我的龙卷风技能 并有一个关于用户身份验证的问题 我的解决方案是在首页上创建安全令牌 然后将其与其他数据一起发送 从 javascript 到龙卷风服务器 在其中检查和验证用户 我想到了 cookie 但我不知道如何读取 coo
  • 路由的登录和身份验证(反应或服务器端)

    我正在尝试保护反应页面上的表单路由 我在服务器端注册并登录 对于如何对该路由使用身份验证有点困惑 这是我的 app js 我的客户端路由 const App gt return
  • 因登录失败 3 次而禁用帐户 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 创建持久的 php 登录 cookie 会话

    我试图让我的登录会话持续更长时间 这样人们就不会过早退出我的网站 例如 制作一篇博客文章并在提交时丢失 因为 php 的 cookie 过期了 理想情况下 我想给他们一个 2 小时的会话 他们不会注销 每次加载页面时都会刷新 下面的代码片段
  • 将自定义标头值传递给 IdentityServer4 Login

    当用户尝试登录时 我尝试将自定义标头值 无 cookie 传递给 IdentityServer4 这是所有设置的方式 自定义身份验证属性 AttributeUsage AttributeTargets Class AttributeTarg
  • BlazorNotifyAuthenticationStateChanged 不会更新基于授权的元素

    我正在实施一个自定义AuthenticationStateProvider并在 mainLayout 中使用来自用户声明的信息 据我了解执行后NotifyAuthenticationStateChanged方法本身应该重新渲染所有使用的组件
  • 我可以使用 Android Account Manager 获取 App Engine 的 OAuth 访问令牌吗?

    我的 AppEngine 服务器有 Android 客户端 两者都使用 Google 帐户 我想使用 AccountManager 来获取访问令牌对于 OAuth 到目前为止我正在使用 ClientLogin 但我想切换到 OAuth 在
  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • symfony2 :使用 fosuserbundle 登录后使用引荐来源网址

    我在登录成功后将 fosuserbundle 重定向到引荐来源网址时遇到问题 应用程序 配置 security yml security encoders FOS UserBundle Model UserInterface sha512
  • 保护登录和评论表单免受 CSRF 攻击

    我读过很多关于CSRF保护的文章 这个不错 http seclab stanford edu websec csrf csrf pdf 以及关于SO的各种问题 但它们似乎都没有足够的信息来回答我的问题 我正在开发自己的 CMS 我想保护我的
  • 在 Laravel 中创建用户表

    我在 laravel 的用户表方面遇到了一些麻烦 我很久以前就已经删除了那些默认表 现在我尝试使用 Auth 但无法注册 因为数据库中没有表 但我也无法创建表php artisan migrate 因为我已经删除了那些迁移表 所以我想再次创
  • 社交登录重复帐户冲突

    我正在制作一个新应用程序 除了常规电子邮件 密码注册之外 还需要多个社交注册 但是有一种特殊情况可能会导致数据完整性问题 例子 用户在 Facebook 上注册 但没有收到任何电子邮件回复 我在数据库中创建一个用户 将电子邮件和密码设置为
  • next-auth google 提供商无法正常工作,访问被阻止:此应用程序的请求无效

    这整个星 期我都在摸索 我已经尝试了几乎所有的方法 我正在尝试使用 next auth google 提供商 在 GCP 中 在授权网址和重定向网址中 本地主机 3000 真实域名网站 本地主机 3000 api auth callback
  • Spring Security - 基于令牌的 API 身份验证和用户/密码身份验证

    我正在尝试创建一个主要使用 Spring 提供 REST API 的 Web 应用程序 并尝试配置安全方面 我正在尝试实现这种模式 https developers google com accounts docs MobileApps h

随机推荐

  • 【传感器标定】kalibr 标定工具箱问题汇总

    文章目录 写在前面一 运行一段时间报错 96 Spline Coefficient Buffer Exceeded Set larger buffer margins 96 的解决方法1 问题描述2 解决方法参考链接 写在前面 kalibr
  • C++中的Vector存放指针的清空问题

    C 43 43 中的Vector存放指针的清空问题 一 写在前面二 参考做法参考链接 这两个链接写得挺好 xff0c 可以参考下 一 写在前面 C 43 43 很难的一个重要原因就是内存管理的问题 xff0c 因为你既要管理申请内存 xff
  • find_package(xxxx REQUIRED)找不到路径的全平台通用解决办法

    相信刚学cmake c 43 43 的朋友们在编译的时候一定被这个问题折磨许久哈 然后怎么搜怎么添加都有问题 xff0c 仔细研究了我才发现这个地方不同的索引机制 xff0c 但是表面上都是 find package xxxx REQUIR
  • STC51-串口通信

    1 并行与串行基本通信方式 随着单片机系统的广泛应用和计算机网络技术的普及 xff0c 单片机的通信功能愈来愈显得重要 单片机通信是指单片机与计算机或单片机与单片机之间的信息交换 xff0c 通常单片机与计算机之间的通信我们用的较多 通信有
  • qt种实现搜索栏功能

    引言 在搜索栏种输入要搜索的文本 xff0c 就会出现相关联的文本提示 xff0c 这是可以通过鼠标选中要搜索的文本 xff0c 或者通过上下键选中要搜索的文本 效果 效果图如下所示 xff1a 实现 下面是相关的代码实现 xff0c 读者
  • orangePi3 TLS烧录启动、wifi配置和ssh登录、烧录进内置emmc flash

    orangePi3 TLS烧录启动 wifi配置和ssh登录 烧录进内置emmc flash 烧录镜像到TF卡启动 镜像下载 官方镜像地址 xff1a http www orangepi cn html hardWare computerA
  • C/C++——代码的编译和运行

    1 编译过程 每种高级语言都有对应的编译器 xff0c 而且针对不同指令集架构的CPU会提供不同的编译器 本文以C语言为例 xff0c CPU指令集架构不做前提约束 xff0c 实际上同一种语言也只有在狭义的编译阶段有所区别 xff0c 其
  • Arduino UNO GPS 制作 里程表 经纬度

    机缘 上过月买了一个GPS模块 xff0c 然后我用esp32读取GPS数据 xff0c 并使用LVGL显示GPS信息 期间踩了很多坑 xff0c 我用乐鑫的IDF开发 xff0c 自己写了一个GPS信息提取方法 xff0c BUG很多 x
  • socket编程——UDP协议(C语言编程)

    1 收发信息 ssize t sendto int socket void message size t length int flags struct sockaddr dest addr socklen t dest len 返回值 l
  • 【C语言之线性表链式存储结构】

    C语言之线性表链式存储结构 文章目录 C语言之线性表链式存储结构前言一 线性表链式存储结构定义二 相关概念1 结点1 头指针 三 代码描述1 单链表结点定义1 单链表的创建2 单链表的查找3 在单链表中 xff0c 替换某一个位置的数据4
  • unsigned char* (uchar*) 转为QImage

    场景 xff1a 有一副图像 xff0c 事先已经因为各种需要被读取到了内存中 xff0c 且不可再根据路径读取 xff0c 只能读取内存中的数据转为QImage 百度过好久 xff0c 没有一个帖子说的特别详细 xff0c 解释的特别清楚
  • 卷积的含义-详解

    原文链接 xff1a 点击此处看知乎原文 最近需要用到卷积对图像进行处理 xff0c 不明白卷积的含义 xff0c 找资料的时候在知乎找到一个很优秀的评论 xff0c 特此记录一下 以下内容来自于原文复制 xff1a 对卷积的困惑 卷积这个
  • 图像处理-直方图均衡化(C++实现,不依赖opencv)

    近来接触图像处理领域 xff0c opencv入门之后 xff0c 想自己动手实现一些算法 xff0c 先从直方图均衡化开始吧 xff01 我使用的图像文件是只包含数据yuv格式图像 xff0c 以后等需要的时候再处理从普通格式 xff08
  • 图像处理-Sobel边缘检测(C++实现,不依赖opencv)

    边缘检测一直是图像处理中比较热门的一块 xff0c 今天简单实现了下sobel算法 先上图 xff1a 原图 xff1a Sobel处理 彩图 xff1a Sobel处理 灰度图 xff1a 可以看到在不复杂的情况下 xff0c Sobel
  • 图像处理-高斯滤波和升级版Side Window版高斯滤波(C++实现,无需opencv)

    图像处理绕不开的一个环节就是去燥 xff0c 去掉各式各样的噪声来保证图像的质量 今天将高斯滤波实现了下 xff0c 在此稍作记录 以往惯例 xff0c 先上图 xff1a 原图 xff1a 高斯滤波 xff1a Side Window版高
  • Linux下,使用nginx+ffmpeg+video.js实现直播效果(含centos7环境配置步骤)

    前言 近来因为项目需要 xff0c 需要做一个把视频解码然后推流 xff0c 在浏览器播放的功能 然后查资料 找demo xff0c 最终决定使用FFmpeg 43 nginx来完成相应功能 xff0c 过程颇为心酸 xff0c 在此做下笔
  • 使用QMap保存数据时,若出现相同的键,可以在不改变原有的变量存储选型基础上,使用insertMulti函数来解决

    场景 问题发生场景解决办法方案一方案二方案三 xff08 重点 xff09 针对方案三的示例 问题发生场景 本来项目中选型选择的是QMap来存储相应的键值对 xff0c 根据Map中的键的顺序取出对应的值 但是在使用的过程中 xff0c 发
  • C语言,声明和实现放在头文件中

    将头文件和实现放在同一个文件中 普通函数与静态函数是有区别的 静态函数 xff1a static h ifndef CRND INCLUDE CRND H define CRND INCLUDE CRND H static int pore
  • C++的编译过程详解

    C C 43 43 编译过程 C C 43 43 编译过程主要分为4个过程 编译预处理编译 优化阶段汇编过程链接程序 一 编译预处理 xff08 1 xff09 宏定义指令 xff0c 如 define Name TokenString x
  • BA(Basic authentication)认证实践

    1 概念介绍 Basic authentication xff1a 是一种最简单的对Web资源进行访问控制的方法 xff0c 属应用层的安全保障手段 常用的签名算法有 xff1a base64 HmacSHA1 1 xff09 优点 xff