2008-12-05 15 views
7

Sto riscrivendo un sito Web PHP in ASP.NET MVC. Mi piacerebbe mantenere la stessa base di utenti ma le password sono hash con la funzione PHP crypt(). Ho bisogno della stessa funzione in .Net in modo che io possa cancellare una password all'accesso e controllarla con la password con hash nel database degli utenti.Funzione PHP crypt() in .Net?

cripta in questo caso sta usando l'attuazione CRYPT_MD5 - gli hash tutti iniziare con $ 1 $

Ho provato Phalanger ma non ha un'implementazione MD5 della funzione cripta.

Qualcuno sa di uno in. Net? L'esempio C# di crypt() su CodeProject utilizza DES, non MD5.

Ho provato il seguente codice in C#, con diverse permutazioni di sale + password, password + sale e sale con e senza $ 1 $ prefisso e $ suffisso. Nessuno dà lo stesso risultato come 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 non è considerato un hash sicuro e si potrebbe desiderare di aggiornare i sistemi per SHA-256. – TravisO

+0

btw, 'Console.WriteLine ("Hash di {0} è {1}", password, s); ' – abatishchev

+1

Abatishchev, questo è stato un picco veloce per verificare se potevo generare lo stesso hash di PHP per una determinata stringa di input. Il tuo commento è completamente fuori tema e meno che utile. –

risposta

0

L'unica soluzione che ho trovato è stato quello di chiamare uno script PHP banale che esegue semplicemente un hash della stringa di input e restituisce :-(

2

Ci sono alcuni metodi .NET per MD5 hash, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) è il più facile da usare, anche se è un boccone. Basta passare "md5" attraverso come formato.

A seconda di come PHP sta facendo questo, può essere semplice come tagliare lo $1$ all'inizio dell'hash quando lo si importa. Potrebbe essere più complesso. Se puoi pubblicare un esempio di password/hash, vedrò se riesco a trovare un C# che genera lo stesso hash di quella password per te.

+0

Ho provato l'hashing MD5 in .Net, ma risulta in un hash diverso da quello che sto vedendo usando PHP crypt() –

1

Avete dato un'occhiata a .NET MD5 class? $ 1 $ fa parte di un sale di 12 caratteri.

0

Attualmente sto lavorando su esattamente lo stesso problema. La soluzione mi è venuta è stato quello di chiamare la funzione php direttamente tramite una chiamata extern:

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

Questo metodo funziona bene per PHP versione 5.2.10 quando si esegue il server WebDev locali, IIS5 e IIS6, ma se si utilizza l'II7 Il processo di lavoro ASP.Net si arresta in modo anomalo con un'eccezione non gestita. (Aggiornerò la mia risposta non appena troverò una risoluzione)

Stiamo anche includendo un flag di tipo password per permetterci di utilizzare l'implementazione .Net MD5 per tutti i nuovi utenti e convertire senza problemi gli utenti esistenti mentre aggiornano i loro dettagli.

Update: Il problema con riferimento php5ts.dll direttamente da IIS7 sembra essere più probabile verso il basso per l'uso di 64 bit di Windows, quindi questa soluzione potrebbe lavorare su un Windows 7 o Server 2008 a 32 bit, ma non sono in grado per verificare questo. Dato che il nostro sito esistente utilizzava DES, siamo stati in grado di utilizzare l'implementazione della crittografia da CodeProject, grazie per il riferimento Mike.

Problemi correlati