【PHP】base64encode、decodeの仕組み、使い方を解説

PHP

base64とは

base64というのは、簡単に説明すると「日本語、画像、動画ファイルなどの特殊な文字列に対応していないものでも使えるようにする」ためのものです。

もう少し正しい言い方をすると「マルチバイト文字(日本語等)やバイナリデータ(画像データ等)をA-Z a-z 0-9 と+と/の二つの記号だけの文字の状態です。」

また、この変換を行うと、前のデータ量が約1/3(三分の一)程大きくなります。

PHPでの変換方法

文字列→base64

通常の文字列をPHPでbase64に変換(エンコード)する関数はこちらです。

  • base64_encode( 文字列 )

「文字列」の場所に文字列を直接または変数を入れることでエンコードされた値が返されます。

サンプル:

$text="base64エンコードするテキスト";
//base64エンコード
$encode=base64_encode($text);
//エンコード結果を出力
echo $encode;

結果はこのようになります。

[ YmFzZTY044Ko44Oz44Kz44O844OJ44GZ44KL44OG44Kt44K544OI ]

このように、すべての文字がエンコードされているのが分かります。

では、この文字列を元に戻すにはどうすればいいのでしょうか。

base64→元の文字列

base64エンコードした文字列を元に戻すには、別の関数を利用します。

それは、

  • base64_decode( 文字列 )

です。この関数を使用することでbase64に変換された文字列を元の文字列に変換(デコード)することができます。サンプルコードはこちらです。

$text="YmFzZTY044Ko44Oz44Kz44O844OJ44GZ44KL44OG44Kt44K544OI";
$decode=base64_decode($text);
//デコード結果を出力
echo $decode;

結果はこのようになります。

[ base64エンコードするテキスト ]

base64へ変換する主な利用パターン

PHPのbase64encode、decodeは、主に次のような時に利用します。

  • 画像ファイルをテキストで保存したい場合
  • アップロードされた画像データをbase64エンコードして直接表示させる場合
  • 文字列の暗号化などでバイナリデータをデータベースなどに保存する場合
  • URLのGET(パラメータ)などで日本語などを送信する際

また、これ以外にもPHP以外など様々な場面でも利用するため、覚えておくのが何よりです。

ですが、次の点を忘れないようにしましょう。

base64の注意点

base64encodeなどを利用していて、覚えておきたいことがいくつかありますので、簡単に紹介していきます。

base64には「記号」が含まれる

base64encodeは、記号(+と/)が含まれます。なので、URLにbase64したデータで直接送信すると、サーバー側やブラウザ側が誤認識してしまい、正常に動作しない場合があります。記号のみを別の値に変換するなど、別の対応が必要です。

base64encodeをすることでデータ量が増加する

よくありがちなパターンですが、暗号化したデータをより強力にしようとしたりなどで、base64encodeを大量に実行することがあるかもしれません。

ですが、base64エンコードはするたびにデータの33%以上増えます。

例えば、9文字(半角)の文字列をエンコードすると約12文字になります。つまり3文字増えたことになります。そしてその12文字をさらにエンコードすると何文字になるのでしょうか。

単純に考えると3文字ずつ増えていくのかな?なんて思ってしまいますが、実行するたびに文字列が増えるので、3文字増える→4文字増えるのように、どんどん膨れ上がってしまうのです。

つまり、12文字をエンコードすると、15文字ではなく、16文字になるのです。

そのため、PHPの処理ができなくなり、エラーになってしまうことがあります。

なので、暗号化したデータをより強力にする目的では利用できないのが目に見えます。先ほど述べたように、base64encodeは記号は2つのみのため、base64形式ということがすぐにわかります。

ですが、暗号化した文字列をbase64encodeし、再度暗号化するなど、工夫をすればとても使い道があります。

最後に

base64は、メリットもデメリットも半々にあります。必要な時に、必要なだけ利用することが大切です。