返回顶部
首页 > 资讯 > 精选 >在.NET中如何使用FixedTimeEquals应对计时攻击
  • 501
分享到

在.NET中如何使用FixedTimeEquals应对计时攻击

2023-06-30 18:06:08 501人浏览 八月长安
摘要

这篇“在.net中如何使用FixedTimeEquals应对计时攻击”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“在.NET

这篇“在.net中如何使用FixedTimeEquals应对计时攻击”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“在.NET中如何使用FixedTimeEquals应对计时攻击”文章吧。

计时攻击

在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁道攻击是根据计算机处理过程发出的信息进行分析,包括耗时,声音,功耗等等,这和一般的暴力破解或者利用加密算法本身的弱点进行攻击是不一样的。

举个例子

假如您有一个后端 webapi, GetConfig 接口用来获取配置信息,调用时需要在 Header 中传入一个秘钥,然后判断是否正确并进行返回,如下

X-api-Key: x123
[HttpGet]public IActionResult GetConfig(){    var key = Request.Headers["X-Api-Key"].FirstOrDefault();    if (key != "x123")    {        return Unauthorized();    }    return Ok(configuration);}

注意,这里我们为了判断两个字符串相等,通常会使用 == 或者 != , 实际上背后使用了 String 的 Equals() 方法,如下

// Determines whether two Strings match.public static bool Equals(string? a, string? b){    if (object.ReferenceEquals(a, b))    {        return true;    }    if (a is null || b is null || a.Length != b.Length)    {        return false;    }    return EqualsHelper(a, b);}

而内部又使用了 SequenceEqual() 方法

[MethodImpl(MethodImplOptions.AggressiveInlining)]private static bool EqualsHelper(string strA, string strB){    Debug.Assert(strA != null);    Debug.Assert(strB != null);    Debug.Assert(strA.Length == strB.Length);    return SpanHelpers.SequenceEqual(            ref Unsafe.As<char, byte>(ref strA.GetRawStringData()),            ref Unsafe.As<char, byte>(ref strB.GetRawStringData()),            ((uint)strA.Length) * sizeof(char));}

大概的逻辑是,先判断两个字符串长度是否一致,如果不是,直接返回 false,然后循环字符串进行逐位对比,一旦发现不相同,直接返回 false,伪代码如下

public bool Equals(string str1, string str2){    if (str1.Length != str2.Length)     {        return false;    }     for (var i = 0; i < str1.Length; i++)    {        if (str1[i] != str2[i])        {            return false;        }    }     return true;}

这里有一个问题是,如果字符串第一位不相同,直接就返回 false,如果最后一位不相同,那就需要遍历到最后,然后返回 false。不一样的字符串,计算的时长可能不一致。

尝试破解

假如用户知道了我们的秘钥的固定长度是 4 位。

GET /GetConfig  X-Api-Key:a000Cost: 2ns

本次耗时了 2ns, 接下来又输入 b000, c000....

GET /GetConfig  X-Api-Key:b000Cost: 2ns GET /GetConfig  X-Api-Key:c000Cost: 2ns ...GET /GetConfig  X-Api-Key:x000Cost: 4ns

直到输入了 x000, 发现其他的耗时都是 2ns, 而这里是 4ns,大概率判定第一位是 x。

注意,这里的测试进行了放大,可能每个 case 分别调用了 100 次,然后统计了 P50(中位数)得出的结果。

然后用同样的方法,测试第二位,第三位....., 最终破解拿到了秘钥。

使用固定时间的算法

虽然看上去有点扯,但确实是真实存在的,包括大名鼎鼎的针对 TLS 的 Lucky 13 攻击,有兴趣的同学可以看一下。在安全性要求比较高的场景中,确实要考虑到计时攻击,当涉及到安全时,还是宁可信其有。

所以我们的算法的执行耗时应该是固定的,不应该在不匹配时,就立即返回,我们尝试改造一下代码

public bool Equals(string str1, string str2){    if (str1.Length != str2.Length)    {        return false;    }    bool reult = true;    for (var i = 0; i < str1.Length; i++)    {        if (str1[i] != str2[i])        {            reult = false;        }    }    return reult;}

不管怎么样,都会遍历完整个字符串,然后返回结果,看上去没什么问题,时间总是固定的,但在现代的 CPU 和 .NET 上却不是的,因为我们要考虑到分支预测,特别是 if 条件。

好吧,那我们调整一下代码

public bool Equals(string str1, string str2){    if (str1.Length != str2.Length)    {        return false;    }    bool reult = true;    for (var i = 0; i < str1.Length; i++)    {        reult &= str1[i] == str2[i];     }    return reult;}

我们用了运算符 &,来代替 If, 只有全部为 true 时,才会返回 true,其中任意一个字符不匹配,就会返回 false,看上去不错。

但是,还有一些问题,对于bool类型的 result (true/false), 我们的 .NET JIT 和 x86 指令执行仍然会进行一些优化,我们再调整一下代码

public bool Equals(string str1, string str2){    if (str1.Length != str2.Length)    {        return false;    }    int reult = 0;    for (var i = 0; i < str1.Length; i++)    {        reult |= str1[i] ^ str2[i];     }    return reult == 0;}

我们把 bool 改成了 int 类型,然后使用了运算符 ^ 和 |,同样的,只有字符串全部匹配时,result 为 0,,才会返回 true, 其中任意一个不匹配,result 就不为 0,会返回 false。

最后,为了防止 JIT 对我们的代码进行其他的优化,我们可以加一个特性,告诉 JIT 不要管它,就像这样

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]public bool Equals(string str1, string str2){    if (str1.Length != str2.Length)    {        return false;    }    int reult = 0;    for (var i = 0; i < str1.Length; i++)    {        reult |= str1[i] ^ str2[i];     }    return reult == 0;}

上面我们实现了一个针对字符串比较的固定时间的算法,来应对计时攻击。

实际上, 从 .net core 2.1 开始就已经做了内置支持,我们可以直接使用 FixedTimeEquals 方法, 看一下它的实现

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]public static bool FixedTimeEquals(ReadOnlySpan<byte> left, ReadOnlySpan<byte> right){     if (left.Length != right.Length)    {        return false;    }    int length = left.Length;    int accum = 0;    for (int i = 0; i < length; i++)    {        accum |= left[i] - right[i];    }    return accum == 0;}

现在用起来也很方便:

var result = CryptographicOperations.FixedTimeEquals(   Encoding.UTF8.GetBytes(str1), Encoding.UTF8.GetBytes(str2));

以上就是关于“在.NET中如何使用FixedTimeEquals应对计时攻击”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 在.NET中如何使用FixedTimeEquals应对计时攻击

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

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

猜你喜欢
  • 在.NET中如何使用FixedTimeEquals应对计时攻击
    这篇“在.NET中如何使用FixedTimeEquals应对计时攻击”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“在.NET...
    99+
    2023-06-30
  • 在 .NET 中使用 FixedTimeEquals 应对计时攻击的例子
    目录计时攻击举个例子尝试破解使用固定时间的算法总结计时攻击 在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁...
    99+
    2024-04-02
  • ASP Shell 索引:如何检测并发攻击并及时应对?
    在网络安全领域中,ASP Shell 索引是一个常见的问题。ASP Shell 索引是指黑客通过某种方式上传 ASP 文件,并通过访问该文件来获取系统权限。这种攻击方式被称为“Web Shell”,攻击者可以通过 Web Shell 来执...
    99+
    2023-06-22
    shell 索引 并发
  • 如何在Linux服务器上应对Web接口DDoS攻击
    要在Linux服务器上应对Web接口DDoS攻击,可以采取以下措施:1. 使用负载均衡:使用负载均衡器来分发流量,将负载分散到多个服...
    99+
    2023-10-10
    Linux
  • PHP商城开发中如何应对商品完攻击
    PHP商城开发中如何应对商品完攻击随着网络技术的不断发展,电子商务已成为人们生活中必不可少的一部分。而面对不断增长的电子商务需求,PHP成为了广泛应用的脚本语言之一,尤其是在电子商务的应用方面。然而,随着网络安全问题的逐渐凸显,如何应对商品...
    99+
    2023-05-14
    PHP开发 商城开发 安全防御
  • 如何在.NET中使用Redis
    如何在.NET中使用Redis?相信很多新手小白还没学会这个技能,通过这篇文章的总结,希望你能学会这个技能。以下资料是实现的步骤。Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博、Gi...
    99+
    2024-04-02
  • 如何使用区块链技术对抗DDoS攻击
    区块链技术可以被用来对抗DDoS攻击的一个方法是利用去中心化的特性和分布式账本来提高系统的抗攻击能力。以下是一些方法: 分布式存...
    99+
    2024-04-22
    DDoS攻击
  • 什么是计时攻击以及Spring Boot 中该如何防御
    什么是计时攻击以及Spring Boot 中该如何防御,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。很多人吐槽 Spring Security 比 Shiro 重量级,这个...
    99+
    2023-06-17
  • ajax中如何使用AntiForgeryToken防止CSRF攻击
    小编给大家分享一下ajax中如何使用AntiForgeryToken防止CSRF攻击,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2024-04-02
  • 操作系统安全审计:威胁无处不在!教你如何应对,防范系统被攻击
    随着网络技术的快速发展,操作系统安全审计已经成为信息安全领域不可或缺的重要环节。操作系统作为信息系统的核心和基础,一旦受到攻击或破坏,将对整个信息系统造成致命的后果。因此,定期进行操作系统安全审计至关重要,以识别和消除潜在的安全威胁。 ...
    99+
    2024-02-28
    操作系统安全审计 威胁检测 防范措施 审计工具
  • 如何在ASP.NET中使用NumPy响应对象?
    ASP.NET是一个非常强大的Web开发框架,它的优点在于它的灵活性、可扩展性和可维护性。在ASP.NET开发中,NumPy是一个非常流行的科学计算库,它提供了对数组、矩阵、线性代数、傅里叶变换、随机数生成等方面的支持。在本文中,我们将介绍...
    99+
    2023-10-27
    numy 响应 对象
  • .NET Core中如何实现或使用对象池?
    目录前言池化策略 对象池的使用 指定对象池容量 在 ASP.NET Core 中使用 总结 前言 池这个概念大家都很熟悉,比如我们经常听到数据库连接池和线程池。它是一种基于使用预先分...
    99+
    2024-04-02
  • 如何在canvas中使用环形倒计时组件
    这篇文章将为大家详细讲解有关如何在canvas中使用环形倒计时组件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Canvas环形倒计时组件Canvas环形倒计时是基于Canvas实现的倒计时...
    99+
    2023-06-09
  • 如何在NET Core中获取CPU使用率
    这篇文章主要介绍“如何在NET Core中获取CPU使用率”,在日常操作中,相信很多人在如何在NET Core中获取CPU使用率问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在NET&...
    99+
    2023-06-26
  • CentOS在云计算中如何应用
    CentOS 在云计算中是一个非常流行的操作系统,因为它是一个免费、开源的Linux 发行版,具有稳定性和安全性。在云计算中,Cen...
    99+
    2024-05-09
    CentOS
  • DDoS攻击防范与应对策略——阿里云服务器在局域网中的应用
    本文将探讨如何在阿里云服务器上采取有效的防范措施来应对DDoS攻击,并分析其在局域网环境下的应用场景。通过举例和实践,我们将展示如何配置阿里云服务器以增强对DDoS攻击的抵抗能力,并提供一些常见的防御策略。 1. 防御策略在面对DDoS攻击...
    99+
    2024-01-19
    阿里 网中 应对策略
  • 如何在Android应用中使用C++对Bitmap对象进行处理
    这篇文章将为大家详细讲解有关如何在Android应用中使用C++对Bitmap对象进行处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。步骤如下:a.编写JNI接口函数//java接口函数p...
    99+
    2023-05-31
    android bitmap c++
  • 如何在.net中使用预处理指令符
    今天就跟大家聊聊有关如何在.net中使用预处理指令符,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是预处理指令符?当C#编译器找到一条预处理指令#if,最后找到一条指令时,#en...
    99+
    2023-06-14
  • 如何在 ASP 中优化实时 npm 对象的使用?
    在 ASP 中使用 npm 包是一个非常常见的事情,尤其是在构建现代 web 应用程序时。但是,如果不正确地使用 npm 包,可能会在应用程序中引入性能问题。本文将介绍如何在 ASP 中优化实时 npm 对象的使用,以提高应用程序的性能。 ...
    99+
    2023-10-08
    实时 npm 对象
  • PL/SQL在云计算中如何应用
    PL/SQL在云计算中可以被广泛应用于数据库管理和数据处理方面。以下是一些PL/SQL在云计算中的应用场景: 数据库管理:通过P...
    99+
    2024-05-08
    PL/SQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作