高级鉴权网关设计二:SM2国密+协议SPI可扩展+动态配置

news2024/10/5 12:50:54

​ 上一篇文章是定义切面来做鉴权,针对接口时使用比较方便,还有一种是网关的鉴权如何处理?下面为大家介绍一种比较常用的方案,附带可扩展设计

​ 既然是网关其实就是和外部的礼尚往来,每个第三方还有可能不一样,一般常用的有http的form表单,get,post,https,和每个第三方的交互签名方式、加密方式都可能不同,很多时候取决于你是甲方爸爸还是乙方儿子,如果是甲方就好了,对接就按你们的来,你们来对我们,乙方就痛苦了,得适配不同的甲方爸爸,那我们该如何设计呢?

简单框架如下,提取抽象出业务节点(加密签名可有可无)
请添加图片描述

重点来了,我们可以根据channelType定义多套流程,

  1. 一个是simple简单扩展,驼峰下划线可支持转化
  2. 一个是normal常规扩展,定义公共参数,比如appid,version,sign,timestamp等等;支持驼峰转下划线,也可以支持更多
  3. 一个是个性化,一般按甲方的来很容易这样,可以定义多个个性化type,组装不同的甲方需要的个性化参数

关于加密和协议根据两个维度进行扩展,一个是加密类型encryptType,一个是协议类型protocolType,分别定义好枚举

动态配置是什么,就是配置上面我需要走哪条道所需要的配置,比如要配置encryptType=SM2,protocolType=https,channelType=simple,秘钥,域名等等

请添加图片描述

上面是完善后的流程,相对不是很难,重点在于考虑好扩展

关于加密以及签名sign,我们和外部如何友好的通信但是又不能把秘钥暴露给对方?给大家介绍一下

以SM2非对称加密为例,我们和外部都定义一套公钥私钥,分别把公钥给到对方

调用外部接口时,我们用外部给的的公钥加密,用我们的私钥加签。
外部收到请求后,使用我们的公钥验签,用外部自己的私钥解密。
然后外部将返回结果用我们的公钥加密,外部的私钥加签。我们使用外部的公钥验签,使用私钥解密。

这样保证了我们的私钥都在自己手里,实现了数据加密,并生成了sign保证了安全性

给大家附上SM2国密工具

@Slf4j
public class SM2Util {
    @Data
    public static class CryptoKey {
        public String key;
        public String VerKey;
    }

    /**
     * 创建密钥对
     */
    public static CryptoKey createKey() {
        SM2Key sm2 = new SM2Key();
        sm2.generateKey();
        String key = ByteUtil.byte2hex(sm2.getPrivKeyBytes());
        String verkey = ByteUtil.byte2hex(sm2.getPubKey()).substring(2);
        CryptoKey cryptoKey = new CryptoKey();
        cryptoKey.setKey(key);
        cryptoKey.setVerKey(verkey);
        return cryptoKey;
    }

    /**
     * 加签
     */
    public static String sign(String key, String messageRaw) {
        try {
            byte[] msgHash = HashUtil.sha256(messageRaw.getBytes());
            BigInteger privKey = new BigInteger(key, 16);
            SM2Key sM2Key = SM2Key.fromPrivate(privKey);
            String rawData = sM2Key.sign(msgHash).toBase64();
            return rawData;
        } catch (Exception e) {
            log.error("sm2 sign error ", e);
            return null;
        }
    }

    /**
     * 校验
     */
    public static boolean verify(String verkey, String messageRaw, String signatureRaw) {
        try {
            byte[] signedBytes = Base64.getDecoder().decode(signatureRaw);
            byte[] msgHash = HashUtil.sha256(messageRaw.getBytes());
            byte[] pkBytes = SM2Key.recoverPubBytesFromSignature(signedBytes, msgHash).getEncoded(false);
            String pk = ByteUtil.byte2hex(pkBytes).substring(2);
            if (verkey.equals(pk)) {
                return true;
            } else {
                return false;
            }
        }catch (Exception e){
            log.error("sm2 verify error ", e);
            return false;
        }
    }

    /**
     * 加密
     */
    public static String crypt(String verkey, String messageData) {
        try {
            byte[] rawBytes = SM2Key.encryptWithRandomKey(messageData.getBytes(), verkey);
            String rawData = ByteUtil.byte2hex(rawBytes);
            return rawData;
        }catch (Exception e){
            log.error("sm2 crypt error ", e);
            return null;
        }
    }

    /**
     * 解密
     */
    public static String decrypt(String key, String encryptedMessage)  {
        BigInteger privKey = new BigInteger(key, 16);
        SM2Key sM2Key = SM2Key.fromPrivate(privKey);
        byte[] rawData = ByteUtil.hex2byte(encryptedMessage);
        try {
            byte[] messageDataBytes = sM2Key.decryptWithRandomKey(rawData);
            String messageData = new String(messageDataBytes);
            return messageData;
        }catch (Exception e){
            log.error("sm2 decrypt error ", e);
            return null;
        }
    }
}

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

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

相关文章

2.5 KERNEL FUNCTIONS AND THREADING

我们现在准备讨论更多关于CUDA内核功能以及启动这些内核功能的效果。在CUDA中,内核函数指定所有线程在并行阶段执行的代码。由于所有这些线程执行相同的代码,CUDA编程是众所周知的单程序多数据(SPMD)[Ata 1998]并行编程风格的实例…

Matlab绘制动态心形线

1. 代码 for alpha0:0.1:30 x-1.8:0.001:1.8; y(x.^2).^(1/3)0.9*(3.3-x.^2).^(1/2).*sin(alpha*pi*x); plot(x,y,r-,LineWidth,1.2); set(gca,YGrid,on); axis([-3,3,-2,4]); text(-2,3.35,$f(x)x^{\frac{2}{3}}0.9(3.3-x^2)^{\frac{1}{2}}sin(\alpha\pi x)$,Interpreter,lat…

如何在整个项目中有效管理成本?

在项目管理方面,没有什么比控制成本更重要。尤其是在项目复杂的情况下,开支可能会让项目成本比预期飙升得更快。项目经理需要采取积极主动的成本管理方法,以保证预算不超支。 项目成本管理的各个阶段 管理项目成本需要在整个项目周期中保持…

【Docker】部署mysql 和 tomcat

目录 部署MySQL 1.搜索镜像 2. 拉取镜像 部署Tomcat 1. 搜索镜像 2.拉取镜像 3.查看镜像 部署MySQL 1.搜索镜像 docker search mysql 2. 拉取镜像 通过mysql 镜像创建对应的容器,并设置端口映射,目录映射 创建mysql 的目录 docker run -id \ …

DataGrip 数据库备份

一、备份 1、找到需要被备份的数据库demo,右键>Import/Export>Export with mysqldump 2、配置路径 点击run,等待完成 导出成功 二、还原 选择 需要导入的数据库>右键>Import/Export>Restore with ‘mysql’ 点击run,刷…

【Python从入门到进阶】46、58同城Scrapy项目案例介绍

接上篇《45、Scrapy框架核心组件介绍》 上一篇我们学习了Scrapy框架的核心组件的使用。本篇我们进入实战第一篇,以58同城的Scrapy项目案例,结合实际再次巩固一下项目结构以及代码逻辑的用法。 一、案例网站介绍 58同城是一个生活服务类平台&#xff0c…

Elasticsearch:Search tutorial - 使用 Python 进行搜索 (三)

这个是继上一篇文章 “Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)” 的续篇。在今天的文章中,本节将向你介绍一种不同的搜索方式,利用机器学习 (ML) 技术来解释含义和上下文。 向量搜索 嵌入 (embed…

文件系统与日志分析

一,文件系统 (一)inode 和block概述 1,文件数据包括元信息与实际数据 2,文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节 3,block (块) 连续的八个扇区组成一…

OCP NVME SSD规范解读-5.命令超时限制

在"4.7 Command Timeout"章节中,详细定义了NVMe命令的超时要求和限制。 CTO-1:NVMe管理命令和TCG(可信计算组)命令从提交到完成不应超过10秒,且没有其他命令未完成(QD1)。CTO-1不适用…

【Python机器学习】构造决策树

通常来说,构造决策树直到所有叶结点都是纯的叶结点,但这会导致模型非常复杂,并且对于训练数据高度过拟合。 为了防止过拟合,有两种常见策略: 1、尽早停止树的生长,也叫预剪枝 2、先构造树,但…

微信小程序实战-01翻页时钟-1

文章目录 前言需求分析功能设计界面设计界面结构设计界面样式设计 逻辑设计 单页功能实现运行结果 前言 我经常在手机上用的一款app有一个功能是翻页时钟,基于之前学习的小程序相关的基础内容,我打算在微信小程序中也设计一个翻页时钟功能,J…

专业图表分析网页模板,让你轻松打造震撼的大数据可视化大屏电子沙盘

源码介绍 基于html/css/js,包含行业: 智慧政务 智慧社区 金融行业 智慧交通 智慧门店 智慧大厅 智慧物流 智慧医疗 通用模板 大数据分析平台 实时数据K线图(可自由配置多种行业模式) 可切换式大屏展示 翻牌效果 自定义字体

CCF模拟题 202305-1 重复局面

试题编号: 202305-1 试题名称: 重复局面 时间限制: 1.0s 内存限制: 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3次以上,可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用…

(生物信息学)R语言绘图初-中-高级——3-10分文章必备——点阵图(初级)

生物信息学文章的发表要求除了思路和热点以外,图片绘制是否精美也是十分重要的,本专栏为(生物信息学)R语言绘图初-中-高级——3-10分文章必备,主要通过大量文献,总结3-10分文章中高频出现的各种图片,并给大家提供图片复现的R语言代码,及图片识读。 本专栏将向大家介绍…

Android Matrix (三)矩阵组合和应用变换

在 Android 开发中,Matrix 类不仅提供了 mapPoints 方法来变换点坐标,还提供了多种其他用法,使其成为处理图像和视图变换的强大工具。以下是 Matrix 类的一些关键用法: 1. 变换方法 setTranslate(float dx, float dy): 设置矩阵…

二 数据查询

1、实验目的 理解SQL成熟设计基本规范,熟练运用SQL语言实现数据基本查询,包括但表查询、分组统计查询和连接查询。 2、实验内容及要求 针对数据库设计各种单表查询SQL语句、分组统计查询语句;设计单个表针对自身的连接查询,设计…

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时,常常会复用Vue组件,那么,问题来了,复用的时候,业务数据不相同,怎么办了? 这里我们就需要学习新的属性:props来实现这个功能。 这样,组…

在Windows上使用VScode阅读kernel源码

有一说一,在Windows上使用Source Inside阅读kernel源码真的很舒服,但是有时候带着轻薄本出去,又不想往轻薄本上安装很多的软件,就使用VS code临时阅读kernel源码。如果不能进行跳转,阅读kernel源码就很难受&#xff0c…

计算机缺失vcomp120.dll文件怎么办?总结多种解决方法分享

在使用电脑过程中,难免会遇到各种问题,其中vcomp120.dll丢失问题就是其中之一。这个问题可能会给用户带来诸多不便,导致某些应用程序无法正常运行。在这篇文章中,我们将详细介绍vcomp120.dll文件的重要性,以及遇到丢失…

基于yolov2深度学习网络的车辆行人检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................... load yolov2.mat% 加载训练好的…