2008-12-05 6 views
7

Je suis en train de réécrire un site web PHP dans ASP.NET MVC. Je voudrais maintenir la même base d'utilisateurs mais les mots de passe sont hachés en utilisant la fonction PHP crypt(). J'ai besoin de la même fonction dans .Net afin que je puisse hacher un mot de passe lors de la connexion et le vérifier par rapport au mot de passe haché dans la base de données utilisateur.Fonction PHP crypt() dans .Net?

crypte dans ce cas, utilise la mise en œuvre CRYPT_MD5 - les hash commencent tous par 1

$

$ J'ai essayé Phalanger mais il ne dispose pas d'implémentation de MD5 de la fonction crypte.

Quelqu'un en connaît-il un dans .Net? L'exemple C# de crypt() sur CodeProject utilise DES, pas MD5.

J'ai essayé le code suivant en C#, avec différentes permutations de sel + mot de passe, mot de passe + sel et sel avec et sans préfixe $ 1 $ et $ suffixe. Aucun donne même résultat que 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 est pas considéré comme un hachage sécurisé et vous pouvez mettre à jour vos systèmes SHA-256 – TravisO

+0

btw, 'Console.WriteLine ("Hash de {0} est {1}", mot de passe, s); ' – abatishchev

+1

Abatishchev, ce fut un pic rapide pour vérifier si je pouvais générer le même hachage que PHP pour une chaîne d'entrée donnée. Votre commentaire est complètement hors sujet et moins qu'utile. –

Répondre

0

La seule solution que j'ai trouvé d'appeler un script PHP trivial qui effectue simplement un hachage de la chaîne d'entrée et il retourne :-(

2

Il existe quelques méthodes .NET pour le hachage md5, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) est le plus facile à utiliser, même si elle est une bouchée. Il suffit de passer "md5" à travers le format.

Selon la façon dont PHP fait cela, il peut être aussi simple que de couper le $1$ au début du hachage lorsque vous l'importez. Cela peut être plus complexe. Si vous pouvez poster un exemple de mot de passe/hash, je verrai si je peux trouver un C# qui génère le même hachage à partir de ce mot de passe pour vous.

+0

J'ai essayé le hachage MD5 dans .Net, mais il en résulte un hachage différent de ce que je vois en utilisant PHP crypt() –

1

Avez-vous jeté un coup d'œil au .NET MD5 class? $ 1 $ fait partie d'un sel de 12 caractères.

0

Je travaille actuellement sur la même question. La solution que je suis venu avec était d'appeler la fonction php directement via un appel extern:

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

Cela fonctionne bien pour la version php 5.2.10 lors de l'exécution du serveur local WebDev, IIS5 et IIS6 mais si vous utilisez II7 la Le processus de travail ASP.Net se bloque avec une exception non gérée. (Je mettrai à jour ma réponse dès que je trouverai une résolution)

Nous incluons également un indicateur de type de mot de passe pour nous permettre d'utiliser l'implémentation .Net MD5 pour tous les nouveaux utilisateurs et de convertir de façon transparente les utilisateurs existants pendant qu'ils mettent à jour leur détails.

Mise à jour: Le problème avec le référencement php5ts.dll directement à partir IIS7 semble très probablement vers le bas à l'aide de 64 fenêtres de bits, cette solution pourrait fonctionner sur un 32 bits de Windows 7 ou de l'installation Server 2008, mais je ne peux pas pour vérifier cela. Comme il s'est avéré que notre site existant utilisait DES, nous avons donc pu utiliser l'implémentation crypt de CodeProject, merci pour la référence Mike.