2013-12-08 13 views
10

まあ、私はパスワードをハッシュしたかった、と私はASP.netアイデンティティがMicrosoft.AspNet.Identity.Cryptoクラスでない方法を見ていた、と私は(2つのパスワードハッシュを比較するために使用される)は、この機能に沿って来た:このメソッドのMethodImpl(NoOptimization)は何をしますか?そしてそれは本当にnessecaryですか?

[MethodImpl(MethodImplOptions.NoOptimization)] 
private static bool ByteArraysEqual(byte[] a, byte[] b) 
{ 
    if (object.ReferenceEquals(a, b)) 
    { 
     return true; 
    } 
    if (((a == null) || (b == null)) || (a.Length != b.Length)) 
    { 
     return false; 
    } 
    bool flag = true; 
    for (int i = 0; i < a.Length; i++) 
    { 
     flag &= a[i] == b[i]; 
    } 
    return flag; 
} 

これが今私の質問はNoOptimizationがのために良い属性であり、なぜそれが(私はそれを削除した場合、何が起こるか)がどうあるべきか、です...

反射出力から直接コピーですか?私には、for -loopまでデフォルトのEquals()実装のように見えます。

私はILを見てしようとしたが、それは私にすべてのナンセンスである:「スマート」コンパイラは、それができた、とすぐに不一致が見つかったとしてfalseを返す何かにその機能を有効にした場合/

答えて

16

この機能を使用するコードを「タイミング攻撃」に対して脆弱にする---攻撃者は、文字列の最初の不一致が関数の返された時間に基づいていた場所を考え出すことができます。

これは単なるサイエンスフィクションではありませんが、実際はそうであるように見えるかもしれません。途中でインターネットを使用していても、実装が短絡していると思われる場合は、サンプルを一杯にして統計情報を使って何が起きているのか把握することができます。

+1

ありがとうございました。パフォーマンス上の理由から、私はしばしば早すぎるループ終了を使用しますが、攻撃可能であるとは考えていませんでした。乾杯! – Nefarion

+0

この非常に興味深い答えをありがとう。値がfalseのときにループが最適化されなかった理由は不思議でした。素晴らしい答え! –

2

JITコンパイラいずれか

  1. は、その最適化プロセスでエラーが発生したか、それはいくつかの予期しない方法でコードを最適化しているため
  2. コードの最適化は、エラーを生成することが場合があります。

私は、最適化されたメソッドが非最適化されたメソッドとは異なる動作をする状況に遭遇しました。 (私はこれが上記のケースAだったと信じています)。その1つの方法だけを

[MethodImpl(MethodImplOptions.NoOptimization)] 

と解決すると宣言します。

関連する問題