2016-11-04 1 views
2

J'ai une table avec les identifiants de connexion pour un système Telerik Sitefinity. Je veux utiliser les mêmes identifiants de connexion, mais avec une application différente qui n'a pas de bibliothèque Sitefinity. Je suis aux prises avec l'encodage du mot de passe, qui est réglé sur Hash (l'algorithme par défaut est SHA1).Telerik Sitefinity Password Fonction de hachage

J'ai essayé d'utiliser le code suivant pour coder les mots de passe, mais cela ne correspond pas à ce que Sitefinity a généré.

public string EncodePassword(string pass, string salt) 
{ 
    byte[] bytes = Encoding.Unicode.GetBytes(pass); 
    byte[] src = Convert.FromBase64String(salt); 
    byte[] dst = new byte[src.Length + bytes.Length]; 
    Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
    byte[] inArray = algorithm.ComputeHash(dst); 
    return Convert.ToBase64String(inArray); 
} 

EXEMPLE:

MOT DE PASSE: password111

SEL: 94EBE09530D9F5FAE3D002A4BF262D2F (comme enregistré dans la table utilisateur SF)

Hash avec la fonction ci-dessus: 8IjcFO4ad8BdkD40NJcgD0iGloU =

Hash dans le tableau généré par SF: A24GuU8OasJ2bicvT/E4ZiKfAT8 =

J'ai recherché en ligne si SF génère le mot de passe codé différemment, mais ne trouve aucun résultat. Comment puis-je utiliser les informations de connexion créées par SF sans les bibliothèques SF?

Répondre

2

À droite, Sitefinity utilise l'algorithme SHA1, mais vous devez utiliser ValidationKey supplémentaire à partir des paramètres de configuration.

Voici l'exemple de travail de code pour vous:

private static bool CheckValidPassword(string password) 
{ 
    //from sf_users column [salt] 
    var userSalt = "420540B274162AA093FDAC86894F3172"; 

    //from sf_users column [passwd] 
    var userPassword = "a99j8I0em8DOP1IAJO/O7umQ+H0="; 

    //from App_Data\Sitefinity\Configuration\SecurityConfig.config attribute "validationKey" 
    var validationKey = "862391D1B281951D5D92837F4DB9714E0A5630F96483FF39E4307AE733424C557354AE85FF1C00D73AEB48DF3421DD159F6BFA165FF8E812341611BDE60E0D4A"; 

    return userPassword == ComputeHash(password + userSalt, validationKey); 
} 

internal static string ComputeHash(string data, string key) 
{ 
    byte[] hashKey = HexToBytes(key); 
    HMACSHA1 hmacshA1 = new HMACSHA1(); 
    hmacshA1.Key = hashKey; 
    var hash = hmacshA1.ComputeHash(Encoding.Unicode.GetBytes(data)); 
    return Convert.ToBase64String(hash); 
} 

public static byte[] HexToBytes(string hexString) 
{ 
    byte[] numArray = new byte[hexString.Length/2]; 
    for (int index = 0; index < numArray.Length; ++index) 
     numArray[index] = Convert.ToByte(hexString.Substring(index * 2, 2), 16); 
    return numArray; 
} 
+1

ça marche! Merci beaucoup. Où avez-vous trouvé cela? Je n'ai trouvé aucune information sur la façon dont SF a fait son hachage. –

+1

Je viens de décompiler leur Telerik.Sitefinity.dll et a trouvé comment ça marche –