2013-08-19 3 views
-1

Сегодня надоедливый вопрос, я должен знать это, но для жизни меня я не могу понять. Я пытаюсь хэш-пароль перед запросом базы данных sql. У меня есть хэш-код работает отлично, однако его внутри общественной статической строки:C# SHA512/Public Static String

 public static string GetCrypt(string text) 
    { 
     string hash = ""; 
     SHA512 alg = SHA512.Create(); 
     byte[] result = alg.ComputeHash(Encoding.UTF8.GetBytes(text)); 
     hash = Encoding.UTF8.GetString(result); 
     return hash; 
    } 

У меня есть два вопроса, один .. один раз это хешируется, как я идти о получении такого результата, как, когда я пытаюсь получить доступ к переменная «хеш», которая дает ошибку, не существует в текущем контексте. Я подозреваю, что это связано с общественными и частными классами?

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

Спасибо заранее, ребята!

+5

Этот код не подходит *, вы конвертируете произвольные двоичные данные (хэш) в строку с использованием Encoding.UTF8. Вы должны использовать Convert.ToBase64String (или hex). –

+1

Почему вы не используете соленые хеши? :( – cdhowie

+0

@cdhowie: Это для паролей? – Joey

ответ

5

Чтобы использовать этот метод, вы бы сохранить возвращаемое значение, например:

string hashedString = GetCrypt(inputString); 

Затем используйте hashedString в зависимости от обстоятельств.

Тем не менее, есть некоторые проблемы:

  • Результат alg.ComputeHash() не UTF-8 строка в кодировке, поэтому Encoding.UTF8.GetString() очень вероятно бросить исключение, и даже не будет делать то, что вы хотите. Рассмотрим использование Convert.ToBase64String() (или convert the byte array to a hex string).
  • Вы не соберите входную строку, по крайней мере, не внутри этого метода. Это означает, что ваша база данных паролей уязвима для атак rainbow table. Рассмотрим использование соленых хешей или (еще лучше) алгоритм, специально предназначенный для хеширования паролей, таких как bcrypt, scrypt или PBKDF2, который встроен в структуру itself.
Смежные вопросы