C# 为什么比较两个相同的字节数组需要不同的时间来完成?

C# 为什么比较两个相同的字节数组需要不同的时间来完成?,c#,cryptography,md5,C#,Cryptography,Md5,我试图计算散列,然后比较它们,以模拟c# 这是我为此目的使用的代码: private void btnHash_Click(object sender, EventArgs e) { MD5 md5 = new MD5CryptoServiceProvider(); var firstHashByte = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(txtBoxText.Text)); txtBoxHash.Text = Co

我试图计算散列,然后比较它们,以模拟c#
这是我为此目的使用的代码:

private void btnHash_Click(object sender, EventArgs e)
{
    MD5 md5 = new MD5CryptoServiceProvider();
    var firstHashByte = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(txtBoxText.Text));
    txtBoxHash.Text = Convert.ToBase64String(firstHashByte);

    var secondHashByte = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(txtBoxSecondText.Text));
    txtBoxHashtwo.Text = Convert.ToBase64String(secondHashByte);

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    NormalEquality(firstHashByte, secondHashByte);
    //SlowEquals(firstHashByte, secondHashByte);

    stopwatch.Stop();
    lstBoxTimeSpan.Items.Add(stopwatch.ElapsedTicks.ToString());
}


private static void NormalEquality(byte[] hashByte, byte[] hashByte2)
{
    bool bEqual = false;
    if (hashByte.Length == hashByte2.Length)
    {
        int i = 0;
        while ((i < hashByte2.Length) && (hashByte2[i] == hashByte[i]))
        {
            i += 1;
        }
        if (i == hashByte2.Length)
        {
            bEqual = true;
        }
    }
}

)

由于秒表分辨率太低,无法测量如此少的代码,因此您会得到不同的时间。即使秒表的分辨率非常高,CPU仍有时间在秒表的每一滴答声之间运行数千条指令

在方法执行过程中,秒表只会走几下,因此产生的时间变化很大


例如,如果您运行该方法一千次或一百万次,您将获得足够的工作量,可以用足够小的时间变化进行测量。

有许多因素会影响方法调用的时间,计算机是一个庞大的系统,最微小的变化可能成为众所周知的蝴蝶。坦率地说,微小的时间差异不需要担心,重要的是它是否总是产生正确的结果

要尝试的一件事可能是多次重复方法调用,例如一百万次或一千万次,并计时所有调用,例如

stopwatch.Start();
for (int i=0; i<1000000; i++) {
    // call test here
}
stopwatch.Stop();
stopwatch.Start();

对于(int i=0;iThanks,但这也没有帮助,因为相同的哈希值会生成不同的时间!即使一个程序每次都做完全相同的事情,并使用完全相同的系统设置,其他事情(如其他进程等)也会改变所需的时间。是否要求该方法在特定时间内运行?为什么这是一个担心,它不会占用同样的时间?那么,在定时攻击中的人们如何能够知道来自远程位置的正确密码和错误密码之间的区别!我无法在系统中获得接近的结果,甚至在互联网上也怎么可能!我只是在玩弄这个想法,想看看它们是否真的不同。如果你正在尝试使用确定密码是否正确的时机,如果你不在英国,那么这个网站可能会引起你的兴趣,可能还有其他类似的法律,如果我要侵入一些东西,我不会费心在这里问:)我正在尝试在我的应用程序上实现这一点的可能性。正如您所看到的,我正在测试一个安全和非安全的版本,并对结果感到困惑,即安全版本与非安全版本在结果方面没有什么不同。无论如何,感谢感谢感谢感谢,但这也没有帮助,仍然是相同的哈希值不同生成了t次!@Hossein:时间有多大不同?当你运行代码时,你永远不会得到完全相同的执行时间。许多因素可能会影响结果,比如计算机上运行的其他进程、垃圾收集、缓存状态、页面错误等。谢谢Guffa,但我想我应该期待它们在某种程度上有所不同,我无法理解这种定时攻击在互联网上是如何可能的!我无法在一个系统中获得任何有意义的差异,甚至在互联网上是如何可能获得差异的!!好吧,这种定时攻击将是很难的。但是想象一下,平均而言,一次比较要慢或快1/100秒。现在进行10亿次的比较,然后把它们全部加起来。如果比较相对缓慢,或者如果添加了随机的时间量,这甚至可以起作用,只要从长远来看是平均的。感谢owlstead,我认为这在某种程度上解释了这一点:)因为你的基准是有缺陷的,就是这样。
stopwatch.Start();
if ( firstHashString == secondHashString);
stopwatch.Stop();
stopwatch.Start();
for (int i=0; i<1000000; i++) {
    // call test here
}
stopwatch.Stop();