2016-05-28 5 views
4

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

У меня есть источники для создания хешированной версии пароля, который может быть сохранен в моей базе данных.

public static string hashPasswordGenerator(string password) 
    { 
     System.Security.Cryptography.SHA256Managed crypt = new System.Security.Cryptography.SHA256Managed(); 
     StringBuilder hash = new StringBuilder(); 
     byte[] cry = crypt.ComputeHash(Encoding.UTF8.GetBytes(password), 0, Encoding.UTF8.GetByteCount(password)); 
     return Convert.ToBase64String(cry); 
    } 

Мой пример пользователь User1 с паролем Password1, это возвращает версию хэшированного GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

Мои вопросы:

  1. Является ли это безопасно?
  2. Должен ли я добавить соль к этому? Если да, то кто-нибудь может показать мне простой пример, так как я действительно не понимаю, как его соль сгенерирована так, чтобы каждый раз она соответствовала паролю?
  3. Если у кого-то есть этот метод hashPasswordGenerator, они могут перепроектировать мой пароль?

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

+0

В вашем примере 'StringBuilder hash = new StringBuilder();' никогда не используется. – Ashigore

+0

Возможный дубликат [Является ли SHA-1 безопасным для хранения паролей?] (Http://stackoverflow.com/questions/2772014/is-sha-1-secure-for-password-storage) (SHA-256 и SHA-1 не являются принципиально разными) –

+0

Вы никогда не должны использовать простую хэширующую функцию для хэширования паролей. Вам нужно использовать намеренно медленную функцию хеширования, такую ​​как PBKDF2, bcrypt, scrypt и Argon2. Подробнее: [Как безопасно использовать хэш-пароли?] (Http://security.stackexchange.com/q/211/45523) –

ответ

4

Безопасен?

Не совсем, если вы просто используете SHA2 без соли. (не сказать, что SHA2 можно легко перевернуть)

Должен ли я добавить соль к этому?

Да.

Если так кто-то может показать мне простой пример

Используйте RNGCryptoServiceProvider:

RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); 
var salt = new byte[32]; 
rngCsp.GetBytes(salt); // this will fill the buffer with random values 

как я не очень понимаю, как соль она породила так, что она будет соответствовать пароль каждый раз

Вы необходимо сохранить соль (которая должна быть уникальной для каждого пароля) вместе с хешей (пароль + соль).

Если у кого-то есть этот метод hashPasswordGenerator, они могут перепроектировать мой пароль?

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

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

+1

Большое спасибо за ваш ответ. Хорошо, так что соль, как я должен хранить это, в отдельном поле или в том же поле. В примере на PBLDF2 есть 'Convert.ToBase64String (соль) +" | " + Convert.ToBase64String (hash) 'так ли это строка с разделителями в трубе? – user3284707

+0

Вы можете сохранить его в отдельном поле, так как его будет легче читать без необходимости синтаксического анализа строки. – Nasreddine

+0

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

2

Безопасен?

Да, это так, и нет, это не так. Вопрос должен быть «Является ли это достаточно безопасным для моих требований?», На что вы можете ответить только.

Должен ли я добавить соль к этому?

Да, вы должны.

Если у кого-то есть этот метод hashPasswordGenerator, они могут перепроектировать мой пароль?

Нет, они не могли. В худшем случае они укажут их в правильном направлении для грубой силы.

Проблема с вашим решением заключается в том, что его слишком легко взломать.

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

Во-вторых, SHA256 Слишком быстро, чтобы быть хорошим при создании безопасных хэшей паролей. Вы должны использовать bcrypt или подобное, где вы можете контролировать количество раундов, чтобы генерировать хеш-генерация «медленно». Причина, по которой вы хотите, чтобы она была медленной, заключается в том, что вашему приложению нужно генерировать только один хэш за один раз, поэтому его не имеет большого значения, если вычислительно требуется в 10000 раз больше времени генерации, чем при использовании SHA256, но хакеру нужно генерировать миллиарды хешей. Так что сделать это в 10000 раз больше для него - это огромная сделка.

+0

Большое спасибо за ваш ответ, я взглянул на PBKDF2, как было предложено добавить итерации. Хотя я все еще смущен солью. Если пользователь может заполучить пароль, они также не смогут схватить соль? – user3284707

+0

@ user3284707 Да, но это значительно замедлит атаку грубой силы. – Nasreddine

+0

@ user3284707 В этой статье в википедии есть более подробная информация о [how] (https://en.wikipedia.org/wiki/Salt_ (криптография)) (объяснение не может соответствовать комментарию переполнения стека). – Nasreddine

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

  • Нет связанных вопросов^_^