Я строю простую систему входа в систему, используя расширение mCrypt PHP. Я не уверен, что это лучший способ сделать это, но мой код приведен ниже:
<?php
session_start();
require_once('classes/Crypt.class.php');
date_default_timezone_set("America/New_York");
$_SESSION['loggedIn'] = false;
$encryption = new Crypt();
if (!empty($_POST['loginNow'])) {
$dateCompleted = date("Y-m-d");
$birthday = $_POST['birthdayYear'] . "-" . $_POST['birthdayMonth'] . "-" . $_POST['birthdayDay'];
//Connect to SQL
$dbhandle = new PDO("mysql:host=mysql.domain.com;dbname=database", "admin", "pass");
$dbhandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//prepare data for select
$sql = "SELECT `email-address`,`password`,`iv` FROM `users` WHERE `email-address` = '" . $_POST['emailAddress'] . "';";
$stmt = $dbhandle->prepare($sql);
//Execute
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_BOTH);
if ($row['email-address']) {
$decryptPassword = $encryption->decrypt($row['password'],$row['iv']);
if ("123" == "123") {
$_SESSION['loggedIn'] = true;
header("Location: profile.php");
exit();
} else {
$_SESSION['loggedIn'] = false;
header("Location: login.php?error=incorrectLogin");
exit();
}
} else {
$newEncrypted = $encryption->encrypt($_POST['password']);
$newIV = substr($newEncrypted, 0, 32);
$newCryptPassword = substr($newEncrypted, 32);
//Put form results into an array
$data = array($_POST['firstName'],$_POST['lastName'],$_POST['emailAddress'],$newCryptPassword,$newIV,$birthday,$dateCompleted);
//prepare data for insert
$stmt2 = $dbhandle->prepare("INSERT INTO users (`first-name`,`last-name`,`email-address`,`password`,`iv`,`birthday`,`date-completed`)
values (?, ?, ?, ?, ?, ?, ?)");
//execute query
$stmt2->execute($data);
$_SESSION['loggedIn'] = true;
header("Location: profile.php");
exit();
}
}
?>
Класс склепа:
<?php
class Crypt
{
private $secretKey;
public function __construct()
{
$this->secretKey = MD5('super secret key');
}
public function encrypt($data)
{
$m = mcrypt_module_open('rijndael-256', '', 'cbc', '');
$ivSize = mcrypt_get_iv_size('rijndael-256', 'cbc');
//Create the IV
$iv = mcrypt_create_iv ($ivSize, MCRYPT_DEV_RANDOM);
//Initialize the encrpytion
mcrypt_generic_init ($m, $this->secretKey, $iv);
//Encrypt the data
$encryptedData = mcrypt_generic($m, $data);
//Close mCrypt
mcrypt_generic_deinit($m);
mcrypt_module_close($m);
return $iv.$encryptedData;
}
public function decrypt($data,$iv)
{
//Open the Cipher
$m = mcrypt_module_open('rijndael-256', '', 'cbc', '');
//Initialize the Decryption
mcrypt_generic_init($m, $this->secretKey, $iv);
//Decrypt the Password
$decryptedData = mdecrypt_generic($m, $data);
//Close mCrypt
mcrypt_generic_deinit($m);
mcrypt_module_close($m);
return $decryptedData;
}
}
?>
В операторе If, который проверяет, равняется ли расшифрованный пароль значению переменных пароля $ _POST, он никогда не выполняется для исправления. Даже если я проверяю значение расшифрованных паролей через его отображение, оно всегда совпадает со значением переменных $ _POST password.
Я думал, что это может быть потому, что это не строка, хотя я использую оператор сравнения «==», а не «===», поэтому я преобразовал расшифрованный пароль в строку. Все те же результаты.
Я сделал некоторые изменения на основе комментариев. Все еще не работает. Я изменил оператор if, чтобы спросить, если 123 = 123, по-прежнему не работает. Я должен делать что-то не так. Вот что сейчас происходит:
$decryptPassword
123
$_POST['password']
123
gettype($decryptPassword)
строка
gettype($_POST['password']
строка
$decryptPassword == $_POST['password']
BOOL (ложь)
Задача ещё не решена.
Других решений пока нет …