Nano Hash - криптовалюты, майнинг, программирование

PHP x==x, но если оператор говорит x!=x

У меня есть checklogin.php:

<?php

$host="localhost"; // Host name 
$username="user"; // Mysql username 
$password="pass"; // Mysql password 
$db_name="database1"; // Database name 
$tbl_name="users"; // Table name 
$lastLogDate=date("l, m/d/y, h:i:sa");
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

$sql="SELECT password FROM $tbl_name WHERE username='$myusername'";
$result=mysql_query($sql);
$realpassword=mysql_result($result, 0);

define("ENCRYPTION_KEY", "!@#$%^&*");
function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}
$realpassword=decrypt($realpassword, ENCRYPTION_KEY);

if ($mypassword == $realpassword) {
session_register("myusername");
session_register("mypassword"); 
session_register("userid");
session_register("finalemail");
$sqldate="UPDATE userdata SET lastLog = '$lastLogDate' WHERE username = '$myusername'";
$resultdate=mysql_query($sqldate);
header("location:/home");
}
else {
echo "Wrong Username or Password<br>";

}
?>

Когда кто-то входит в систему с помощью login.php, и введенный им пароль совпадает с паролем в базе данных после расшифровки, он все еще говорит «неверное имя пользователя или пароль». Я добавил эхо, чтобы проверить, работает ли расшифровка, но оно вернулось правильно. Я создал новую учетную запись и попытался войти с ней, и это сработало. Это не работает только с учетными записями до того, как я добавил шифрование, и я просто сам зашифровал пароли. Может в этом проблема?


  • Не храните пароли в базе данных в обратимой форме. Для этого используется хеширование. 11.05.2015
  • Я не думаю, что это проблема. После этого я создал новую учетную запись, и это сработало отлично. Может быть, это потому, что я вручную зашифровал пароли учетных записей, созданных ранее? 11.05.2015
  • лучший вариант - запросить ваши данные из бэкэнда, а затем сравнить результаты с вашим интерфейсом. Я могу предположить, что предыдущие данные/пароли хэшируются, а новые пароли, которые вы сравнивали, - нет. 11.05.2015
  • Это не то, что вызывает вашу проблему, это общая проблема безопасности. Пароли должны быть хешированы, а не зашифрованы. Хэш означает необратимое (одностороннее), шифрование обратимое (двустороннее). Вы хэшируете данный пароль с уникальной солью пользователя, и этот хэш должен совпадать с тем, что хранится в базе данных. 11.05.2015
  • Где ты взял этот код? mysql_*() устарел и будет удален в следующем выпуске PHP. session_register() объявлен устаревшим и уже удален в PHP 5.4. 11.05.2015
  • Вы предварительно обрабатываете пароль пользователя, в том числе экранируете его с помощью mysql_real_escape_string(). Затем вы сравниваете экранированную версию пароля с расшифрованной версией, которая на данном этапе не экранирована, поэтому неудивительно, что они не совпадают. Если PHP говорит, что переменные не совпадают, то можно поспорить, что это не так. Попробуйте использовать var_dump() для обеих переменных непосредственно перед их сравнением и посмотрите, какие значения у вас есть на самом деле. 11.05.2015
  • Итак, я попробовал то, что вы сказали. Я var_dump отредактировал его, и он сказал, что они оба одинаковы, насколько я мог судить, что пароль и пароль одинаковы... Я попробовал mysql_real_escape_string на $realpassword, но это просто все испортило. 11.05.2015

Ответы:


1

Ваша проблема двояка.

Во-первых, mcrypt дополняет ваши данные завершающими нулевыми байтами перед кодированием (если вы не применяете заполнение самостоятельно, например, PKCS7); после декодирования вам нужно удалить эти нулевые байты:

$realpassword = rtrim($realpassword, "\0");

Во-вторых, вы не должны использовать шифрование для паролей; вместо этого используйте API для хеширования паролей; см. этот ответ для примера.

11.05.2015
  • @ k97513 Пожалуйста; проверьте мой предыдущий ответ по этому вопросу для пример использования хеширования пароля. 11.05.2015
  • @ k97513 k97513 Кроме того, как уже упоминалось islq, вам не следует экранировать $mypassword, потому что вы всегда должны сравнивать с заданным значением. 11.05.2015

  • 2

    возможно, старый пароль затронут этим преобразованием:

    $mypassword = stripslashes($mypassword);
    $mypassword = mysql_real_escape_string($mypassword);
    
    11.05.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..