2013-06-29 5 views
0

저는 하루 종일 저의 문제에 대한 해결책을 찾아 보았고 마지막으로 도움을 요청하는 게시물을 만들기로 결정했습니다. 이 글을 올릴 수있는 최고의 장소인지는 모르지만 어쩌면 누군가 나를 도울 수 있습니다.C#을 사용하여 vBulletin 데이터베이스에 대해 인증

그래서 C#에서 간단한 로그인 양식을 만들려고합니다. 데이터베이스에서 사용자 이름, MD5 (암호) 및 소금을 얻는 데 모든 것이 잘 작동합니다. 이제 내 문제는 내 양식에서 입력 한 암호 + 소금 비교하는 방법입니다. 나는 vbulleting이 사용자가 포럼에 계정을 만들 때 어떻게 암호를 저장하는지 잘 모르며, 소금이나 무작위 또는 사용자 이름 기반이 무엇인지, 그가 얼마나 많은 반복을하는지에 대해서도 알지 못한다.

아무도 도와 줄 수 있습니까?

편집 : -

$vbulletin->userinfo['password'] != iif($password AND !$md5password, md5(md5($password) . $vbulletin->userinfo['salt']), '') AND 
      $vbulletin->userinfo['password'] != iif($md5password, md5($md5password . $vbulletin->userinfo['salt']), '') AND 
      $vbulletin->userinfo['password'] != iif($md5password_utf, md5($md5password_utf . $vbulletin->userinfo['salt']), '') 

그들이 그것을, 그래서 ICAN 시도가 C#에서 재현 할 수 있도록하는 방법

최고 감사합니다, Magg

+0

암호가 MD5로 이미 깨졌습니다. 어쨌든 vbulletin 인프라가 문서화되어 있습니까? 그리고 그렇지 않다면 소스 (PHP?)를 볼 수 있습니까? 해시 + 소금 암호를 확인하고 'hash (combine (salt, input)) == 해시'알고리즘을 사용하십시오. 이 경우에 '해시'는 (md5와) 동일하다고 상상하지만, 소금을 입력과 결합하는 방법은 일반적으로 앞에 붙이지 만 다양 할 수 있습니다. – user2246674

+0

또한 데이터베이스와 관련이 없으므로 "데이터베이스에서 가져 오는 데 문제가 없습니다." – user2246674

+0

오, 흠, [vBulletin] (http://en.wikipedia.org/wiki/VBulletin)을 일반적인 PHP 보드 중 하나와 혼동하고있는 것처럼 보입니다.하지만 같은 아이디어가 있습니다. 해시 알고리즘, 소금 조합 전략 및 HMAC와 같은 추가 세부 정보 (사용 된 경우)를 알아야합니다. – user2246674

답변

0

그래서 내 문제에 대한 해결책을 heres, 마침내 나는 그것을 얻을 수 있었다.

문제

는 C 번호가 유니 코드로 모든 문자열을 사용하고 vBulletin에, 난, 새로운 형태를 생성 새로운 텍스트 박스와 버튼을 추가 테스트를 위해서 UTF8

모든 문자열을 사용했다. 어쨌든 데이터베이스에 연결되지 않으며 데이터베이스에서 직접 가져온 소금을 제공했습니다.이미로 vbulleting 로그인을 언급 한 이후

(테스트를 위해서) 다음 :

그래서 C#에서 동일하게 재현하는 MD5 (MD5 (비밀번호) + 소금) 만을 heres 솔루션을 UTF8을 사용하여 :

static public string GetMd5Sum(string str) 
    { 
     //vBulletin uses UTF8 as strings, so you need to pass the user input string as UTF8 also 
     Encoder enc = System.Text.Encoding.UTF8.GetEncoder(); 

     //Create a byte[] array to store the new UTF8 string 
     byte[] utf8text = new byte[str.Length]; 

     //Pass the string to the byte[] array 
     enc.GetBytes(str.ToCharArray(), 0, str.Length, utf8text , 0, true); 

     //Hash the byte[] array with our UTF8 string inside 
     MD5 md5 = new MD5CryptoServiceProvider(); 
     byte[] result = md5.ComputeHash(utf8text); 

     //Build the final string by converting each byte 
     //into hex and appending it to a StringBuilder 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < result.Length; i++) 
     { 
      sb.Append(result[i].ToString("x2")); //x2 here so the outcome result is all in lowercase, couse vbulleting also stores all in lowercase 
     } 

     //And return it 
     return sb.ToString(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //Get the user input password as plain text 
     string pass = textBox1.Text; 

     //Here i provided the salt explicit that i took from the database 
     string salt = "N1GOt=>[email protected])[email protected]#]3u"; 

     //Here we convert the plain text password into the first hash 
     string p1 = GetMd5Sum(pass); 

     //Here we add the salt to the previous hashed password 
     string p2 = p1 + salt; 

     //Here we hash again the previous hashed password + the salt string 
     string final = GetMd5Sum(p2); 

     //this was just to the test to see if it all works as intended 
     MessageBox.Show(final); 
    } 

이렇게하면 암호와 마찬가지로 데이터베이스에 저장된 동일한 해시를 출력합니다.

감사합니다.이 문제에 대한 모든 도움을 주신 user2246647.

+0

Sweet, 다행 이네요. 변환은 다음과 같이 간단해질 수 있습니다 :'byte [] bytes = Encoding.UTF8.GetBytes (str);'케이스 문제에 대해서는 ToLower (끝) 또는 대소 문자를 구별하지 않는 불변의 문자 비교하다. 또한 좋은 버릇을 위해 해시 서비스 공급자를 폐기해야합니다 -'using '이 유용합니다. SO에서 볼 수있는 16 진수 문자열로 변환하는 데 도움이되는 멋진 트릭도 있습니다. (SOAP 변환을 사용한다고 생각합니다.) - 질문을 닫으려면 답을 수락하십시오. D – user2246674

0

을 감안할 때,하지만 여전히 아무 단서 발견 코드를 형식화했습니다 (구문을 무시할 수 있음).

$vbulletin->userinfo['password'] != iif($password AND !$md5password, 
     md5(md5($password) . $vbulletin->userinfo['salt']), '') 
AND $vbulletin->userinfo['password'] != iif($md5password, 
     md5($md5password . $vbulletin->userinfo['salt']), '') 
AND $vbulletin->userinfo['password'] != iif($md5password_utf, 
     md5($md5password_utf . $vbulletin->userinfo['salt']), '') 

이 표현은 "모든 메소드의 실패"를 발견,하지만 난 열심히 읽고 찾을 수 있기 때문에, 암시 적 외부 부정에 드 모건을 적용하여의는 "어떤 방법의 성공"에 대한 긍정적 인 경기로 다시 보자

$vbulletin->userinfo['password'] == iif($password AND !$md5password, 
     md5(md5($password) . $vbulletin->userinfo['salt']), '') 
OR $vbulletin->userinfo['password'] == iif($md5password, 
     md5($md5password . $vbulletin->userinfo['salt']), '') 
OR $vbulletin->userinfo['password'] == iif($md5password_utf, 
     md5($md5password_utf . $vbulletin->userinfo['salt']), '') 
하지 .. 내 코드를

storedPW == password && !md5password ? md5(md5(password) + salt) : '' 
|| storedPW == md5password ? md5(md5password + salt) : '' 
|| storedPw == md5password_utf ? md5(md5password_utf + salt) : '' 

점검은 조금 못생긴,하지만 :

지금, 단순화 및 지적 사항을 적용하고 x?y:z 같은 그 iff(x,y,z) 작품을 우리는 C#으로 다음과 같은 대해 뭔가와 끝까지. 실현하는 중요한 비트가 패턴은 다음과 같습니다 불행하게도

md5(md5(password) + salt) -> storedPw 

는 insidepro 링크에서 md5(md5($pass).$salt) 일치해야 - 그 도구를 사용할 때, 당신은 일반 텍스트 암호를 제공하고 있는지 확인하지 데이타베이스로부터의 해시

YMMV.

+0

설명해 주셔서 감사합니다 나에게 그것은 정말로 더 잘 이해하는데 도움이되었지만 아직도 일하지 않는다. 내가 insidepro에서 말했듯이 나는 데이터베이스에서 평문 암호와 소금을 제공했는데 여전히 일치하지 않았다. – user2535328