2016-06-10 2 views
0

Я использую CryptSharp Library в своем .NET (C#) клиенте для хэширования пароля пользователя со случайно генерируемой солью (Blowfish).Хеширование со случайной солью в C#?

Затем я отправляю хешированный пароль на мой удаленный сервер, где он хранится в базе данных MySQL.

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

Я не хочу отправлять незашифрованный текстовый пароль на мой PHP-конец, как я могу достичь этого, не используя статическую соль?

хеширование (C#):

string passHash = Crypter.Blowfish.Crypt(Password.Text, Crypter.Blowfish.GenerateSalt()); 

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

+0

Почему вы используете Blowfish? Существуют и другие более простые способы генерации хэшей непосредственно из .NET framework. Итак, есть ли какая-то конкретная причина, почему вы используете Blowfish? –

+0

Если не Bcrypt (Blowfish), что бы вы порекомендовали? – user1954141

+0

Используйте SHA1Установленный из .NET framework, см. Ответ ниже –

ответ

0

Ответ довольно прост и связанных с ООН на используемом языке:

  1. Если вы хотите, чтобы сервер для хранения хеширования паролей в базе данных, вы можете хранить их с любой функцией хеширования (I» d рекомендуем SHA256 или BCrypt, если вы хотите, чтобы принудительное принудительное использование занимало больше времени. Преимущество BCrypt - это соль, и количество итераций сохраняется в хеше напрямую, поэтому в вашей базе данных не требуется дополнительный столбец).

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

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

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

0

Вы можете использовать это:

var result = string.Empty; 
using (var sha1 = new SHA1Managed()) 
{ 
    result = ToHex(sha1.ComputeHash(Encoding.ASCII.GetBytes(Password.Text))); 
} 

Где ToHex выглядит следующим образом:

public static string ToHex(byte[] bytes) 
{ 
    return string.Concat(bytes.Select(b => b.ToString("X2"))); 
} 

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

Существуют и другие более безопасные версии алгоритма SHA, поддерживаемые в платформе .NET, такие как SHA256Managed. Использование SHA1 или SHA256 зависит от ваших требований безопасности.

+0

Это чрезвычайно опасный способ хранения паролей, и не имеет значения для хеша, и не существует итераций для управления необходимым временем для хэширования. Такие хеши могут быть слишком грубыми способами (около 5 гига/сек). – martinstoeckli

0

Целью зашифрованного пароля является безопасное сохранение пароля в базе данных. CryptSharp не поможет вам обеспечить передачу по кабелю.

Существует несколько подходов, которые вы могли бы предпринять, но самым легким, возможно, является связь с сервером через SSL.Если вы не хотите использовать открытый ЦС, используйте самозаверяющий сертификат и зацепите ServicePointManager.ServerCertificateValidationCallback, чтобы принять свой собственный сертификат или сертификат.

0

Чтобы передать пароль от клиента на сервер, необходимо зашифрованное соединение HTTPS/SSL. Он будет шифровать вход пользователя перед отправкой его клиенту, поэтому ManInTheMiddle не сможет подслушивать. Хеширование должно выполняться на стороне сервера, по крайней мере, часть хеширования.

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

Другая библиотека Я могу порекомендовать BCrypt.Net, там соль также хранится вместе с хэш (без необходимости дополнительного поля) и проверка очень проста: BCrypt.Verify(password, stored_hash)

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