2013-12-08 1 views
10

글쎄, 내가 암호를 해시 원했고, 내가 ASP.net ID가 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라고 생각한다). 하나의 방법으로 선언하면

[MethodImpl(MethodImplOptions.NoOptimization)] 

이 문제를 해결했습니다.

관련 문제