Je stocke des informations sensibles dans une base de données mysql au format champ 'texte' qui est crypté en utilisant openssl_public encrypt et qui est chiffré en utilisant openssl_private_decrypt. Le problème auquel je suis confronté est cependant que lorsque j'essaie d'utiliser mon script php pour 'décoder' le texte, la valeur renvoyée a plusieurs apostrophes et citations, rendant le déchiffrement impossible. Une idée de comment réparer ça?Déchiffrer avec openssl_private_decrypt ne marche pas parce que le texte stocke des apostrophes
Remarque: J'ai d'abord essayé de stocker mes informations dans le type de champ 'varbinary' mais le décryptage a échoué à chaque fois. Après avoir passé en revue un peu plus, je pense que php et mysql ont du mal à traiter toutes les informations (~ 800 enregistrements) car parfois les champs sont laissés vides, d'autres fois non. Si je stocke un par un, cela ne pose aucun problème, mais lorsque j'essaie de parcourir la boucle foreach, cela provoque presque toujours des erreurs. Des idées? Script encode est inférieure à:
<?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();
}
?>
Je ne pense pas que cela ait quelque chose à voir avec les guillemets. Ces fonctions ne les traitent pas différemment des autres caractères. Peut-être un exemple de code et un message d'erreur réel ou une meilleure description du problème aiderait. Faites-vous quelque chose à ces chaînes autres que l'utilisation de openssl_public_encrypt et openssl_private_decrypt sur eux? –
@Dan - il n'y a pas de message d'erreur sur la page ou dans le journal des erreurs apache. Je vais mettre en place une version modifiée du script, mais les contrôles et les équilibres globaux dans la page est de près de 600 lignes. Je vais résumer. – JM4
Certains enregistrements sont même ignorés COMPLETEMENT pour ITEM1 lors de l'exécution de la boucle foreach alors que ITEM2 pour le même enregistrement n'est pas – JM4