API签名鉴权设计

news2024/11/24 5:54:40

鉴权作用

在实际的业务中,必然会存在和其他平台系统进行数据传输。这个时候出于对数据的保密要求,都会对接口(API)添加鉴权机制,识别调用方的真实身份,对未通过鉴权的请求不做任何业务处理,以帮助接口更好的识别用户及其调用行为的合法性。

API鉴权的作用:识别调用方身份,控制API的访问权限,进而保护平台数据的安全。

鉴权方案设计

目前鉴权主要分为两种:Token方案和API签名方案。
1、两者最大的不同在于校验信息的适用范围不同,而由此带来的安全方面的差距就比较明显。
Token方案:多个请求(即一段时间内的请求)对应一个Token。若Token信息被窃取后,其他平台是可以据此伪造一系列请求进行攻击的。
API签名方案:一个请求对应一个签名信息;若API签名信息被窃取后,其他平台是无法据此发起更多有效攻击的

2、两者的第二大不同在于,密钥信息的使用不同,由此带来使用场景方面的不同。
Token方案:存在登录交互的过程,用户输入一次密钥,换回票据;后续请求无需密钥参与,使用票据即可。在另一篇博文中有介绍,OAuth 2.0设计(以微信登录为例)
API签名方案:每次请求都需要密钥参与,绝不可能每次请求都让用户输入密钥,那么就要求发起方存储密钥;若是js、app等纯前端场景存储密钥一定安全问题。

总结:API签名方案适用于安全性较高的后端交互场景,其余则考虑Token方案。

API签名方案

数据准备

对一个已存在的API添加签名鉴权,一般需要在接口请求参数处额外增加以下五个签名特有参数。
签名必须参数
ServiceID:第三方平台调用API前,必须向API所在系统申请一个唯一的标识。调用者调用API时在请求中带上该ServiceID,API则。通过SecretID确认调用者身份。(API系统为每个调用者分配一个唯一的ServiceID)

ServiceKey:由于ServiceID是明文,极容易被窃取和伪造;但ServiceID不能隐藏或加密,因为SecretID需要明确告诉API请求方是谁。故,在ServiceID之外,设计了一个和ServiceID绑定的信息ServiceKey。调用者必须保护好ServiceKey,不能在任何地方明文显示,也不要请求过程中传输。它主要是用来生成Sign值。

Nonce:随机字符串,是调用者随机生成的值,通过请求传递给API。其组成和长度没有固定规则,主要是为了增加sign签名的多变性和防止重复请求。

TimeStamp:时间戳,调用请求时间,用来生成Sign和验证请求的时效。

Sign:参数签名,防止参数在传输过程中被非法篡改。一般由 (请求中所有非空参数 + ServiceID + ServiceKey + Nonce + TimeStamp)通过加密算法生成。sign通过请求传递给API确认请求是否合法。

调用方流程

(1)生成请求正常参数。

(2)生成随机数Nonce,TimeStamp;获取ServiceID和ServiceKey;拼接签名内容,加密生成Sign信息。

(3)调用API时,带上ServiceID,Nonce,TimeStamp和Sign等信息。
调用流程

服务API方校验流程

(1)获取请求,校验必须参数是否为空。

(2)校验时间有效性Timestamp;校验Nonce唯一性;根据SecretId获取SecretKey,和其他参数生成Sign;校验请求签名和服务端生产签名是否一致。

(3)校验通过,正常处理请求。

API校验流程
具体代码:

// VerifySign 校验权限
func VerifySign(auth Auth, ctx context.Context) (bool, error) {
	// 1. 验证时间戳
	now := time.Now().Unix()
	diff := uint64(now) - auth.Timestamp
	if diff > 10 {
		return false, nil
	}

	// 2. 验证请求是否重复
	m := redis.NewModel(ctx)
	flag, err := m.ExistsKey(auth.Sign)
	if err != nil {
		return false, err
	}
	if flag {
		return false, err
	} else {
		err = m.SetKey(auth.Sign, 10)
		if err != nil {
			return false, err
		}
	}

	// 3. 加密签名
	s := tool.SignElem{
		ServiceID:  auth.ServiceID,
		ServiceKey: auth.ServiceKey,
		Random:     auth.Nonce,
		TimeStamp:  auth.Timestamp,
	}
	sign := tool.HmacSha512Sign(s)
	if sign != auth.Sign {
		return false, nil
	}

	return true, nil
}

注意,上述代码都没有携带参数,真实使用时需修改入参携带具体API参数。

签名生产流程

在密码学中,有对称加密算法、非对称加密算法、 希运算消息认证码等等几种方案可以很好保护用户密钥的同时,验证用户的身份。

(1)排除非对称加密算法,理由是耗时长,性能差。通过实测,非对接加密算法(RSA)相对加密算法(AES)和 希运算消息认证码算法(HmacSHA256)的加解密耗时要高2~3个数量级,对于一个服务端来说,性能也是很重要的考虑标准,故一般不选择非对称加密算法。

(2)Hmac和AES似乎都不错,而且AES更优。但考虑到签名的目的,除了明确用户身份外,还要明确调用者的调用行为;也就是说,为了需要保证整个请求的完整性,需要加密整个请求的所有关键内容,这时,Hmac算法的防伪造性(即修改一个字节,签名信息就完全不一样)的优势就突显出来了,在性能差不多的情况下,当然,选择Hmac算法了。

(3)Hmac支持的hash算法非常多,但一般不建议使用MD5和SHA1,因其有哈希长度扩展攻击(Hash Length Extension Attacks)的风险,故一般推荐使用HmacSHA256或HmacSHA512。

若服务端支持多种算法,则请求时,需明确带上使用的签名方法:SignatureMethod。

在这里插入图片描述
注意,上述代码都没有携带参数,真实使用时需修改入参携带具体API参数。

保证请求时效性

客户端调用接口时对应的当前请求的Timestamp, 即某个请求,其请求时间戳Timestamp,和服务端的当前时间在规定时间内(如1分钟内)则为合法请求,反之,则视为无效请求。

防重复提交

对于一些需要防止客户端重复提交的(如非幂等性重要操作),具体是获取第一次请求时将sign作为key保存到redis,并设置超时时间,超时时间和Timestamp中设置的差值相同。当同一个请求第二次访问时会先检测redis是否存在该sign,如果存在则证明重复提交了,接口就不再继续调用了。(也可以存储Nonce)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国科大模式识别导论作业3:神经网络

目录题目代码data.pyutils.pynetwork.pymain.py结果整理一下近期作业中的编程题,仅供交流学习题目 本题使用的数据如下: 第一类 10 个样本(三维空间): [ 1.58, 2.32, -5.8], [ 0.67, 1.58, -4.78], [ 1.04, 1.01, -3…

OpenCV 图像旋转、平移、缩放

本文是 OpenCV图像视觉入门之路的第7篇文章,本文详细的进行了图像的缩放 cv2.resize()、旋转 cv2.flip()、平移 cv2.warpAffine()等操作。 OpenCV 图像旋转、平移、缩放目录 1 缩放图片 2 翻转图片 2.1 垂直翻转 2.2 水平翻转 2.3 水平垂直翻转 ​编辑 3 平移…

百度离线人脸识别SDK

1,采坑备忘 (1)8.1版本的SDK在spring-boot接口访问第一次正常,第二次之后JVM会奔溃,可能是java gc 处理C开出的内存有问题。 换6.1.3版本的SDK。 javaWindows百度离线人脸识别SDK6.1.3-Java文档类资源-CSDN下载javaW…

Harmony/OpenHarmony应用开发-转场动画页面间转场

在全局pageTransition方法内配置页面入场和页面退场时的自定义转场动效。 说明:从API Version 7开始支持。开发语言ets. 名称 参数 参数描述 PageTransitionEnter { type: RouteType, duration: number, curve: Curve | string, delay: number } 设置当前页面…

1998-2014年企业绿色发展数据库

1998-2014年工业企业的排放排污和环境治理等信息数据 1、时间:1998-2014年 2、数据来源:原环保部。 3、统计字段:主要有企业基本信息、生产信息、水环境、大气环境,内容涵盖了资源利用类指标(工业用水量、煤炭消费量…

YGG 与 Thirdverse 达成合作,将《足球小将》IP 带入 Web3

YGG 与 Thirdverse 建立了合作关系,Thirdverse 是一家专注于多人 VR 和 Web3 游戏的游戏工作室,在日本和美国分别设有办事处。 YGG 通过购买未来股权的简单协议(SAFE)参与了 Thirdverse 近期的 1500 万美元融资。这种合作关系将使…

FastAPI从入门到实战(16)——依赖项

依赖注入是耳熟能详的一个词了,听起来很复杂,实际上并没那么复杂,正常的访问需要接受各种参数来构造一个对象,依赖注入就变成了只接收一个实例化对象,主要用于共享业务逻辑、共享数据库连接、实现安全、验证、权限等相…

原油投资怎么样赚钱?原油投资赚钱技巧有哪些?

以前没有交易过原油的投资者,看到其他投资者从中获得了较好的盈利,也想通过原油投资来赚钱。那么原油投资到底能不能赚钱,是很多新手投资者比较想了解的问题。其实原油投资想盈利并不能全部依靠运气,只有掌握了原油投资赚钱技巧&a…

【Java基础】Java日志—什么是日志级别?如何配置数据源到不同的位置?配置文件内容都是什么含义?

目录 一、log4j1详情:记录器和日志级别 二、 log4j1详情:输出源【输出到不同的位置】 1、ConsoleAppender【将日志输出到控制台】 2、FileAppender【将日志输出到文件】 3、DailyRollingFileAppender【每日输出到一个新文件】 4、JDBCAppender【输…

FineReport开源报表系统-JS实现切换Tab块时进行数据联动

1. 概述 1.1 预期效果 在决策报表中,希望 Tab 块轮播切换时,可实现与报表块的数据联动。如下图所示: 1.2 实现思路 通过 JS 获取每个 Tab 块的轮播标题,转换为参数值,再通过控件进行界面传参,实现联动效果…

程序员工作五年后一般会怎样?

最近看到一些吐血言论“一个程序员工作5年后还没成为大牛,是不是该考虑别的路子了?”还有“程序员入行五年,有可能攒够80吗?”不是,程序员工作五年,是戳中了谁的痛点吗??大家对五年经…

128页4万字某智慧能源集团数字化管理平台项目建议书

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容: 方案设计 在当…

公司新来的软件测试工程师接私活被抓了,难怪他天天加班到凌晨

昨天和我一起进公司的测试部门同事上班接私活被老板抓了,这人才来不到两个月,每天加班到凌晨。刚开始还以为他是个卷王,没想到此人上班时间接单,用加班时间来完成公司需求,造成努力的假象。被老板在办公室骂了俩小时&a…

v$asm_disk中free_mb低于300m导致加盘报ora-15041

背景: 某项目扩容加盘到磁盘组中报磁盘组空间耗尽的错误,如下 明明是加盘,却报空间不足的错误,令人费解 报错的磁盘组为normal冗余,且Usable_file_MB为负,且Free_MB剩余很少或为0 问题排查: …

MS 训练笔记【2】:nnFormer

文章目录前言1. 安装2. 训练与测试2.1. 数据处理2.1.1. 整理数据路径2.1.2. 设置 nnFormer 读取文件的路径2.1.3. 数据集预处理2.2. 训练2.2.1. 训练代码2.2.2. 可能出现的问题及解决办法2.3. 预测总结前言 本文主要记载 nnFormer 从安装到训练再到推理的过程。nnFormer 的环境…

invokeBeanFactoryPostProcessors的理解

invokeBeanFactoryPostProcessors的理解 Spring中有两个非常重要的扩展点: BeanFactoryPostProcessorBeanPostProcessor 其中第一个是可以对BeanDefinition注册时进行扩展,而第二个是对spring中IOC容器中的对象进行实例化的时候进行扩展。 今天主要谈一…

【安全漏洞】水平权限漏洞和垂直权限漏洞

前言 权限校验非常重要。如果不对水平、垂直权限做校验,就会发生泄漏用户数据的事故,造成P0故障。 一、水平权限漏洞 1、水平权限漏洞基本概念 什么是水平权限漏洞呢? 简单来说,水平权限漏洞是用户CURD了本不属于他的资源。以上图…

复活天若OCR的谷歌翻译接口

文章目录1. 资源2. 效果3. 前言4. 网络相关4.1. 网络判断4.2. 网络设置5. 修改5.1. 代码修改原理5.2. 代码修改1. 资源 这里直接放出来我已经修改编译好的天若OCR,开箱即用:https://www.lanzoui.com/ifT8t0jfv1gd 访问码:24647 不过需要说明…

性能优化系列之如何为不同格式的图片选择合适的应用场景?

文章の目录一、JPEG(Joint Photographic Experts Group)1、介绍2、不适合情形3、非常适合的情形二、PNG(Portable Network Graphics)1、介绍2、不适合的情形3、非常适合的情形三、GIF(Graphics Interchange Format&…

【nowcoder】笔试强训Day9

目录 一、选择题 二、编程题 2.1另类加法 2.2走方格的方案数 一、选择题 1.下面程序的输出是:() String x"fmn"; x.toUpperCase(); String yx.replace(f,F); yy"wxy"; System.out.println(y); A FmNwxy B fmnwxy C wxyfmn D Fmnwxy String x “…