2010-07-06 2 views
12

흥미로운 문제가 생겼어. "HMACSHA256"해시에 대한 ComputeHash()가 결정 론적으로 작동하지 않는 것 같습니다. HashAlgorithm.Create ("HMACSHA256")를 사용하여 HashAlgorithm의 두 인스턴스를 만드는 경우 다음과 같이 실행합니다. ComputeHash, 나는 두 가지 다른 결과를 얻습니다. 아래는이 동작을 나타내는 정적 정적 클래스의 예입니다.ComputeHash가 결정 론적으로 작동하지 않는 이유는 무엇입니까?

internal static string HashPassword(byte[] bAll) 
{ 
    using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256")) 
    { 
     return Convert.ToBase64String(s.ComputeHash(bAll)); 
    } 
} 

나는 또한 호출 비 정적을 만들기 위해 노력했습니다 (실제로는 비 정적 시작하고, 나는 더블, 트리플 가지고 quadrudruple은 .. 내가 '각 통화의 절대적 같은 내 입력 배열 .. 체크 심지어 immidiate 창 등에서 물건을 했어 :

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll) 

그리고 두 개의 서로 다른 해시를 반환하는 방법에 중단 점을 통해 두 번 immidiates 창에서 그 실행 ..

나는 해시 결정적으로 생각한다 알고있다. 그래서 무엇이 제공됩니까? 디버거에서? 아니면 다른 아이디어? 정말이 지금 단어를 두 이상해 - P ..

감사 조쉬

+3

이 문제를 나타내는 짧은 샘플 데이터가 있습니까? 통화 중 또는 통화 중에 'bAll'이 바뀌고 있습니까? –

+4

HMAC는 키순 해시입니다.귀하의 예제 코드에서 키가 보이지 않습니다. 명시 적으로 지정하지 않으면 키가 임의로 설정됩니다. – dtb

+0

전화 사이에 아무것도 바뀌지 않습니다. 내가 말했듯이 immidiates 창에서이 작업을 수행했습니다. 내 Immidiates 창에서 4 건의 호출이 있습니다. 예, HashAlgorithm을 처리해야하기 때문에 완벽하지는 않지만 결과는 Immidiates 창 또는 방법을 통해 동일. (여기에 붙여 넣을 복사 공간이 없기 때문에 다음 주석에 포함 할 것입니다.) –

답변

24

HMAC은 키 입력 해시입니다. 귀하의 예제 코드에서 키가 보이지 않습니다.

HashAlgorithm.Create("HMACSHA256")은 HashAlgorithm 인스턴스를 생성하므로 키에 대해 아무것도 모릅니다. 그것은 아마 this HMACSHA256 Constructor 호출

public HMACSHA256()

무작위로 생성 된 키으로 HMACSHA256 클래스의 새 인스턴스를 초기화합니다.

당신은 this constructor를 원하는 :

public HMACSHA256(byte[] key)

는 지정된 키 데이터를 사용하여 HMACSHA256 클래스의 새 인스턴스를 초기화합니다. 당신이 하드 코드로 HMAC 알고리즘을 원하지 않는 경우

, 당신은 KeyedHashAlgorithm.Create을 사용하고 KeyedHashAlgorithm.Key 속성을 설정하여 특정 키를 제공 할 수 있습니다.

키를 사용하지 않으려면 SHA256과 같이 키가없는 해시를 사용하십시오.

+0

그의 최선의 방법은 ['KeyedHashAlgorithm.Create'] (http://msdn.microsoft.com/en-us/library/s5zz2x4d.aspx)를 사용하는 것입니다. 배운 교훈 : 당신의 해시를 알아라! – Randolpho

+0

필자는 공급자 정보를 digg로 가져와 MS가 키순 해시를 기본값으로 설정하고 있지만 HashAlgorithm.Create()를 사용하여이 키가 생성 된 경우를 알아낼 것입니다. 그것은 4.0 프레임 워크와 2.0 기반 ASP.NET 공급자 스타터 팩 소스를 사용하고있을 수 있습니다 .. 어쨌든, 옳은 방향으로 나를 가리켜 주셔서 감사합니다. –

+0

@ Josh : MS가 "놀라운"임의성을 가진 곳이 몇 군데 있습니다. 예를 들어 암호화를위한'CypherMode' 설정 중에는 지정하지 않은 경우 임의의 초기화 벡터를 사용하는 것이 있습니다. 재미있는 부분은 암호화 및 암호 해독이 데이터의 처음 8 바이트를 제외한 모든 부분에 대해 완벽하게 작동하는 경우입니다. 나는 그들이 여기서 좋은 결정을 내렸다고 생각한다. 나는 그것이 "작동"하지만 덜 안전한 상태로 기본 설정하는 것보다 필요한 보안 매개 변수를 이해하지 못하기 때문에 차라리 프로그램이 빨리 실패합니다. – Brian

3

HMACSHA256에 대한 키가 필요합니다. 키는 생성자에 전달되지 않으면 무작위입니다.

5

그냥 두 사람을 구하기 위해 이걸 추가하기 만하면됩니다.

의 경우 .Net 회원 공급자의 경우 web.config 또는 app.config에 설정되어 있는지 확인하십시오. 그렇지 않으면 자동으로 자체 키를 생성합니다 ... 인증시 쓰레기를 버리고 결국에는 당신을 호되게 비웃습니다.

관련 문제