2016-11-04 5 views
2

Ich habe eine Tabelle mit Zugangsdaten für ein Telerik Sitefinity System. Ich möchte dieselben Anmeldeinformationen verwenden, aber mit einer anderen Anwendung, die keine Sitefinity-Bibliotheken enthält. Ich kämpfe mit der Passwort-Codierung, die auf Hash (Standard ist SHA1-Algorithmus) festgelegt ist.Telerik Sitefinity Passwort Hash Funktion

Ich habe versucht, den folgenden Code zum Codieren von Kennwörtern zu verwenden, aber es stimmt nicht überein mit dem, was Sitefinity generiert.

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); 
} 

BEISPIEL:

PASSWORT: password111

Salz: 94EBE09530D9F5FAE3D002A4BF262D2F (wie in der SF Benutzertabelle gespeichert)

Hash mit Funktions oben: 8IjcFO4ad8BdkD40NJcgD0iGloU =

Hash in Tabelle generiert von SF: A24GuU8OasJ2bicvT/E4ZiKfAT8 =

Ich habe online gesucht, wenn SF das verschlüsselte Passwort anders generiert, aber keine Ergebnisse finden kann. Wie kann ich die Anmeldeinformationen verwenden, die von SF ohne SF-Bibliotheken erstellt wurden?

Antwort

2

Sie haben Recht, Sitefinity verwendet den SHA1-Algorithmus, aber Sie müssen einen zusätzlichen ValidationKey aus den Konfigurationseinstellungen verwenden.

Hier wird das Arbeitsbeispiel Code für Sie:

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

es funktioniert! vielen Dank. Wo hast du das herausgefunden? Ich konnte keine Informationen darüber finden, wie SF ihr Hashing macht. –

+1

Ich habe gerade ihre Telerik.Sitefinity.dll dekompiliert und gefunden, wie es funktioniert –