Я храню конфиденциальную информацию в базе данных mysql в формате текстового поля, которое шифруется с использованием openssl_public шифрования и расшифровывается с использованием openssl_private_decrypt.
Однако проблема, с которой я сталкиваюсь, заключается в том, что при попытке использовать мой php-скрипт для «декодирования» текста возвращаемое значение содержит несколько апострофов и цитат, поэтому дешифрование невозможно. Есть идеи как это исправить?
Примечание. Сначала я пытался сохранить информацию в поле типа «varbinary», но расшифровка каждый раз приводила к отказу.
Просмотрев еще несколько, я думаю, что php и mysql трудно обрабатывать всю информацию (~ 800 записей), потому что иногда поля остаются пустыми, а иногда нет. Если я сохраняю одну за другой, это работает с нулевыми проблемами, но при попытке выполнить цикл foreach почти всегда вызывает ошибки. Есть идеи? Скрипт для кодирования ниже:
<?php
$publickey = file_get_contents("certificate.pem");
function encrypt($text)
{
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
try {
$db = new PDO('mysql:host=localhost;dbname=DBNAME', 'USER', 'PW');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$start = microtime(true);
$stmt = $db->prepare("SELECT ID, ITEM1_old, ITEM2_old FROM tablename");
$stmt->execute();
$rows = $stmt->fetchAll();
foreach($rows as $row) {
$id = $row['0'];
$item1 = $row['1'];
$item2 = $row['2'];
define('SALT', $id);
$item1_enc = encrypt($item1);
$item2_enc = encrypt($item2);
openssl_public_encrypt($item1_enc, $item1_ssl_enc, $publickey);
openssl_public_encrypt($item2_enc, $item2_ssl_enc, $publickey);
$stmt2 = $db->prepare("UPDATE tablename SET ITEM1_new=?, ITEM2_new=? WHERE ID=?");
$stmt2->execute(array($item1_ssl_enc, $item2_ssl_enc, $id));
}
$db->commit();
$db->NULL;
$elapsed = microtime(true) - $start;
echo "Finished.<br />Elapsed time: ".$elapsed;
}
catch (PDOException $e)
{
$db->rollback();
echo "There was a system error.".$e->getMessage();
}
?>