当前位置: 首页 > 编程日记 > 正文

php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...

通过前几个教程的学习,对webapi的编写基本上就可以入门了,可以做项目了,今天我们再给接口加个参数签名认证,之前的接口相当于赤果果的暴露在了网络上,只要知道接口地址、接口调用方式和传参就可以畅所欲为的调用接口了,这给我们写的webapi带来了很大的安全隐患,所以这篇教程是给webapi加上一层保护措施,可能算不上最优解决方案,但起码能起到一定的保护措施。

保护思路

1.接口调用采用POST的方式,可以屏蔽一部分小白,增加接口调用的难度。

2.接口调用参数增加签名字段,一可以防止数据被篡改,二还可以防止其它人非法调用我们的接口。

接口签名算法

签名生成的通用步骤如下:

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序);

◆ 如果参数的值为空不参与签名;

◆ 参数名区分大小写;

◆ 验证调用返回或主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。

第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

◆ key设置:将key设置在接口配置文件中,当key发生泄露时可第一时间通过修改配置文件来更改key值。

举例:

假设传送的参数如下:

a: aa

b: bb

c: cc

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA="a=aa&b=bb&c=cc";

第二步:拼接API密钥:

stringSignTemp=stringA+"&key=afwfsfwexwegw" //注:key为用户在配置文件中自行设置的

sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式

代码部分

第一步,在配置文件增加签名的key

appsettings.json

{

"Logging": {

"LogLevel": {

"Default": "Information",

"Microsoft": "Warning",

"Microsoft.Hosting.Lifetime": "Information"

}

},

"AllowedHosts": "*",

//接口配置参数设置

"AppSettings": {

//数据库连接字符串

"xxxDB": "Server=ROBERT-PC\\SQLEXPRESS;User Id=xiaozhao;Password=xz123789;Database=XXX;",

//接口是否需要签名

"IsSign": "false",

//16位MD5签名key

"Md5Key": "5ShiCeShiAAAAAAA"

}

}

第二步,在Common增加SignMgr.cs类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using XXX.Models;

namespace XXX.Common

{

///

/// 签名管理

///

public class SignMgr

{

///

/// 验证用户请求参数

///

/// 参数中需要包含sign字段,用来验证签名是否正确

///

public static bool ParamVerify(Object p)

{

//获取是否签名字段

string isSign = AppSettings.GetAppSeting("IsSign");

//获取MD5签名字段

string secretKey = AppSettings.GetAppSeting("Md5Key");

if (isSign == "false")

{

return true;

}

try

{

Type t = p.GetType();

var propertys = t.GetProperties();

string sign = "";

string temp = "";

var orderPropertys = propertys.OrderBy(p => p.Name); //ASCII码从小到大排序(字典序)

foreach (var item in orderPropertys)

{

string name = item.Name;

object oValue = item.GetValue(p);

string value = "";

if (oValue != null)//如果参数不为空则拼接参数

{

value = oValue.ToString();

//判断参数是否为sign,sign不参与签名

if (name != "sign")

{

temp += name + "=" + value + "&";

}

else

{

sign = value;

}

}

}

temp +="key=" +secretKey;

string md = Md5Encrypt.MD5(temp);

if (sign != "" && sign.ToUpper() == md.ToUpper())

{

//签名验证成功

return true;

}

else

{

//签名失败

return false;

}

}

catch (Exception ex)

{

//签名异常信息

return false;

}

}

}

}

第三步,验证

using System.Linq;

namespace XXX.Bo

{

public class UserBo

{

public static XXXContext db = new XXXContext();

///

/// 增加一个用户数据

///

///

public static Models.User.AddUserR AddUser(Models.User.AddUserP model)

{

var r = new Models.User.AddUserR();

if (Common.SignMgr.ParamVerify(model))//验证用户参数签名是否合法

{

Models.XXXEntities.User userSearch = (from u in db.User where u.Phone == model.phone select u).FirstOrDefault();

if (userSearch == null)

{

Models.XXXEntities.User user = new Models.XXXEntities.User();

user.Phone = model.phone;

user.Password = model.password;

user.NickName = model.nickName;

user.State = model.state;

db.User.Add(user);

int i = db.SaveChanges();

if (i > 0)

{

r.code = 1;

r.message = "数据插入成功";

}

else

{

r.code = 0;

r.message = "数据插入成功";

}

}

else

{

r.code = 0;

r.message = "手机号已经存在";

}

}

else

{

r.code = 0;

r.message = "签名失败";

}

return r;

}

}

}

项目已经上传github,看自行下载。

NetCore3.0-WebApi

求赞

创作不易,喜欢的请给个免费的赞吧!

相关文章:

点击TableView任一行跳转详情页面会跳转两次的解决办法

在做TableView跳转的时候,发现实际上生成了两个detail view。我 navigate back 的时候,也是先看到一次detail view,然后才回到tableView的。 这是因为:performSegue(withIdentifier: , sender: ) 和 prepare(for segue: , sender:…

dos环境下mysql的访问_MYSQL dos环境下使用

有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。一、连接MYSQL。格式: mysql -h主机地址 -u用户名 -p用户密码1、例1:连接到本机上的MYSQL。首先在打开…

jemeter监听器的使用

打开jemeter,新建线程组,添加http请求,在请求下添加监听器: 一、添加一个jpgc - PerfMon Metrics Collector监听器: 服务器性能监测控件,包括CPU,memory(内存),networkI/…

java 抛异常给上级_java异常处理机制(示例代码)

Exception 类的层次java中所有的异常类是从 java.lang.Exception 类继承的子类。而Exception 类是 Throwable (可抛出的)类的子类。除了Exception类外,Throwable还有一个子类Error 。Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处…

前端开发之JavaScript基础篇一

主要内容: 1、JavaScript介绍 2、JavaScript的引入方法和输出及注释 3、javaScript变量和命名规则 4、五种基本数据类型 5、运算符 6、字符串处理 7、数据类型转换 一、JavaScript介绍 1、JavaScript是什么?     javaScript是一种web前端的描述语言&…

v9php 碎片信息,phpcms v9碎片管理及调用技巧分享

今天在这里将分享下Phpcms V9碎片管理及调用技巧。这是关于模板数据自定义、方便客户在后台管理数据调用的一个技巧。在给客户定制模板的时候,往往会涉及到的一个问题就是:有些数据(图片文字,比如LOGO、侧栏的联系方式、首页的幻灯片切换Bann…

iterm2 主题_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器

作者:AndrewHR 地址:http://mrw.so/4D1n7B最终的效果图如下所示:使用iterm2配合oh-my-zsh的命令行,拥有语法高亮、命令自动补全、自动提示符、显示git仓库状态等功能整个配置流程1、安装iterm2首先我们下载的 iterm2 这个软件&…

main方法为什么是静态的

main函数其实也是所在类的一个方法,就比如一个类是test,那么该类的main其实就是test.main(String[] args),众所周知如果一个方法不是静态的,则要先实例化该类,比如要这样 test tnew test(); 然后才能调用 test.main();…

java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释

首先,转载一篇文章,个人认为是看到过了讲得最清楚的 XD当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:bootstrap classloader|extension classloader|system classloaderbootstrap classloader &#…

第四章 python的turtle库的运用

我们可以尝试用python的自带turtle库绘制一条蟒蛇 首先我们设计一下蟒蛇的基本形状 我们先把这段蟒蛇绘制的实例代码贴出来,各位可以在自己的本地运行一下看看效果,然后我们再继续分析代码: 1 #PythonDraw.py2 import turtle3 turtle.setup(6…

oracle导入索引b报错,impdp导入索引很慢

impdp用NETWORK_LINK从远程库导入到本地库,导入表的速度还正常,导入索引的速度特别慢。2个小时才导1300个索引。使用imp的格式:impdp vebackup/abc DIRECTORYDATABAK_DIR NETWORK_LINKprimarydb_link SCHEMASveasms TABLE_EXISTS_ACTIONREPLA…

新的mysql如何使用_如何使用新的MySQL更新日志

使用新的MySQL更新日志的方法未必人人都会,下面就教您如何使用新的MySQL更新日志的方法,希望对您能够有所帮助。如果你只使用一使用新的MySQL更新日志的方法未必人人都会,下面就教您如何使用新的MySQL更新日志的方法,希望对您能够…

find_in_set

在查询表中数据用 ‘,’隔开的记录时 如图所示 用like 查询auth 字段中含A5是查不出来的 如图所示 用find_in_set 可以查询出 auth字段含 ‘A5’的记录 如图所示 用法介绍: find_in_set 可以查询出字段内容以英文逗号隔开的记录 find_in_set(匹配值,字段名)转载于:h…

一堆棋子java代码编程_网易2018校招内推编程题-堆棋子-C++实现

0 1 3 10解法暴力枚举所有可能的点。如图所示,黑点为输入点。所需遍历的点为红线的交点,红圈表示。当时自己写的是遍历了外围红线所构成的封闭矩形里面所有的点了,只有60%的AC率,原因超时。看了康学长的代码,才知道有些…

linux free命令详解和使用实例(查看内存使用率)

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一1.命令格式: free [参数] 2.命令功能: free 命令显示系统使用和空闲的…

awk linux 获取端口号_Linux提权后获取敏感信息命令

如果不能执行的可能是不同类型的linux。系统版本?cat /etc/issuecat /etc/*-releasecat /etc/lsb-releasecat /etc/redhat-release内核版本?cat /proc/versionuname -auname -mrsrpm -q kerneldmesg | grep Linuxls /boot | grep vmlinuz环境变量?cat /…

lemp-------3多站点访问,,访问控制,,虚拟目录

基于ip vi /etc/nginx/nginx.conf server { listen 192.168.1.142:80; server_name localhost; access_log logs/host.access.log main; location / { root /web2; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location /50x.html { root…

oracle统计id出现次数,oracle 统计sql

oracle 统计月平均交易次数 :select n_tsc_src_usr_id , floor(count(c_tsc_no)/trunc(months_between(max(d_tsc_req_time),min(d_tsc_req_time))))from tbl_tsc_basegroup by n_tsc_src_usr_idhaving months_between(max(d_tsc_req_time),min(d_tsc_req_time)) &g…

java避免使用orderby_java – Spring安全配置@Order不是唯一的例外

我试图在我的Spring Security配置中注册多个过滤器,但是我总是得到相同的异常:04-Nov-2015 14:35:23.792 WARNING [RMI TCP Connection(3)-127.0.0.1]org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refreshException encountered…

es 启动问题

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] vim /etc/security/limits.conf 文件末尾添加: mst hard nofile 65536 mst soft nofile 65536 mst是es启动用户 max virtual memory areas vm.max_map_count [65…

imrot matlab,Matlabtuxiangpipei

文件名大小更新时间Matlab图像匹配的都可以用的到做三维重建\matlabcode\examples-code\11.jpg.......................................\..........\.............\addons\rectifData.mat.......................................\..........\.............\......\shelves.jp…

mysql 5.7 full_MySQL5.7默认打开ONLY_FULL_GROUP_BY 解决方案

MySQL5.7后将sql_mode的ONLY_FULL_GROUP_BY模式默认设置为打开状态,这样一来,很多之前的sql语句可能会出现错误,错误信息如下:Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggreg…

通过web sql实现增删查改

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title></title></head><body><h3>***添加学生***</h3>学号&#xff1a;<input type"text" id"id&qu…

java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法

Spring-boot JMS 发送消息慢的问题解决Servicepublic class Producer {Autowiredprivate JmsMessagingTemplate jmsTemplate;public void sendMessage(Destination destination, final String message){jmsTemplate.convertAndSend(destination, message);}}经使用JMeter进行压…

快速幂 + 矩阵快速幂

快速幂 1 #include<iostream>2 #include<algorithm>3 #include<cstring>4 #define LL long long5 using namespace std;6 7 LL Pow(LL a, LL b)8 {9 LL ans 1; 10 while(b ! 0){ 11 if(b&1) 12 ans * a; 13 a …

【Ctsc2011】幸福路径

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id2306 给定一张有向图&#xff0c;每个点有权值&#xff0c;蚂蚁从某个节点出发&#xff0c;初始体力值为$1$&#xff0c;每走一条边$体力值*p$&#xff0c;每经过一个点会获得幸福值为$点权*体力值$&…

mysql 去重con_python 爬虫 实现增量去重和定时爬取实例

前言&#xff1a; 在爬虫过程中&#xff0c;我们可能需要重复的爬取同一个网站&#xff0c;为了避免重复的数据存入我们的数据库中 通过实现增量去重 去解决这一问题 本文还针对了那些需要实时更新的网站 增加了一个定时爬取的功能&#xff1b;本文作者同开源中国(殊途同归_)&a…

oracle数据导出方法,oracle多种导入导出数据方法

dmp格式:1.dmp格式的导出可以通过客户端工具(PL/SQL)操作来完成,通过菜单栏---->Tools---->Export Tables&#xff0c;然后设置勾选相应参数即可,rows代表是否连同数据一起导出2.导出还可以用cmd工具,速度也更快:exp [email protected] filed:\***.dmp fullyfully表示全导…

java 枚举转byte_如何在java中将一个枚举转换为另一个枚举?

一种方法是在您的详细枚举中定义一个方法asSimple()&#xff1a;public enum Detailed {PASSED {OverrideSimple asSimple() {return PASSED;}},INPROCESS {OverrideSimple asSimple() {return RUNNING;}},ERROR1,ERROR2,ERROR3;public Simple asSimple() {return Simple.ERROR…

BZOJ4566: [Haoi2016]找相同字符

BZOJ4566: [Haoi2016]找相同字符 Description 给定两个字符串&#xff0c;求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两个子串中有一个位置不同。Input 两行&#xff0c;两个字符串s1&#xff0c;s2&#xff0c;长度分别为n1&#x…