2015-06-17 6 views
0

я использовал это функции для вычисления значения хэш-функции:сохранить хеш-значение в базе данных

public string GetSHA512(string input) 
{ 
    byte[] data, result; 
    StringBuilder hash = new StringBuilder(); 

    data = Encoding.UTF8.GetBytes(input); 
    using (SHA512 shaM = new SHA512Managed()) 
    { 
     result = shaM.ComputeHash(data); 
    } 

    for (int i = 0; i < result.Length; i++) 
    { 
     hash.Append(result[i].ToString()); 
    } 

    return hash.ToString(); 
} 

public string GetSHA256(string input) 
{ 
    byte[] data, result; 
    StringBuilder hash = new StringBuilder(); 

    data = Encoding.UTF8.GetBytes(input); 
    using (SHA256 shaM = new SHA256Managed()) 
    { 
     result = shaM.ComputeHash(data); 
    } 

    for (int i = 0; i < result.Length; i++) 
    { 
     hash.Append(result[i].ToString()); 
    } 

    return hash.ToString(); 
} 

public string GetSHA1(string input) 
{ 
    byte[] data, result; 
    StringBuilder hash = new StringBuilder(); 

    data = Encoding.UTF8.GetBytes(input); 
    using (SHA1 shaM = new SHA1Managed()) 
    { 
     result = shaM.ComputeHash(data); 
    } 

    for (int i = 0; i < result.Length; i++) 
    { 
     hash.Append(result[i].ToString()); 
    } 

    return hash.ToString(); 
} 

public string GetMD5(string input) 
{ 
    byte[] data, result; 
    StringBuilder hash = new StringBuilder(); 

    data = Encoding.UTF8.GetBytes(input); 
    using (MD5 shaM = new MD5CryptoServiceProvider()) 
    { 
     result = shaM.ComputeHash(data); 
    } 

    for (int i = 0; i < result.Length; i++) 
    { 
     hash.Append(result[i].ToString()); 
    } 

    return hash.ToString(); 
} 

, но теперь у меня есть несколько вопросов:

  1. хэш-функции, которые должны создать длину выходного затруднительное для любых строк. (независимо от того, какая длина ввода 4 или 10000, выход всегда имеет размер исправления), не так ли? но когда моя длина ввода изменяется, изменения длины вывода тоже !! Я предполагаю, что мои хэш-функции не работают.

  2. , если я хочу сохранить результат в базе данных, мое значение хеш-типа должно быть чем?

  3. какой из хеш-функций обычно используется в веб-приложениях?

спасибо.

ответ

2

В настоящее время вы просто возвращаете десятичное число представление всех байтов, объединенных вместе. Таким образом, {0, 0, 0} заканчивается как «000», тогда как {123, 123, 123} заканчивается как «123123123». Так что да, оба этих хэша будут давать одинаковый выходной размер для любого ввода (SHA-1 даст 20 байт, MD5 даст 16), но ваши представления строк будут в настоящее время меняться по длине.

Я бы рекомендовал использовать либо шестнадцатеричное представление или base64 - в частности, base64 требует гораздо меньше работы:

public string GetSHA1(string input) 
{ 
    byte[] data = Encoding.UTF8.GetBytes(input); 
    using (SHA512 shaM = new SHA512Managed()) 
    { 
     byte[] result = shaM.ComputeHash(data); 
     return Convert.ToBase64String(result); 
    } 
} 

Hex имеет преимущество быть более распространенным способом представления хэши. (. Base64 более обычно используется для транспортировки произвольных двоичных данных, например, изображения) Для гекс, вы можете использовать:

return BitConverter.ToString(result).Replace("-", ""); 

(Обратите внимание, что я объявил локальные переменные - вы по всей видимости, с помощью полей для data и result, что это плохая идея. - называть эти методы не должны влиять на состояние экземпляра, ИМО)

в качестве альтернативы, вы можете просто вернуть byte[] и магазин, который непосредственно в базе данных в виде сгустка. Использование base64 или hex, вероятно, еще проще - проще просмотреть данные таким образом, и, откровенно говоря, проще запросить. Строки проще всего обрабатывать :)

С точки зрения хэша вы должны использовать - я, вероятно, не использовал бы SHA-1 или MD5, если бы не был; Я бы по умолчанию использовал SHA-256, хотя это зависит от того, что вы пытаетесь сделать. Если это хеширование паролей, например, вы, вероятно, хотите получить HMAC некоторого описания - или еще лучше, не сворачивайте свои собственные и не используйте готовый пакет проверки подлинности.

2
  1. Каждый алгоритм хэширования (md5/sha1/etc) имеет свой фиксированный размер;
  2. Не конвертируйте выходной хэш в строку, сохраните его как байт [].
  3. Для того, чтобы сохранить хэш, создать столбец блоб в вашей БД и использовать SqlParameter, чтобы вставить его правильно
1

Обычная практика заключается в преобразовании байтовый массив в хэш-код в кодировке base64, с ToBase64String () Так хранятся пароли. Кодировка base64 представляет собой строку фиксированной длины, учитывая фиксированное количество байтов. Он занимает 4 символа для каждого 3 байта, плюс некоторые дополнения

Смежные вопросы