Проверьте пароль, зашифрованный в php приложением C #

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

if ( $app_pass != '' ){
$mysalt= mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$options = [ 'cost' => 10, 'salt' => $mysalt,];
$app_pass = password_hash( $app_pass, PASSWORD_BCRYPT, $options );
}
  • где $app_pass в if заявление является простым текстом
  • позже становится зашифрованным хешем
  • и этот хеш затем сохраняется в базе данных MySQL

Когда клиенты запускают купленное приложение на своем ПК, вводят логин и пароль, приложение подключается к базе данных MySQL, получает hashFromDb и пытается проверить введенный пароль с помощью BCryptHelper учебный класс:

BCryptHelper.CheckPassword(passwordbox.Password, hashFromDb)

Тем не менее он возвращает код ошибки:

Произошло необработанное исключение типа «System.ArgumentException» в DevOne.Security.Cryptography.BCrypt.dll

Дополнительная информация: недействительный пересмотр соли

Правильный ли способ проверки введенного пользователем пароля в приложении WPF по хешу зашифрованного PHP-пароля?

1

Решение

От BCrypt исходный код, System.ArgumentException выбрасывается этой логикой:

  if (salt[1] != '$') {
minor = salt[2];
if (minor != 'a' || salt[3] != '$') {
throw new ArgumentException("Invalid salt revision");
}

Таким образом, создается впечатление, что исключение выдается, потому что хэш не имеет формат, который BCrypt поддерживает.

Из документов PHP, password_hash с PASSWORD_BCRYPT Аргумент возвращает хеш, который начинается с $2y$, в то время как BCrypt реализация используется C# ожидает тот, который начинается с $2a$,

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

РЕДАКТИРОВАТЬ: эта тема Github есть хорошая информация о том, почему это происходит

0

Другие решения

расширяет метод

static class ExtentionMetsodString
{
public static string ReplaceAt(this string str,int startIdx , string replaceStr)
{
StringBuilder strBuilder = new StringBuilder(str);
int length = replaceStr.Length;

strBuilder.Remove(startIdx, length);
strBuilder.Insert(startIdx, replaceStr);
return strBuilder.ToString();
}
}

использование

string test = "0123456";
string output = test.ReplaceAt(2, "ab"); // ouput : 01ab456

прохладно

0

По вопросам рекламы [email protected]