Моя таблица SQL содержит два типа данных, используемых для входа в систему. Первый - это электронная почта (в таблице с именем standard_name), а второй - пароль.Поскольку электронные письма шифруются AES с использованием ключа и IV (AES-256-CBC), нет никакой вероятности того, что зашифрованная электронная почта в файле PHP будет такой же, как электронная почта, зашифрованная в прошлом в базе данных (поскольку созданная для шифрования IVникогда не повторяется. Вот почему я хэширую пароль с md5. Поскольку хэш md5 всегда один и тот же, я могу запросить таблицу базы данных, используя пароль, введенный пользователем. Но что, если у определенных пользователей один и тот же пароль. Поэтому вход в систему только с паролемзапрос может вызвать проблемы для пользователей. Когда я понял, что создал код, который при первых запросах базы данных с использованием хэшированного пароля md5 проверяет, соответствует ли электронная почта, введенная пользователем, дешифрованному письму из базы данных, и если нет, то запрашивает базу данных в другой раз, но это предполагаетсячтобы получить только те записи, которые уже не имеют электронной почты, по сравнению с введенной пользователем. И есть проблема. Я не знаю, каким должен быть $ query5. Кто-нибудь может мне сказать? Или, может быть, есть гораздо более простой способ справиться с ведением журналав то время как электронная почташифруется с помощью AES.Вот мой код:
$lname = mysqli_real_escape_string($connect, $_POST['email']);
$password2 = mysqli_real_escape_string($connect, $_POST['password']);
function pad($data, $size) {
$length = $size - strlen($data) % $size;
return $data . str_repeat(chr($length), $length);
}
function unpad($data) {
return substr($data, 0, -ord($data[strlen($data) - 1]));
}
function encrypt($data) {
$key = "SiadajerSiadajer";
$iv_size = 16;
$iv = openssl_random_pseudo_bytes($iv_size, $strong);
$encryptedData = openssl_encrypt(pad($data, 16), 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
$joinedData = hex2bin(bin2hex($iv).bin2hex($encryptedData));
$encodedJoinedData = base64_encode($joinedData);
return $encodedJoinedData."\n";
}
function encrypt2($data) {
$hashed = md5($data);
return $hashed;
}
$password2 = encrypt2($password2);
echo $password2;
echo $lname;
$stmt3 = mysqli_stmt_init($connect);
$query4 = "
SELECT standard_name FROM standard
WHERE standard_password = ?
";
if(!mysqli_stmt_prepare($stmt3, $query4)){
echo "Failed to authenticate";
} else {
mysqli_stmt_bind_param($stmt3, "s", $password2);
mysqli_stmt_execute($stmt3);
$result = mysqli_stmt_get_result($stmt3); }
while($row = mysqli_fetch_object($result)){
$email = $row->standard_name;
}
$emaildecrypted = decrypt($email);
if($emaildecrypted === $lname){
echo "authentication successful"
} else {
$stmt4 = mysqli_stmt_init($connect);
$query5 = "
SELECT standard_name FROM standard
WHERE standard_password = ? BUT NOT WHERE standard_name = ?
";
if(!mysqli_stmt_prepare($stmt4, $query5)){
echo "Failed to authenticate";
} else {
mysqli_stmt_bind_param($stmt4, "ss", $password2, $email);
mysqli_stmt_execute($stmt4);
$result = mysqli_stmt_get_result($stmt4); }
while($row = mysqli_fetch_object($result)){
$email2 = $row->standard_name;
}
}
$emaildecrypted2 = decrypt($email2);
if($emaildecrypted === $lname){
echo "authentication successful"
}