安全-认证授权、数据脱敏

article/2025/10/12 8:58:14

一、认证授权

  1. JWT :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。

  2. SSO(单点登录) :SSO(Single Sign On) 即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。

  3. 认证 (Authentication) 和授权 (Authorization)的区别是什么?
    Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
    Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。

  4. RBAC 模型了解吗?
    RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权的方式。

  5. 什么是 Cookie ? Cookie 的作用是什么?

    Cookies 是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。
    Cookie 存放在客户端,一般用来保存用户信息。

  6. 如何在项目中使用 Cookie 呢?
    Spring Boot 项目为例。
    1)设置Cookie返回给客户端

    @GetMapping("/change-username")
    public String setCookie(HttpServletResponse response) {//创建一个cookieCookie cookie = new Cookie("username","Jovan");//设置cookie 过期时间,7天cookie。setMaxAge(7*24*60*60);//添加到response中response.addCookie(cookie);return "Uesrname is change!";
    }
    

    2)使用 Spring 框架提供的 @CookieValue 注解获取特定的 cookie 的值

    @GetMapping("/")
    public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) {return "Hey! My username is " + username;
    }
    

    3) 读取所有的 Cookie 值

    @GetMapping("/all-cookies")
    public String readAllCookies(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if(cookies != null) {return Arrays.stream(cookies).map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(",  "));}
    }
  7. Cookie 和 Session 有什么区别?

Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

  1. 如果没有 Cookie 的话 Session 还能用吗?
    一般是通过 Cookie 来保存 SessionID ,假如你使用了 Cookie 保存 SessionID 的方案的话, 如果客户端禁用了 Cookie,那么 Session 就无法正常工作。
    但是,并不是没有 Cookie 之后就不能用 Session 了,比如你可以将 SessionID 放在请求的 url 里面https://javaguide.cn/?Session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,为了安全你也可以对 SessionID 进行一次加密之后再传入后端。

  2. 为什么 Cookie 无法防止 CSRF 攻击,而 Token 可以?

    CSRF(Cross Site Request Forgery)一般被翻译为 跨站请求伪造 。那么什么是 跨站请求伪造 呢?说简单用你的身份去发送一些对你不友好的请求
    进行 Session 认证的时候,我们一般使用 Cookie 来存储 SessionId,当我们登陆后后端生成一个 SessionId 放在 Cookie 中返回给客户端,服务端通过 Redis 或者其他存储工具记录保存着这个 SessionId,客户端登录以后每次请求都会带上这个 SessionId,服务端通过这个 SessionId 来标示你这个人。如果别人通过 Cookie 拿到了 SessionId 后就可以代替你的身份访问系统了。

Session 认证中 Cookie 中的 SessionId 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。

但是,我们使用 Token 的话就不会存在这个问题,在我们登录成功获得 Token 之后,一般会选择存放在 localStorage (浏览器本地存储)中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 Token,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 Token 的,所以这个请求将是非法的。

需要注意的是不论是 Cookie 还是 Token 都无法避免 跨站脚本攻击(Cross Site Scripting)XSS 。

跨站脚本攻击(Cross Site Scripting)缩写为 CSS 但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为 XSS。

XSS 中攻击者会用各种方式将恶意代码注入到其他用户的页面中。就可以通过脚本盗用信息比如 Cookie 。

  1. 什么是 Token?什么是 JWT?
    JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。
    JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。
    JWT 由 3 部分构成:
    Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
    Payload : 用来存放实际需要传递的数据
    Signature(签名) :服务器通过Payload、Header和一个密钥(secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

  2. 如何基于 Token 进行身份验证?
    在基于 Token 进行身份验证的的应用程序中,服务器通过Payload、Header和一个密钥(secret)创建令牌(Token)并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization 字段中:Authorization: Bearer Token。
    在这里插入图片描述
    用户向服务器发送用户名和密码用于登陆系统。
    身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。
    用户以后每次向后端发请求都在 Header 中带上 JWT。
    服务端检查 JWT 并从中获取用户相关信息。

  3. 什么是 OAuth 2.0?
    OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。

实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 Token,使得第三方应用能够通过该令牌获取相关的资源。

OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。

另外,现在 OAuth 2.0 也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。

二、数据脱敏
数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。


http://chatgpt.dhexx.cn/article/QtEpapir.shtml

相关文章

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用,尤其是在获得对系统的访问权限时。两者都是非常重要的主题,通常与网络相关联,作为其服务基础架构的关键部分。然而…

Authorization—权限控制流程

本篇是对Shiro体系架构的介绍,本栏目大部分内容来自于Shiro官网。翻译过程中已经尽量保证用词的准确性和易懂性,如有不准确或者不确切的地方,请联系作者加以修改。本篇内容翻译自Authorization特征与Authorization官方指南。 Authorization&…

认证 (Authentication) 和授权 (Authorization)的区别是什么?

说简单点就是: 认证 (Authentication): 你是谁。 授权 (Authorization): 你有哪些权限 干什么事情。 稍微正式点(啰嗦点)的说法就是: Authentication(认证) 是验证您的身份的凭据&a…

变量定义与类型

命名 保留字与关键字 关键字是系统已经用的,保留字是系统自带的的保留 为以后使用做准备 查看关键字方法 import keyword #引入关键字模块 print (keyword.kwlist) #打印系统全部关键字 变量声明 三种格 #格式1 s1 "北京图灵学…

Java变量定义时候的注意事项

常量定义的基本注意事项 在JAVA语言中,主要利用final关键字,(在java类中灵活使用Static关键字)来定义常量。 当常量被设定后,一般情况下就不允许在进行修改,如可以利用以下形式来定义一个常量:final doubl…

变量的定义和使用

目录 一、变量的定义 二、变量的组成 1.标识 2.类型 3.值 三、变量的多次赋值 一、变量的定义 变量名(name) 赋值运算符() 值(小王) name 小王 二、变量的组成 1.标识 表示对象所存储的物理地址,使用内置函数 id(obj) 来获取。 print(id(name)) 运行…

C语言中变量声明和变量定义的区别

本文转载至CSDN博客JeanCheng 变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。变量声明:用于向程序表明变量的类型和名字。定义也是声明,extern声明不是定义…

C++ 中的变量定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。 变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; 在这里,type 必须是一个有效的 C 数据类型…

十:变量的定义和声明的区别?

1. 变量的声明: 声明是用来告诉编译器变量的名称和类型,而不分配内存。变量的声明有两重含义: 告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。 告诉编译…

C语言基础教程 之 如何定义变量!

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; 在这里,type 必须是一个有效的 C 数据类型&…

变量的定义

变量 变量用于存储编程所使用的数据和方法。 声明一般变量的关键字:var,let,const.其中let和const是es6的语法。 声明其他特殊变量的关键字:function,class,improt(先了解)等 声明变量 变量用于存储数据,因此可以把变量实际上就…

03-变量的定义

一、变量的定义 1.变量是什么? 一句话概括:变量是用来临时保存数据的,该数据是可以变化的数据。 2.什么时候需要定义变量? 如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。…

【论文阅读】ICRA2021: VDB-EDT An Efficient Euclidean Distance Transform Algorithm Based on VDB Data Struct

参考与前言 Summary: 浩哥推荐的一篇 无人机下的建图 and planning实验 Type: ICRA Year: 2021 论文链接:https://arxiv.org/abs/2105.04419 youtube presentation video:https://youtu.be/Bojh6ylYUOo 代码链接:https://github.com/zhud…

scipy.ndimage.distance_transform_edt 和 cv2.distanceTransform用法

scipy.ndimage.distance_transform_edt 和 cv2.distanceTransform 的作用都是计算一张图上每个前景像素点到背景的最近距离。 import cv2 import numpy as np from scipy.ndimage import distance_transform_edta np.array(([0, 1, 1, 1, 1],[0, 0, 1, 1, 1],[0, 1, 1, 1, 1]…

java edt,java并发之EDT测试

测试代码如下: 1、耗时计算没有单独起线程处理,耗时计算在EDT线程执行,导致界面没有响应,处于卡死状态 package thread; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent…

linux服务端修改EDT为东八区,EDT开发环境配置

1 安装条件 512MB内存或更高 Win XP/Win Vista/Win 7/RedHat Linux 32位或者64位操作系统(推荐32位) 安装IE7/8/9、FireFoxLatest Version、Chrome等浏览器中的一种 OracleJRE 1.6或更高版本 2 安装步骤 EDT 0.8.0已经发布发布。用户现在可以在http://www.eclipse.org/edt/#d…

修改linux系统的时间EDT为CST

问题: Centos 系统时间下午时间显示为12小时制 分析: 开始以为是要设置为24小时制 后来执行date命令发现是EDT,EDT 是北美东部夏令时间,比UTC落后4个小时 解决: # mv /etc/localtime /etc/localtime.bak # ln -s …

EDT技术 ug - 第四章节Creation of the EDT Logic (持续更新)

文章目录 Compression Analysisanalyze_compression Preparetion For EDT Logic CreationParameter Specification for the EDT LogicDual Compresson ConfigurationDefine Dual Compression ConfigurationsASYmmetric Input and Output ChannelsBypass Scan ChainsLatch-Based…