返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >如何使用签名保证ASP.NET MVC OR WEBAPI的接口安全
  • 308
分享到

如何使用签名保证ASP.NET MVC OR WEBAPI的接口安全

2024-04-02 19:04:59 308人浏览 独家记忆
摘要

目录签名算法 签名的参数 验证签名 apiController基类 预防Replay Attack 客户端调用 当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数

当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据。如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据。
所以我们需要使用某种安全机制来保证请求的合法。现在最常用的办法是给每个Http请求添加一个签名,服务端来验证签名的合法性,如果签名合法则执行响应的操作,如果签名非法则直接拒绝请求。

签名算法

签名算法一般都使用Hash散列算法,常用的有MD5,SHA系列算法。这些算法可以根据不同的输入,计算出不同的结果,而且碰撞的概率很低。
签名算法跟加密算法不是一回事。很多同学都会说使用MD5加密一下,其实这是错误的。签名算法不能恢复原来的数据,因为它本身并不包含原来数据的信息。
而加密方法不同,加密方法是可以根据加密结果重新推算出原来的数据的。
HMac SHA作为一种更加安全的签名算法,使用一个Key来影响签名的结果。这样同样的输入配合不同的Key可以得出不同的签名,更加安全。


 public static string HmacSHA256(string secreTKEy,string plain)
        {
            var keyBytes = Encoding.UTF8.GetBytes(secretKey);
            var plainBytes = Encoding.UTF8.GetBytes(plain);

            using (var hmacsha256 = new HMACSHA256(keyBytes))
            {
                var sb = new StringBuilder();
                var hashValue = hmacsha256.ComputeHash(plainBytes);
                foreach (byte x in hashValue)
                {
                    sb.Append(String.FORMat("{0:x2}", x));
                }
                return sb.ToString();
            }
        }

签名的参数

有了签名算法,那么我们签名的内容哪里来呢?
一般我们使用http请求的queryString然后加上时间戳还有随机数来作为签名的参数。


 public static string MakeSignPlain(SortedDictionary<string,string> queryString,string time,string random )
        {
            var sb = new StringBuilder();
            foreach (var keyValue in queryString)
            {
                sb.AppendFormat("{0}={1}&", keyValue.Key, keyValue.Value);
            }
            if (sb.Length>1)
            {
                sb.Remove(sb.Length - 1, 1);
            }
            sb.Append(time);
            sb.Append(random);

            return sb.ToString().ToUpper();
        }

验证签名

验证签名就是简单的比较服务端生产的签名跟客户端生产的签名是否一直。
要注意的一点是最好验证下时间戳,跟服务端时间比较前后不能相差5分钟。这也是一个简单的防Replay Attack的手段。


 public static bool Valid(string requestSign,string signPlain,string time, string secretKey)
        {
            if (string.IsNullOrEmpty(time)||string.IsNullOrEmpty(requestSign)||string.IsNullOrEmpty(signPlain))
            {
                return false;
            }
            //is in range
            var now = DateTime.Now;
            long requestTime =0;
            if (long.TryParse(time,out requestTime))
            {
                var max = now.AddMinutes(5).ToString("yyyyMMddHHmmss");
                var min = now.AddMinutes(-5).ToString("yyyyMMddHHmmss");
                if (!(long.Parse(max) >= requestTime && long.Parse(min) <= requestTime))
                {
                    return false;
                }
              
            }
            else
            {
                return false;
            }

            //hashmac
            var sign = Encryption.HmacSHA256(secretKey, signPlain);

            return requestSign.Equals(sign, StrinGComparison.CurrentCultureIgnoreCase);
        }

ApiController基类

有了上面这些铺垫我们就可以在基类完成签名的验证了。客户端需要把上面提到的时间戳,随机数,签名和客户端的ID放入http请求的headers里面。
我们在基类的OnActionExecuting里取出这些数据组合成签名的参数,然后根据客户端ID获取签名的Key,然后使用同样的签名算法计算签名。并且比较客户端的签名跟服务端的签名是否一致。
这里就不演示了。

预防Replay Attack

预防重放攻击主要有两点:

  • 校验时间戳的范围

时间戳跟服务器时间相差在一个合理的范围内视为合法。

每次请求都去判断下签名是否出现过。如果出现过则视为非法请求。
因为有时间戳跟随机数的存在,所以理论上每次请求的签名是不可能重复的。

客户端调用

这里演示一下C#签名并且调用http接口的代码


 [TestMethod()]
        public void GetUserTest()
        {
            string url = "http://localhost:8090/api/test/GetUser";
            string userId = "A39891D4-6CEF-4538-A562-3A422CA9C17A";
            string appId = "100001";
            string secretKey = "M/vkPOWXgBa7GnRd73t7j+jsKfbZtb+f";
            string rumdon = Guid.NewGuid().ToString();
            string time = DateTime.Now.ToString("yyyyMMddHHmmss");

            //make signture plain text
            var sortDict = new SortedDictionary<string, string>()
            {
                {"userId",userId }
            };
            var signPlain = new StringBuilder();
            foreach (var keyValue in sortDict)
            {
                signPlain.AppendFormat("{0}={1}&", keyValue.Key, keyValue.Value);
            }
            if (signPlain.Length > 1)
            {
                //remove last &
                signPlain.Remove(signPlain.Length - 1, 1);
            }
            signPlain.Append(time);
            signPlain.Append(random);

            Console.WriteLine("sign plain:{0}", signPlain.ToString().ToUpper());
            //make sign
            var sign = Encryption.HmacSHA256(secretKey, signPlain.ToString().ToUpper());
            Console.WriteLine("sign:{0}", sign);

            string requestUrl = string.Format("{0}?{1}={2}", url, "userId", userId);
            HttpWEBRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
            request.Method = "GET";
            //add headers
            request.Headers.Add("time", time);
            request.Headers.Add("appId", appId);
            request.Headers.Add("random", random);
            request.Headers.Add("sign", sign);
            //
            //start request
            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    var responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            var content = reader.ReadToEnd();

                            Console.WriteLine(content);
                        }
                    }
                }
            }
            catch (WebException ex)
            {
                using (HttpWebResponse response = (HttpWebResponse)ex.Response)
                {
                    var responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            var content = reader.ReadToEnd();
                            Console.WriteLine(content);
                        }
                    }
                }
            }
        }

以上就是如何使用签名保证asp.net mvc OR webapi的接口安全的详细内容,更多关于用签名保证ASP.net MVC OR WEBAPI的接口安全的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用签名保证ASP.NET MVC OR WEBAPI的接口安全

本文链接: https://lsjlt.com/news/124775.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用签名保证ASP.NET MVC OR WEBAPI的接口安全
    目录签名算法 签名的参数 验证签名 ApiController基类 预防Replay Attack 客户端调用 当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数...
    99+
    2024-04-02
  • 详解SpringBoot是如何保证接口安全的
    目录为什么要保证接口安全防篡改如何解决防重放基于timestamp的方案基于nonce + timestamp 的方案代码实现1、构建请求头对象2、工具类从HttpServletRe...
    99+
    2023-02-02
    SpringBoot保证接口安全 SpringBoot 接口安全
  • 如何使用 Laravel 打包 PHP 接口并确保接口安全性?
    Laravel 是一个流行的 PHP 框架,它提供了很多强大的工具和功能,使得我们可以轻松地构建和管理我们的 PHP 应用程序。在本文中,我们将讨论如何使用 Laravel 打包 PHP 接口,并确保接口的安全性。我们将通过演示代码来说明这...
    99+
    2023-11-14
    laravel 接口 打包
  • 接口签名如何使用Java实现
    这篇文章主要介绍了接口签名如何使用Java实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java实现接口签名为了保证数据传输的安全性,跟其他系统进行数据交互时,双方应该约...
    99+
    2023-06-15
  • python3如何使用Requests测试带签名的接口
    目录使用Requests测试带签名的接口一般制定一下规则针对某一get接口做实例说明Python 签名接口测试签名接口代码如下使用Requests测试带签名的接口 部分业务为了安全需...
    99+
    2024-04-02
  • PHP 接口日志同步,如何保证数据的安全性和稳定性?
    随着互联网技术的不断发展,越来越多的企业开始使用接口进行数据的交互。而对于这些接口的日志,如何进行同步呢?这是一个关键性问题,需要我们认真思考。 一、背景介绍 在进行接口开发时,我们通常会记录下接口的请求和响应数据,以便于后续的分析和优化...
    99+
    2023-10-11
    接口 日志 同步
  • 租用香港VPS时如何保证业务的安全
    租用香港VPS时保证业务安全的方法:1、租用香港VPS时,需要选择专业优质、可信度高的香港VPS服务商,从而有效保障香港VPS可用性;2、需要定期对香港VPS做好数据备份和安全扫描措施,降低服务器被挂马的风险;3、需要提高香港VPS的密码复...
    99+
    2024-04-02
  • 如何使用PHP编写安全可靠的Shell接口?
    PHP是一种流行的服务器端脚本语言,可用于创建动态Web页面和应用程序。Shell是一种通用的命令行界面,用于执行各种任务和管理操作系统。当这两种技术结合在一起时,可以创建一个功能强大的Shell接口,使用户能够与服务器进行交互并执行各种操...
    99+
    2023-08-31
    shell 接口 编程算法
  • 租用服务器后如何保护域名的安全
    租用服务器后保护域名安全的方法:1、在域名注册时必须填写正确的信息,防止后续出现产权问题;2、需要给服务器设置相对复杂的域名密码,防止被黑客轻易破解;3、给服务器申请域名锁,从而保证域名的安全性;4、使用服务器过程中不要随意点开邮件里面的链...
    99+
    2024-04-02
  • 租用香港云服务器如何保证业务的安全
    租用香港云服务器保证业务安全的方法:1、在租用香港云服务器时,选择优质的香港云服务商;2、对租用的香港云服务器定期进行安全扫描以及数据备份;3、设置好香港云服务器的端口以及密码,提高数据安全性。具体内容如下:选择优质的香港云服务商在租用香港...
    99+
    2024-04-02
  • Go语言如何保证云上应用的数据安全性?
    随着云计算越来越成为企业IT部署的主要方式,越来越多的应用程序被迁移到云上运行。然而,对于许多企业来说,一个重要的问题就是如何确保在云上运行的应用程序的数据安全性。在这个领域中,Go语言是一个备受瞩目的技术选择。本文将介绍Go语言是如何保证...
    99+
    2023-05-17
    Go语言 云上应用 数据安全性
  • ASP 日志 api 接口:如何确保数据的安全性和完整性?
    在互联网时代,数据安全和完整性是至关重要的。ASP 日志 api 接口为我们提供了一种有效的方式来确保数据的安全性和完整性。在本文中,我们将深入探讨 ASP 日志 api 接口的使用方法,以及如何确保数据的安全性和完整性。 一、ASP 日...
    99+
    2023-06-19
    日志 api 接口
  • 如何使用双因素身份验证保护CentOS服务器的访问安全
    要在CentOS服务器上使用双因素身份验证来保护访问安全,可以按照以下步骤进行操作:1. 安装所需软件:   - 在服务器...
    99+
    2023-10-10
    CentOS
  • 如何使用Java同步函数生成二维码并保证数据安全?
    Java 是一种流行的编程语言,其语法简单易懂,易于学习。Java 同步函数是一种可以帮助我们生成二维码并保证数据安全的函数,本文将为您详细介绍如何使用 Java 同步函数生成二维码并保证数据安全。 一、Java 同步函数的概念 Java ...
    99+
    2023-10-17
    函数 同步 二维码
  • 如何解决thinkphp在app接口开发过程中的安全验证问题
    这篇文章给大家分享的是有关如何解决thinkphp在app接口开发过程中的安全验证问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对于我们写好的接口,如果不经过安全认证就可以直接访问的话,则将对我们网站产生非常...
    99+
    2023-06-22
  • 如何确保在Golang中使用协程的安全性?
    如何确保在Golang中使用协程的安全性? 在Golang中,协程(goroutine)是一种轻量级的线程实现,通过利用并发编程来提高程序的性能。然而,在使用协程的过程中,必须确保代码...
    99+
    2024-03-10
    锁机制 协程调度 同步操作
  • 企业租用服务器如何保证能够安全稳定的运行
    企业租用服务器保证安全稳定运行的方法:1、需要做好服务器初始安全防护,比如安装防火墙以及绿色安全的防护软件;2、做好服务器管理员密码保护,比如设置复杂密码,避免黑客轻易破解;3、需要及时修改服务器默认远程端口,避免被黑客恶意入侵;4、需要及...
    99+
    2024-04-02
  • 如何在Java编程中使用同步关键字保证算法的线程安全性?
    Java是一种面向对象的编程语言,它被广泛应用于企业级应用程序的开发。在Java编程中,线程安全性是一个非常重要的问题。线程安全性是指在多线程环境下,程序的正确性和可靠性能够得到保证。在Java编程中,同步关键字是保证算法线程安全性的一种常...
    99+
    2023-11-11
    编程算法 同步 关键字
  • 如何使用安全的云存储保护CentOS服务器上的数据安全
    要使用安全的云存储来保护CentOS服务器上的数据安全,可以按照以下步骤进行操作:1. 选择可靠的云存储提供商:选择一个值得信赖的云...
    99+
    2023-10-12
    CentOS
  • ASP.NET Core如何使用JWT自定义角色并实现策略授权需要的接口
    ASP.NET Core如何使用JWT自定义角色并实现策略授权需要的接口,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。① 存储角色/用户所能访问的 A...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作