C #: сравнение хэша пароля с вводом пользователем разных размеров при аутентификации пользователя - PullRequest
1 голос
/ 17 января 2012

Я сделал регистрацию пользователя, где я солил пароль пользователя и хэшировал его, используя SHA256. позже, когда пользователю необходимо войти в мою систему, мне нужно, чтобы его пароль был засолен и хеширован, поэтому я: 1. извлек соль "строка" из базы данных 2. преобразовал соль в байты 3. создал новый байт [] = [inputPassword.length + salt.length] 4. и хешировал это.

теперь новый хеш короче, чем оригинальный хеш ... (с использованием тех же функций хеширования)

учитывая эту информацию, как вы думаете, проблема может быть ... неправильно хранит соль как CHAR в моей базе данных, если да, что или как мне сохранить?

Примечание: оба хэша сравниваются на уровне байтов. Примечание: вся информация пользователя хранится в пароле базы данных и обозначается как CHAR

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 17 января 2012

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

1 голос
/ 17 января 2012

Вы можете сгенерировать соль из Guid, преобразованного в строку base 64, а затем сохранить ее в базе данных как char.Я использую nvarchar, чтобы максимизировать свои параметры, используя строку .NET.

Затем вы можете реализовать нечто подобное для генерации хэша исходного пароля и сравнения хеша, когда пользователь входит в систему:

    public static byte[] GetHash(string password, string salt)
    {
        byte[] unhashedBytes = Encoding.Unicode.GetBytes(String.Concat(salt, password));

        SHA256Managed sha256 = new SHA256Managed();
        byte[] hashedBytes = sha256.ComputeHash(unhashedBytes);

        return hashedBytes;
    }

    public static bool CompareHash(string attemptedPassword, byte[] hash, string salt)
    {
        string base64Hash = Convert.ToBase64String(hash);
        string base64AttemptedHash = Convert.ToBase64String(GetHash(attemptedPassword, salt));

        return base64Hash == base64AttemptedHash;
    }
...