Я храню чувствительную 16-символьную строку пользователя в таблице MySQL через функции PDO в PHP5.У меня есть пара встроенных функций шифрования / дешифрования следующим образом:
function encrypt($in)
{
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,ENCRYPT_KEY, $in, MCRYPT_MODE_ECB, $iv);
return $enc;
}
function decrypt($in)
{
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256,ENCRYPT_KEY, $in, MCRYPT_MODE_ECB, $iv);
return $dec;
}
Где ENCRYPT_KEY - ранее определенная глобальная константа.
Я сначала зашифровал () строку, затем вставил запись в назначенную таблицу.Время от времени мне нужно циклически просматривать эту информацию с помощью инструкции SELECT, а затем расшифровывать () результаты для обработки.
Теперь это происходит идеально для каждого случая , за исключением одного .
В цикле выбора / дешифрования одна (и только) запись из приблизительно 50 расшифровывает как gobbledy-goop.Я не вижу ничего плохого в функциях encrypt () и decrypt () и неоднократно вставлял соответствующую запись с одинаковыми результатами.Звонок, как показано ниже:
echo decrypt(encrypt($string));
Работает нормально.Поэтому единственное, что я придумал, - это то, что MySQL не может правильно хранить зашифрованную версию этой конкретной строки , но я не знаю, почему.Функция хранения выглядит следующим образом:
function update_sensitive_details($sensitive)
{
$this->store_sensitive = encrypt($sensitive);
try
{
$sql = "UPDATE table SET store_sensitive = ? WHERE (id = ?);";
$sth = $this->registry->db->prepare($sql);
$sth->execute(array($this->store_sensitive,$this->id));
}
catch (PDOException $p)
{
log_error($p);
return false;
}
return true;
}
Это не приводит к каким-либо ошибкам, и я могу подтвердить, что это фактически обновляет таблицу данными (хотя, поскольку она зашифрована, ее невозможно разобрать при просмотре вphpMyAdmin.
У кого-нибудь есть идеи о том, что здесь может происходить? Я в тупике. Единственное, о чем я могу думать, это то, что конкретная зашифрованная строка не хранится должным образом в MySQL, так какизменение одного из шестнадцати символов устраняет проблему. Я бы подумал, что это будет предотвращено PDO, но, возможно, нет.