2009-08-06 3 views
1

Ich habe eine schnelle Konsolen-App geschrieben, um schnell Benutzernamen und Logins für meine Web-Anwendung für bestehende Konten zu generieren, die Passwörter nicht ordnungsgemäß hashed haben. In meiner Web-Anwendung verwende ich FormsAuthentication wie so:Was gibt mir das gleiche Ergebnis wie FormsAuthentication Hashing für eine Nicht-Webanwendung?

string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPassword, "SHA1"); 

Ich versuchte FormsAuthentication in der Konsolenanwendung zu verwenden, aber es kann die FormsAuthentication noch die Importe nicht lösen. Die Warnung, die ich bekomme, fragt, ob ich eine Versammlung vermisse. Ich habe versucht, die folgenden zu verwenden, um mir die gleichen Ergebnisse wie die vorherige zu geben:

SHA1 sha1 = new SHA1CryptoServiceProvider(); 
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
byte[] bytesHashedPwd = sha1.ComputeHash(encoding.GetBytes(saltAndPwd)); 
string tmpString = encoding.GetString(byteshashedPwd); 
string hashedPwd = String.Concat(str, salt); 
return hashedPwd; 

Diese beiden Methoden geben mir zu unterschiedlichen Ergebnissen. Ich muss das gleiche Ergebnis wie FormsAuthentication erhalten. Ich bin kein Sicherheitsexperte mit einem kleinen Vauge-Hintergrund und mein Charakterwissen ist noch schlimmer. Ich schätze jede Hilfe.

Antwort

2

Wenn Sie neugierig sind, wird der Code mit dieser Methode verwendet wird:

return MachineKeySection.ByteArrayToHexString(
    SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(password)), 
    0 
); 
3

Es scheint für mich zu arbeiten.

  • habe ich einen Verweis auf System.Web
  • Ich habe mit System.Web.Security

Dann habe ich Ihren Code-Snippet:

string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPassword, "SHA1"); 

das Ergebnis zu erhalten. Dies war in einer Konsolenanwendung.

+0

Ich bin so ein Idiot. Ich bin neu bei .Net. Hinzufügen der Referenz löste es auch. Ihr beide habt mir geholfen. Sorry, ich habe die Antwort von apoc zuerst gewählt. – uriDium

0

konnte ich die System.Web Verweis auf eine Konsole App hinzufügen und

string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPassword, "SHA1"); 
2

Hier ist eine andere Lösung verwenden, um die System.Web.dll Abhängigkeit, in C# zu vermeiden:

public static string SHA1(this string stringToHash) 
{ 
    // SHA1 is 160bit 
    SHA1 sha = new SHA1Managed(); 
    byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(stringToHash)); 

    StringBuilder stringBuilder = new StringBuilder(); 
    foreach (byte b in hash) 
    { 
     stringBuilder.AppendFormat("{0:x2}", b); 
    } 

    return stringBuilder.ToString().ToUpper(); // HashPasswordForStoringInConfigFile uses uppercase hex 
} 

Sie würden es so verwenden:

string salt = "abcdef"; // swap this with a random string generator 
string password = string.Format("{0}{1}", "password", salt).SHA1();