gpt4 book ai didi

.net - 在每个应用程序域的基础上实际使用字符串哈希码计算

转载 作者:行者123 更新时间:2023-12-05 01:18:13 24 4
gpt4 key购买 nike

在 .NET 4.5 中,可以选择使用随机字符串哈希代码生成。
这意味着,在不同的应用程序域中计算出的相同字符串的哈希码将是不同的。 (见 http://msdn.microsoft.com/en-us/library/jj152924.aspx)

问题是:这个选项的实际用途是什么?
换句话说,我需要在什么场景(场景)下开启它?

最佳答案

我相信这个的一般应用是为了防止针对散列机制的可能的 DoS 攻击。

GetHashCode()Dictionary<,> 之类的东西在内部使用,对于“正常”数据,散列值应该合理分布,以便散列冲突不会“太频繁”发生。当哈希冲突确实发生时,Dictionary<,>回退到具有相同哈希码的所有项目的线性搜索。

在可公开访问的应用程序中,了解散列机制的攻击者可能会提交具有大量具有相同散列代码的字符串的请求,导致通常的 O(1) 查找变成 O(N) 查找任何添加了这些值的字典。

特别是对于 web 应用程序,我相信像标题和查询字符串参数这样的东西被添加到字典中以便应用程序快速访问,因此对手可以提交包含数千个参数和哈希冲突的请求,导致请求明显更多比“正常”请求更需要资源。这对任何 DoS 尝试都有放大作用,即使攻击者只有相对适中的可用带宽,也允许攻击发生。

通过随机化每个 AppDomain 的哈希值,攻击者不太可能制作具有冲突哈希的字符串,从而防止此类攻击。

编辑地址评论:

虽然 MSDN 文章没有提到它,但设置的目的不是提供一种让不同 AppDomain 创建不同字符串哈希的方法,而是一种安全功能,可防止第三方创建许多具有相同哈希值的字符串。

在 .NET 4.5 之前(或禁用此设置),前提是我运行的 .NET 版本与您相同,"some string".GetHashCode()在我的机器上将提供与您相同的值。由于使用的散列机制很简单(当然不是加密安全的散列),逆向工程并创建大量具有相同散列的字符串相对容易,然后如上所述使用这些来放大 DoS 攻击。

启用此设置后,随机性元素会添加到字符串的哈希代码生成中,从而使攻击者更难以可靠地制作碰撞字符串。

它是每个 AppDomain 的事实是哈希码具有某些必需属性这一事实的副产品,例如两个相同的字符串具有相同的哈希码。因此,AppDomain 为设置的效果提供了合理的边界,因为启用此设置后,大多数应用程序都可以完美运行。

此新设置可能会进一步解决此漏洞披露中提出的问题:CVE-2011-3414与利用 ASP.NET 应用程序中的散列冲突有关(我相信,该问题在其他 .NET 版本中已“修复”,通过限制可以在请求中提供的 key 数量,防止攻击者创建如此多的冲突,从而降低性能显着退化)。 referenced paper特别提到缺乏随机字符串散列是导致该问题广泛存在的一个因素。

关于.net - 在每个应用程序域的基础上实际使用字符串哈希码计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com