Вопрос: Хэш-алгоритм 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, они могут перепроектировать мой пароль?

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


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 метод может ли они перепроектировать мой пароль?

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

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


4



Это безопасно?

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

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

Да, ты должен.

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

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

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

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

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


2