2009-08-07 4 views
2

J'ai démarré un nouveau projet dans .NET qui utilise la base de données de l'ancien système dans MySql. Les données stockées dans mysql sont périodiquement transférées à MS SQL sur lequel notre système fonctionne. Je dois authentifier les utilisateurs avec leur identifiant et leur mot de passe. Les mots de passe de l'utilisateur sont stockés sous forme de hash généré par la fonction OLD_PASSWORD de mysql. Est-il possible de générer un tel hachage à l'aide de Ms Sql ou .NET?Simulation de MySQL OLD_PASSWORD en .NET ou MS SQL?

+0

Je ne vois pas ce que l'algorithme utilisé par le OLD_PASSWORD. De plus, le manuel MySql dit "La fonction PASSWORD() est utilisée par le système d'authentification dans le serveur MySQL, vous ne devriez pas l'utiliser dans vos propres applications.Pour ce faire, considérez plutôt MD5() ou SHA1()". Donc, sans connaître l'algorithme, nous ne pouvons pas trouver comment le faire dans .NET. –

Répondre

0

Here est un module Perl qui émule la fonction password() de MySQL pour les versions 4.0 et antérieures (qui est maintenant la fonction OLD_PASSWORD()) et la version 4.1 et supérieure. Alors que je me rends compte que ce n'est pas .NET :-) c'est le seul morceau de code (en dehors de la source MySQL) que j'ai trouvé quand je cherchais ça, bien que j'avais besoin de l'implémentation Java. Cela a fonctionné pour moi et a aidé à la migration - peut-être que vous pourrez le porter sur .NET ou l'exécuter en tant que processus externe.

4

J'ai trouvé un à http://www.yourhelpcenter.de/2009/06/mysql-alten-md5-hash-in-c-berechnen-16-stellig/

public static string mysql_old_password(string sPassword) 
{ 
    UInt32[] result = new UInt32[2]; 
    bool bDebug = false; 
    UInt32 nr = (UInt32)1345345333, add = (UInt32)7, nr2 = (UInt32)0x12345671; 
    UInt32 tmp; 

    char [] password = sPassword.ToCharArray(); 
    int i; 

    for (i = 0; i < sPassword.Length; i++) 
    { 
     if (password[i] == ' ' || password[i] == '\t') 
      continue; 

     tmp = (UInt32)password[i]; 
     nr ^= (((nr & 63) + add) * tmp) + (nr << 8); 
     nr2 += (nr2 << 8)^nr; 
     add += tmp; 
    } 

    result[0] = nr & (((UInt32)1 << 31) - (UInt32)1); 
    UInt32 val = (((UInt32)1 << 31) - (UInt32)1); 
    result[1] = nr2 & val; 
    string hash = String.Format("{0:X}{1:X}", result[0], result[1]); 
    return hash.ToLower(); 
} 
+1

@ user8084772 La première chose dans ce post se réfère à votre propre site Web. Personne ne fait de l'argent avec ce poste, et il peut être considéré comme éducatif. S'il vous plaît voir [ce site sur les droits d'auteur et l'utilisation équitable] (https://ogc.harvard.edu/pages/copyright-and-fair-use), ou s'il vous plaît lien vers une référence légale qu'il s'agit vraiment d'une violation du droit d'auteur. –

+0

@ user8084772 Aussi, j'ai pris le temps de google traduire la grosse boîte rouge sur votre site, mais peut-être que si elle était écrite en anglais, les gens réfléchiraient à deux fois avant de copier votre code. Pour un non-allemand, la page entière ne veut absolument rien dire. –