Почему PHP / MySQL выборочно завершится неудачно при дешифровании одной конкретной строки AES? - PullRequest
4 голосов
/ 16 мая 2011

Я храню чувствительную 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, но, возможно, нет.

1 Ответ

4 голосов
/ 16 мая 2011

Попробуйте обернуть зашифрованные данные с помощью base64_encode (), а затем base64_decode () перед расшифровкой.В некоторых случаях у меня были повреждены данные в MySQL, и это всегда исправляло.

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);
    $enc = base64_encode($enc);
    return $enc;
}

function decrypt($in)
{
    $in = base64_decode($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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...