2008-12-05 6 views
7

ASP.NET MVC에서 PHP 웹 사이트를 다시 작성하고 있습니다. 동일한 사용자 기반을 유지하고 싶지만 암호는 PHP crypt() 함수를 사용하여 해시됩니다. 나는 닷넷에서 같은 기능을 필요로하기 때문에 로그인 할 때 패스워드를 해쉬 할 수 있고 사용자 데이타베이스의 패스워드를 해쉬 할 수있다. 이 경우.Net의 PHP crypt() 함수?

토굴은 CRYPT_MD5 구현을 사용 - 해시는 모든 $ (1) 내가 팔란 저를 해봤 $

로 시작하지만 토굴 함수의 MD5 구현이 없습니다.

누군가가 .Net에 대해 알고 있습니까? CodeProject에서 crypt()의 C# 예제는 MD5가 아닌 DES를 사용합니다.

나는 C#에서 salt + password, password + salt 및 salt와 $ 1 $ 접두어 및 $ suffix의 유무에 관계없이 다음 코드를 시도했습니다. 아무도는 PHP와 동일한 결과를 제공하지 :

static void Main(string[] args) 
{ 
    const string salt = "somesalt"; 
    const string password = "fubar"; 
    const string plaintextString = password + salt; 
    byte[] plaintext = GetBytes(plaintextString); 
    var md5 = MD5.Create("MD5"); 
    byte[] hash = md5.ComputeHash(plaintext); 
    string s = System.Convert.ToBase64String(hash); 
    Console.WriteLine("Hash of " + password + " is " + s); 
    Console.ReadKey(); 
} 

private static byte[] GetBytes(string s) 
{ 
    var result = new byte[s.Length]; 
    for (int i = 0; i < s.Length; i++) 
     result[i] = (byte)s[i]; 
    return result; 
} 
+0

MD5 :-(을 반환하는 사소한 PHP 스크립트를 호출했다 당신은 당신의 시스템을 업그레이드 할 수 있습니다 SHA-256. – TravisO

+0

btw,'콘솔.WriteLine ("{0}의 해시는 {1}", password, s); ' – abatishchev

+1

Abatishchev, 주어진 입력 문자열에 대해 PHP와 동일한 해시를 생성 할 수 있는지 확인하는 빠른 스파이크였습니다. 귀하의 의견은 주제를 벗어나 도움이되지 않습니다. –

답변

0

내가 찾은 유일한 해결책은 안전한 해쉬 간주되지 않습니다 단순히 입력 문자열의 해시를 수행하고

2

는 MD5 해시에 대한 몇 가지 .NET 방법이 있습니다, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) 그것이 입에도 불구하고, 사용하기 쉬운 것입니다. 형식으로 "md5"를 전달하십시오.

PHP가이 작업을 수행하는 방법에 따라 가져 오기 작업을 수행 할 때 해시 시작 부분에서 $1$을 자르는 것처럼 간단 할 수 있습니다. 그것은 더 복잡 할 수 있습니다. 예제 비밀번호/해시를 게시 할 수있는 경우, 해당 비밀번호에서 동일한 해시를 생성하는 C#을 생각해 낼 수 있는지 알 수 있습니다.

+0

.Net에서 MD5 해시를 시도했지만 PHP crypt()를 사용하여 본 것과 다른 해시가됩니다. –

1

.NET MD5 class을 보셨습니까? $ 1 $은 12 자짜리 소금의 일부입니다.

0

나는 현재 정확히 같은 문제에 일하고 있습니다. 당신이 II7를 사용하는 경우, 로컬 경우 Webdev 서버를 실행 IIS5와 IIS6하지만 경우는 PHP 버전 5.2.10을 위해 잘 작동

[DllImport("php5ts.dll", EntryPoint = "crypt", CharSet = CharSet.Ansi)] 
private static extern string crypt(string str, string salt); 

: 내가 생각 해낸 해결책은 통근 호출을 통해 직접 PHP 함수를 호출하는 것이 었습니다 ASP.Net 작업자 프로세스가 처리되지 않은 예외로 인해 충돌합니다. (해결책을 찾 자마자 내 대답을 업데이트 할 것입니다.)

우리는 모든 새로운 사용자에 .Net MD5 구현을 사용하고 기존 사용자를 원활하게 변환 할 수 있도록 암호 유형 플래그를 포함합니다. 세부.

업데이트 : 업데이트 :IIS7에서 직접 php5ts.dll을 참조 할 때의 문제는 64 비트 창을 사용하는 것 같아서이 솔루션은 32 비트 Windows 7 또는 Server 2008 설치에서 작동 할 수 있지만 이것을 확인하십시오. 그것이 우리의 기존 사이트가 DES를 사용함에 따라, 우리는 CodeProject에서 crypt 구현을 사용할 수 있었고, 참고 Mike에게 감사드립니다.