2008-12-05 10 views
7

Przepisuję stronę PHP w ASP.NET MVC. Chciałbym utrzymać tę samą bazę użytkowników, ale hasła są mieszane za pomocą funkcji PHP crypt(). Potrzebuję tej samej funkcji w .Net, aby móc zaszyfrować hasło przy logowaniu i sprawdzić je w odniesieniu do hashowanego hasła w bazie danych użytkowników.Funkcja PHP crypt() w .Net?

krypta w tym przypadku używa realizację CRYPT_MD5 - mieszań wszystko zacząć od 1 $ $

Próbowałem Phalanger ale nie ma implementację MD5 funkcji krypt.

Czy ktoś wie o jednym z .Net? Przykład C# crypt() na CodeProject używa DES, a nie MD5.

Próbowałem następujący kod w C#, z różnymi permutacjami soli + hasło, hasło + sól i sól zi bez prefiksu $ 1 $ i sufiksu $. Żaden daje taki sam wynik jak 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 nie jest uważane za bezpieczne hash a może chcesz uaktualnić swoje systemy SHA-256. – TravisO

+0

btw, 'Konsola.WriteLine ("Hash z {0} to {1}", hasło, s); ' – abatishchev

+1

Abatishchev, to był szybki skok, aby sprawdzić, czy mogę wygenerować ten sam skrót jak PHP dla danego ciągu wejściowego. Twój komentarz jest całkowicie nie na temat i jest mniej niż pomocny. –

Odpowiedz

0

Jedynym rozwiązaniem znalazłem zadzwonić trywialny skrypt PHP, który po prostu wykonuje hash ciągu wejściowego i zwraca go :-(

2

Istnieje kilka metod .NET md5 mieszaja, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) jest najłatwiejszy w obsłudze, nawet jeśli jest to łyk. Wystarczy przekazać "md5" przez jako format.

W zależności od tego, jak PHP to robi, może to być tak proste, jak odcięcie $1$ z początku wartości skrótu podczas importowania. Może być bardziej skomplikowany. Jeśli możesz podać przykładowe hasło/hash, zobaczę, czy mogę wymyślić jakieś C#, które generuje ten sam skrót od tego hasła dla ciebie.

+0

Próbowałem hash MD5 w .Net, ale powoduje to inny skrót z tego, co widzę przy użyciu PHP crypt() –

0

Obecnie pracuję na dokładnie ten sam problem. Rozwiązanie wymyśliłem było wywołać funkcję php bezpośrednio poprzez extern rozmowy:

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

Działa to dobrze dla PHP w wersji 5.2.10, gdy uruchomiony lokalny serwer webdev, IIS5 i IIS6 ale jeśli używasz II7 się Proces roboczy ASP.Net ulega awarii z nieobsługiwanym wyjątkiem. (Aktualizuję swoją odpowiedź, gdy tylko znajdę rozwiązanie).

Dodajemy również flagę typu hasła, aby umożliwić nam korzystanie z implementacji .Net MD5 dla wszystkich nowych użytkowników i bezproblemowo konwertować istniejących użytkowników podczas aktualizacji ich Detale.

Aktualizacja: Emisja o przedstawieniu php5ts.dll bezpośrednio z IIS7 wydaje się najprawdopodobniej w dół za pomocą 64 bitowych systemów Windows, więc takie rozwiązanie może pracować na 32-bitowego systemu Windows 7 lub Windows Server 2008 z instalacji, jednak nie jestem w stanie aby to zweryfikować. Jak się okazało nasza obecna strona używała DES, więc mogliśmy użyć implementacji krypt z CodeProject, dzięki za referencje Mike'a.