1

私はopensslを使用してテキストを暗号化し、これをmysqlデータベースに配置します。これは正常に機能しますが、長いテキストを使用すると、復号化されたテキストが破損します。

個人的には、これはmysqlがこのテキストをデータベースに保存する方法によるものだと思います。暗号化されたテキストには英数字ではない文字がたくさんあります。しかし、それについてはよくわかりません。また、mysqlでどの照合を使用するかわかりません。現在、* utf8_unicode_ci *に設定していますが、それでもデータが破損しています。

ライブの例はここで見ることができます:http://todolist.x10.mx

Username: example
Password: password

破損したデータを表示するには、をクリックしますDownload Backup

もちろん、コードの下に$encryptedデータベースに保存されます。このコードはデータベースがなくても正常に機能します。

<?php
  $source = 'very long text';
  $iv = "1234567812345678";
  $pass = 'difficultpassphrase';
  $method = 'aes-256-ofb';

  $encrypted = openssl_encrypt ($source, $method, $pass, true, $iv);  
  echo $encrypted;

  $decrypted = openssl_decrypt ($encrypted, $method, $pass, true, $iv);
  echo $decrypted;
?>

時間と専門知識をよろしくお願いします。

4

1 に答える 1

0

暗号化されたコンテンツをバイナリ形式で保存する場合、エンコーディングで文字型を使用することはできません。これは、エンコーディングによってデータが「壊れる」可能性が非常に高いためです。

代わりに、BINARY または VARBINARYデータ型を使用する必要があります。これらは、バイナリ データを格納する目的で正確に作成されています。

もう 1 つの方法は、データを文字データ型に格納する前にbase64_encodeし、データベースからフェッチしたときにデータをbase64_decodeすることです。これにより、暗号化されたデータを varchar/char データ型に格納できるようにデータがエンコードされます (ただし、データが少し長くなるので注意してください)。

于 2012-09-29T17:54:16.667 に答える