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)认证实践 的相关文章

  • 如何使用 SPNEGO 和 CAS 获取 LDAP 用户属性?

    使用 CAS 5 3 x 和 SPNEGO Kerberos 身份验证 如何获取除 SAMAccountName 之外的更多用户属性 当我只使用 标准 LDAP 身份验证处理程序时 我可以放置以下配置 cas authn ldap 0 pr
  • App Engine 的 Google Cloud Storage 身份验证

    我们希望开始使用 Google Cloud Storage 作为用户上传文件的持久存储 不幸的是 我无法添加应用程序标识 应用程序 ID appspot gserviceaccount com 到我们的 团队 因为我们的团队基于 Googl
  • 使用带有十六进制字符串的 CryptoJS

    我想连接到蓝牙设备 仅通过十六进制字符串进行通信 我需要编码一个 16 字节值 因此我也期望一个 16 字节的值 在我的实现中 CryptoJS 总是返回更长的结果 根据文档 不需要 IV 所有 16 字节数据必须使用当前存储在设备中的客户
  • 使用 SimpleMembership 获取用户信息

    仍在尝试使用 MVC4 来掌握新的 SimpleMembership 我更改了模型以包含名字和姓氏 效果很好 我想更改登录时显示的信息 而不是在视图中使用 User Identity Name 我想做类似 User Identity For
  • Yii2 从 MySQL 中的表登录的分步指南

    我开始在 Yii2 中迈出第一步 到目前为止 我已经能够编写一个应用程序并将数据库中的表连接到它 就像我在 Yii1 中学到的那样 该表是contacts我的创建视图中的表单将数据发送到数据库 没有任何问题 问题是我只能在 Yii2 内置的
  • Next.JS 中止获取路由组件:“/login”

    我正在开发一个用于每页身份验证的 useUser Hook 我已经正常实现了 useUser 挂钩 因此重定向工作正常 但我收到上述错误 中止获取路由组件 login 我该如何修复 useUserHook 来解 决它 useUser tsx
  • 如何在 ASP.NET MVC 5 中实现简单的身份验证

    我有一个带有 SQL Server 数据库的现有项目 带有数据库优先的 EF 工作单元和服务层 我需要添加 ASP NET MVC 项目并使用现有服务来验证用户身份 我发现了不同的复杂决定 我需要在身份中使用我的服务或在没有身份的情况下实现
  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 将 Jabber/XMPP 与其他系统集成(身份验证、密码共享)

    是否可以指示 jabber xmpp 服务器将身份验证委托给另一个模块 我们正在使用 XMPP 构建一个内部应用程序 如果我们能让用户保留他们在我们的 Web 应用程序中使用的标准用户名 密码 那就太好了 网络应用程序当前正在对密码进行哈希
  • SFTP Java - 管道关闭 Jsch 异常

    我正在研究一种 java 方法 将文件从一个位置复制到另一个远程位置 我的代码如下 我尝试使用jsch 0 1 42 0 1 50 0 1 54 public static void processFiles ArrayList
  • 在 Django Admin 中隐藏 Auth 部分 [重复]

    这个问题在这里已经有答案了 在 Django 管理中 有什么方法可以隐藏 Auth 部分吗 假设这是 Django 和准系统项目的全新安装 没有应用程序 只有管理员 您可以使用admin site unregister from djang
  • 在 keycloak 令牌中使用“sub”声明作为内部数据库中的用户 ID 是否安全

    我正在开发一个将来可能支持社交登录的应用程序 除了我们自己的 keycloak 用户名 电子邮件注册之外 我正在尝试确定使用 keycloak ID 令牌中的 sub 声明作为我们内部 mongo 数据库中用户的主键 id 字段 是否安全
  • 如何使用 LDAP 身份验证使用 gitlab 设置管理员用户?

    我刚刚设置了 gitlab 但我完全迷失了管理员用户 维基百科似乎对这个话题保持沉默 谷歌也没有提供帮助 那么 如何在 LDAP 身份验证上使用 gitlab 设置管理员用户 您还可以通过在 Rails 控制台中执行以下操作来为用户设置管理
  • 为移动应用程序创建 API - 身份验证和授权

    Overview 我正在寻找为我的应用程序创建一个 REST API 最初 主要目的是供移动应用程序 iPhone Android Symbian 等 使用 我一直在研究基于 Web 的 API 的身份验证和授权的不同机制 通过研究其他实现
  • SmartGIT 不要求 ssh 密钥

    切换到新计算机后 我必须再次安装 Windows 版 SmartGIT 现在尝试克隆我的 fedorahosted org repository 密钥存储在 C User myusername ssh SmartGIT 附带了全新安装 并且
  • Rails 身份验证插件推荐

    我想向我的 Rails 应用程序添加身份验证 我遇到了几个这样做的插件 acts as authenticated restful authentication Authlogic 等 我还没有看到一篇文章描述使用每种方法的差异 优点和缺点
  • laravel 4 登录验证失败

    在 Laravel4 中 我在路由中编写了以下代码 但它总是将我重定向到登录页面 我用谷歌搜索并在堆栈溢出上找到了它 并尝试了所有解决方案但没有成功 我确信这将是一个愚蠢的错误 但请跟踪它 谢谢 Routes Route post logi
  • 确定用于映射网络驱动器的域和用户名

    使用带有 SP1 的 Windows 7 Enterprise 但我希望得到适用于 Windows XP 2003 2008 Vista 7 的通用答案 从命令提示符处 我执行net use命令将 Z 驱动器映射到另一台计算机上的共享 但我
  • Firebase GAS webapp Google 弹出窗口消失

    我正在尝试升级我的 firebase GAS web 应用程序 之前我有一个弹出窗口 可以让用户使用 Google 登录 我不确定我做错了什么 但我已经升级到新的 firebase 现在正在尝试使用新的代码格式进行相同的登录 发生的情况是
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber

随机推荐

  • 【传感器标定】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