sha1 Hash Не работает? C # - PullRequest
       7

sha1 Hash Не работает? C #

0 голосов
/ 23 сентября 2011

Я просто возился с простым хэшированием, потому что я новичок в этой идее, и у меня есть следующее:

public string Password {get;set;}
public static string Hash(string password)
    {
        return FormsAuthentication.HashPasswordForStoringInConfigFile(password, "sha1");
    }

    public bool Authenticate(AccountDataContext context)
    {
        var password = context.UserAccounts.FirstOrDefault(p => p.UserAccountUID == UserAccountUID).Password;
        var hash = Hash(Password);
        return password.Equals(hash);
    }

ПРИМЕЧАНИЕ Это не рабочий код, поэтому я не беспокоюсь о том, насколько он безопасен в настоящее время ...

Прямо сейчас, когда я первоначально хеширую пароль, когда пользователь регистрируется, например, следующее

var password = "Password";
var hashedPassword = UserAccount.Hash(password)

Тогда я сохраню это у пользователя.

Когда я аутентифицировал своего пользователя, я вызывал метод Authenticate (), и я думал, что он вернет тот же хеш, потому что он передает то же значение в метод Hash (), но они выдаются по-разному.

Есть идеи, почему хеш-функция будет возвращать два разных хеша для одной и той же строки?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Я не совсем уверен в этом случае, но обычно вы не только хэшируете пароль, но и пароль и некоторые дополнительные случайные шумы, которые вы сохраняете (часто называемые солт-значением).Это сделано для того, чтобы сделать все это более безопасным, чем один пароль.Если вы сохраняете только pwd, то злоумышленник может просто хешировать словари и найти много принятых паролей.Я полагаю, что то же самое происходит и здесь, за кулисами.

Рассматривали ли вы самостоятельно хеширование пароля (System.Security) вместо использования службы FormAuthentication-*? 1005 *

Посмотрите на SHA1Managed .ComputeHash-метод для этого.По сути, вы просто кодируете свою строку с помощью UnicodeEncoding.GetBytes - или чего хотите - в байтовый массив и вызываете этот метод, чтобы получить хешированный байтовый массив.Чем вы можете преобразовать это с помощью Convert.ToBase64String , чтобы получить строку назад - это БЕЗ этой соли, о которой я говорил, так что вы можете прочитать об этом перед переходом в производство.

1 голос
/ 23 сентября 2011

Результат хеширования будет одинаковым при нескольких вызовах функции.Возможно, вы захотите вызвать String.Trim () перед хэшированием, чтобы убедиться, что в строке до ее хеширования нет пробелов.

Кроме того, отправленный вами фрагмент не должен читать:

public bool Authenticate(AccountDataContext context)
{
    var password = context.UserAccounts.FirstOrDefault(p => p.UserAccountUID == UserAccountUID).Password;
    var hash = Hash(password); //lower case password, not Password.
    return password.Equals(hash);
}
...