На моем веб-сайте есть страница, где клиенты могут хранить пароль для использования в приложениях, которые они покупают (обычно один пароль для всех приложений для их удобства). Пароль хешируется с помощью 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, получает hashFromDb и пытается проверить введенный пароль с помощью BCryptHelper
учебный класс:
BCryptHelper.CheckPassword(passwordbox.Password, hashFromDb)
Тем не менее он возвращает код ошибки:
Произошло необработанное исключение типа «System.ArgumentException» в DevOne.Security.Cryptography.BCrypt.dll
Дополнительная информация: недействительный пересмотр соли
Правильный ли способ проверки введенного пользователем пароля в приложении WPF по хешу зашифрованного PHP-пароля?
От 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 есть хорошая информация о том, почему это происходит
расширяет метод
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
прохладно