Могу ли я расшифровать пароль с помощью c #, который был зашифрован с помощью PASSWORD_BCRYPT в php? - PullRequest
2 голосов
/ 01 июня 2019

Я не уверен, что смогу расшифровать пароли с помощью c #, которые я сохранил в базе данных mysql. Я зашифровал эти пароли в php, используя PASSWORD_BCRYPT. И если это возможно, как я могу это сделать? Извините, но я новичок, и я не нашел никакой помощи в Интернете. Это фрагмент кода, который я использовал для шифрования своих паролей.

$passwort = $con->real_escape_string($_POST['passwort']);
$hash = password_hash($passwort, PASSWORD_BCRYPT);

После прочтения комментариев я пытался сделать это в c #, но он всегда говорит неправильный пароль

string email = textBox1.Text;
        string password = textBox2.Text;
        string passwordHash = BCrypt.Net.BCrypt.HashPassword(password);
        MessageBox.Show(passwordHash);
        MySqlConnection conn = new MySqlConnection("datasource=127.0.0.1;port=3306;username=root;password=CIAO6CIAO6;database=kontoprogramm");
        int i = 0;
        conn.Open();
        MySqlCommand cmd = new MySqlCommand("select KLPPassword from tklassenlehrpersonen where KLPEmail = '" + email + "' and KLPPassword = '" + passwordHash + "'", conn);
        cmd.ExecuteNonQuery();
        DataTable dt = new DataTable();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        da.Fill(dt);
        i = Convert.ToInt32(dt.Rows.Count.ToString());
        if (i == 0)
        {
            MessageBox.Show("Falsche Email oder Kennwort!");
        }
        else
        {
            MessageBox.Show("Angemeldet!");
        }

Может кто-нибудь помочь мне?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вы не можете искать хеш в базе данных из-за соли, вместо этого ищите только по имени пользователя и принимайте сохраненный хеш для проверки. Этот ответ показывает, как это сделать в PHP, хотя принцип тот же.

И не выходите из пользовательского ввода перед вызовом password_hash(), это вызывает проблемы.

0 голосов
/ 02 июня 2019

Прежде всего, вы не можете расшифровать, только если вы попытаетесь устранить неполадки и взломать расшифровку пароля, например, с помощью Brute Force техники и т. Д., Потому что в результате в результате PHP с помощью функции password_hash генерируется хешпароль, результат хеширования.По основной концепции хеширования не может быть обратимым, но сопоставимым.

Вы можете сравнить хэши паролей, используя функцию PHP password_verify (сравнение сохраненного хэша из базы данных с введенным паролем из вашего приложения C #),Если ваше требование действительно расшифровано, необходимо изменить фокус вашего поста, переосмыслить поиск и устранение неисправностей и взломать расшифровку пароля, например, используя метод Brute Force и т. Д.

Теперьдавайте перейдем к решению: у вас есть два способа:

a) Создать PHP WebService, параметризованный с «Clear Text» в качестве входного параметра, и получить результат вывода в виде зашифрованного текстового пароля;ядро веб-службы (в PHP) использует для шифрования параметр password_hash с параметром PASSWORD_BCRYPT.После этого ваш код C # использует зашифрованные данные и сравнивает этот выходной хэш с сохраненным хешем из базы данных;однако эта альтернатива требует больших усилий для обеспечения безопасности на уровнях WebServer и WebService.Например, ваш код C #, использующий эту веб-службу PHP, показан ниже:

WebClient webclient = new WebClient();
webclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webclient_DownloadStringCompleted);
webclient.DownloadStringAsync(new Uri("http://ws.phpurl.com/?password=stackoverflow@12345"));

void webclient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    string phpWsEncryptedPass = e.Result;
    string databaseEncryptedPass = //TO DO: query Database
                                   //using WHERE statement,
                                   //parsing 'phpWsEncryptedPass' as parameter;
}

b) ИЛИ , скачайте двоичные файлы соответствующей версии PHP для Windowsчто вы работаете над ними, разбирайтесь в этих методах DLL с помощью приложения DLL Reflector (например, dotPeek ) и используйте функции C # Interop для импорта DLL, которые имеют password_hash и password_verify , чтобы использовать это в своем коде C #;вам нужно приложить усилия, чтобы открыть DLL, чтобы получить правильное объявление методов.Примечание: этот способ рекомендуется, поскольку ядро ​​PHP, написанное на C / C ++ и код C #, может потреблять DLL PHP для двоичных файлов Windows, этот код ниже имеет пример для этого:

    [DllImport(@"C:\ProgramFiles\PHP\php_mbstring.dll", CharSet = CharSet.Unicode)]
    internal static extern IntPtr password_hash(string clearTextpassword, int option)

    [DllImport(@"C:\ProgramFiles\PHP\php_mbstring.dll", CharSet = CharSet.Unicode)]
    internal static extern bool password_verify(string clearTextpassword, string hash)

Вот и все.

...