为什么这个循环故意没有优化?

Ken*_*Ito 9 .net c# optimization

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;
}
Run Code Online (Sandbox Code Playgroud)

Blo*_*ard 8

它是用这种方式编写的,以排除定时攻击的可能性.

如果代码具有明显的早期优化,它将通过执行它所花费的时间"泄漏"有关比较结果的信息 - 相同的数组需要更长的时间进行比较.

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

乍一看似乎是一种不太可能的方法,但这是一个真正的威胁 - 请参阅本文的一个例子.