Что даст мне тот же результат, что и хеширование FormsAuthentication для не веб-приложения? - PullRequest
1 голос
/ 06 августа 2009

Я написал быстрое консольное приложение для быстрого создания и создания имен пользователей и логинов для моего веб-приложения для существующих учетных записей, которые не имели правильно хешированных паролей. В моем веб-приложении я использую FormsAuthentication так:

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

Я пытался использовать FormsAuthentication в консольном приложении, но он не может разрешить ни FormsAuthentication, ни импорт. Предупреждение, которое я получаю, спрашивает, пропускаю ли я сборку. Я попытался использовать следующее, чтобы дать мне те же результаты, что и предыдущий:

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;

Эти два метода дают мне разные результаты. Мне нужно получить тот же результат, что и FormsAuthentication. Я не эксперт по безопасности с крошечным легкомысленным фоном, и мои знания о характере еще хуже. Я ценю любую помощь.

Ответы [ 5 ]

3 голосов
/ 07 августа 2009

Кажется, у меня работает.

  • Я добавил ссылку на System.Web
  • Я добавил с помощью System.Web.Security

Тогда я использовал ваш фрагмент кода:

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

Чтобы получить результат. Это было в консольном приложении.

3 голосов
/ 06 августа 2009

Вот хорошее объяснение того, как соответствовать формату. Надеюсь, поможет.

http://www.stardeveloper.com/articles/display.html?article=2003062001&page=1

Я полагаю, что разница заключается в том, что проверка подлинности форм хэширует его в шестнадцатеричную строку.

2 голосов
/ 18 августа 2009

Вот еще одно решение, позволяющее избежать зависимости System.Web.dll в C #:

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
}

Вы бы использовали это так:

string salt = "abcdef"; // swap this with a random string generator
string password = string.Format("{0}{1}", "password", salt).SHA1();
2 голосов
/ 07 августа 2009

Если вам интересно, код, используемый этим методом:

return MachineKeySection.ByteArrayToHexString(
    SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(password)),
    0
);
0 голосов
/ 07 августа 2009

Мне удалось добавить ссылку System.Web в консольное приложение и использовать

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