【问题标题】:Why is this loop intentionally not optimized?为什么故意不优化此循环?
【发布时间】:2017-11-30 08:16:44
【问题描述】:

https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Helpers/Crypto.cs#L159

// Compares two byte arrays for equality. The method is specifically written so that the loop is not optimized.
[MethodImpl(MethodImplOptions.NoOptimization)]
private static bool ByteArraysEqual(byte[] a, byte[] b)
{
    if (ReferenceEquals(a, b))
    {
        return true;
    }

    if (a == null || b == null || a.Length != b.Length)
    {
        return false;
    }

    bool areSame = true;
    for (int i = 0; i < a.Length; i++)
    {
        areSame &= (a[i] == b[i]);
    }
    return areSame;
}

【问题讨论】:

标签: c# .net optimization


【解决方案1】:

这样写是为了排除timing attacks的可能性。

如果代码有明显的提前优化,它将通过执行时间“泄漏”有关比较结果的信息 - 相等的数组将花费更长的时间来比较。

如果用作加密相关代码实现的一部分,泄露的信息可能有助于攻击者试图破解它。

乍一看,这似乎是一种不太可能的方法,但这是一个真正的威胁 - 请参阅 this paper 示例。

【讨论】:

    猜你喜欢
    • 2018-11-01
    • 2013-03-01
    • 2020-09-09
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多