Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】sodium_base642bin()関数の使い方

sodium_base642bin関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

sodium_base642bin関数は、Base64形式でエンコードされた文字列を、元のバイナリデータにデコードする処理を実行する関数です。Base64とは、画像ファイルや暗号化されたデータといったバイナリデータを、テキストとして安全に表現するためのエンコード方式の一つで、主にWeb通信やメールなどでデータをやり取りする際に利用されます。この関数は、そうしたテキスト形式のBase64文字列を、コンピュータが直接処理できる0と1の生のバイナリデータへと変換する役割を担います。

例えば、ネットワーク経由でBase64エンコードされた暗号文やハッシュ値などを受け取った際、それをPHPプログラム内で複合化したり、他の暗号処理に利用したりする前に、このsodium_base642bin関数を使って元のバイナリデータに戻す必要があります。この関数は、引数としてデコードしたいBase64文字列を受け取り、その結果としてデコードされたバイナリデータを文字列として返します。Sodium拡張機能を利用した暗号処理において、データの入出力形式を適切に扱い、異なる形式間での安全な変換を実現するために不可欠な関数と言えます。

構文(syntax)

1<?php
2$base64_encoded_data = 'SGVsbG8gV29ybGQ=';
3$variant_type = SODIUM_BASE64_VARIANT_ORIGINAL;
4$decoded_binary_data = sodium_base642bin($base64_encoded_data, $variant_type);
5?>

引数(parameters)

string $string, int $id

  • string $string: base64エンコードされた文字列
  • int $id: エンコードで使用されたアルゴリズムを指定する整数。SODIUM_BASE64_VARIANT_ORIGINALSODIUM_BASE64_VARIANT_URLSAFESODIUM_BASE64_VARIANT_idoarjoのいずれか

戻り値(return)

string

指定された文字列をBase64デコードし、バイナリデータ(byte列)として返します。

サンプルコード

sodium_base642binでBase64をデコードする

1<?php
2
3// このサンプルコードは、PHPのext-sodium拡張がインストールされ、有効になっている環境で動作します。
4// sodium_base642bin() 関数は、Base64エンコードされた文字列を元のバイナリデータにデコードするために使用されます。
5
6// 1. 元となるバイナリデータを準備します。
7// 通常、Base64エンコード/デコードは、通信や保存のためにバイナリデータを文字列形式で扱う際に用いられます。
8$originalBinaryData = random_bytes(16); // 16バイトのランダムなバイナリデータを生成
9
10echo "元のバイナリデータ (Hex形式): " . bin2hex($originalBinaryData) . "\n\n";
11
12// 2. 異なるBase64エンコーディング形式で文字列を生成し、それぞれを sodium_base642bin でデコードします。
13// sodium_bin2base64() は、バイナリデータをBase64にエンコードする関連関数です。
14
15// --- 例1: SODIUM_BASE64_VARIANT_ORIGINAL を使用したデコード ---
16// これは標準的なBase64エンコーディング形式です。必要に応じてパディング文字 (=) が含まれます。
17$encodedOriginal = sodium_bin2base64($originalBinaryData, SODIUM_BASE64_VARIANT_ORIGINAL);
18echo "【SODIUM_BASE64_VARIANT_ORIGINAL 形式】\n";
19echo "エンコードされた文字列: " . $encodedOriginal . "\n";
20
21// sodium_base642bin() を使って、Base64文字列を元のバイナリデータにデコードします。
22// 第二引数には、エンコード時に使用された Base64 形式ID (VARIANT) を正確に指定する必要があります。
23$decodedOriginal = sodium_base642bin($encodedOriginal, SODIUM_BASE64_VARIANT_ORIGINAL);
24
25echo "デコード後のバイナリデータ (Hex形式): " . bin2hex($decodedOriginal) . "\n";
26// デコードされたデータが元のデータと一致するかを確認します。
27echo "元のデータと一致しますか? " . (hash_equals($originalBinaryData, $decodedOriginal) ? "はい" : "いいえ") . "\n\n";
28
29
30// --- 例2: SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING を使用したデコード ---
31// これはURLで使用されることを想定したBase64形式で、+と/が-と_に置き換えられ、パディング文字がありません。
32$encodedUrlsafeNoPadding = sodium_bin2base64($originalBinaryData, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING);
33echo "【SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING 形式】\n";
34echo "エンコードされた文字列: " . $encodedUrlsafeNoPadding . "\n";
35
36// URLセーフ(パディングなし)形式でデコードします。
37$decodedUrlsafeNoPadding = sodium_base642bin($encodedUrlsafeNoPadding, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING);
38
39echo "デコード後のバイナリデータ (Hex形式): " . bin2hex($decodedUrlsafeNoPadding) . "\n";
40// デコードされたデータが元のデータと一致するかを確認します。
41echo "元のデータと一致しますか? " . (hash_equals($originalBinaryData, $decodedUrlsafeNoPadding) ? "はい" : "いいえ") . "\n\n";
42
43?>

PHP 8のsodium_base642bin関数は、Base64エンコードされた文字列を元のバイナリデータに戻す(デコードする)ために使用されます。この関数は、ext-sodium拡張がインストールされている環境で利用可能です。通常、画像データや暗号化されたデータなどのバイナリ情報を、ネットワーク経由で送信したり、データベースに保存したりする際に、文字列形式に変換する(Base64エンコード)ことがあります。その文字列データを再びバイナリデータとして利用したい場合に、本関数が役立ちます。

引数$stringには、デコードしたいBase64エンコードされた文字列を指定します。もう一つの引数$idには、その文字列がどのようなBase64形式でエンコードされたかを示す定数(例えばSODIUM_BASE64_VARIANT_ORIGINALSODIUM_BASE64_VARIANT_URLSAFE_NO_PADDINGなど)を正確に指定する必要があります。この形式IDが正しくないと、意図した通りのデコードは行われません。関数は、指定されたBase64文字列をデコードし、元のバイナリデータを文字列型で返します。

この関数を利用するには、PHPのext-sodium拡張がサーバーにインストールされ、有効になっている必要があります。最も重要な注意点は、sodium_base642bin関数の第二引数に指定する「Base64形式ID」を、エンコードされた元の文字列が作られたときに使用された形式と、必ず一致させる必要があることです。このIDを誤ると、データが正しくデコードされません。Base64には標準形式やURLセーフ形式など複数のバリアント(種類)があり、それぞれ特性が異なるため、用途に合った形式を選ぶようにしてください。デコード後のデータはバイナリ形式ですので、bin2hexのような関数で可視化すると内容を確認しやすくなります。バイナリデータの比較は、安全性のためにhash_equals関数を用いることを推奨します。

sodium_base642bin でBase64をバイナリにデコードする

1<?php
2
3/**
4 * LibsodiumのBase64エンコードとデコードのサイクルを実演します。
5 *
6 * この関数は、与えられたバイナリデータをBase64エンコードし、
7 * その後デコードして元のデータと比較します。
8 * `sodium_bin2base64`と`sodium_base642bin`関数の基本的な使い方を示します。
9 *
10 * @param string $originalBinaryData エンコード・デコードの対象となるバイナリ文字列。
11 */
12function demonstrateSodiumBase64Cycle(string $originalBinaryData): void
13{
14    echo "--- Base64エンコード/デコードのデモンストレーション ---" . PHP_EOL;
15    echo "元のデータ (Hex): " . bin2hex($originalBinaryData) . PHP_EOL;
16    echo "元のデータ長: " . strlen($originalBinaryData) . "バイト" . PHP_EOL;
17    echo "---------------------------------------------------" . PHP_EOL;
18
19    // 1. sodium_bin2base64 を使ってバイナリデータをBase64エンコードします。
20    //    SODIUM_BASE64_VARIANT_ORIGINAL は、標準的なBase64エンコーディング形式です。
21    $encodedString = sodium_bin2base64($originalBinaryData, SODIUM_BASE64_VARIANT_ORIGINAL);
22    echo "Base64エンコードされた文字列: " . $encodedString . PHP_EOL;
23    echo "エンコードされた文字列長: " . strlen($encodedString) . "バイト" . PHP_EOL;
24    echo "---------------------------------------------------" . PHP_EOL;
25
26    // 2. sodium_base642bin を使ってBase64文字列をバイナリデータにデコードします。
27    //    エンコード時と同じ形式IDを使用する必要があります。
28    $decodedBinaryData = sodium_base642bin($encodedString, SODIUM_BASE64_VARIANT_ORIGINAL);
29    echo "Base64デコードされたデータ (Hex): " . bin2hex($decodedBinaryData) . PHP_EOL;
30    echo "デコードされたデータ長: " . strlen($decodedBinaryData) . "バイト" . PHP_EOL;
31    echo "---------------------------------------------------" . PHP_EOL;
32
33    // 3. 元のデータとデコードされたデータが一致するか確認します。
34    if ($originalBinaryData === $decodedBinaryData) {
35        echo "結果: 元のデータとデコードされたデータは一致します。(成功)" . PHP_EOL;
36    } else {
37        echo "結果: 元のデータとデコードされたデータは一致しません。(失敗)" . PHP_EOL;
38    }
39    echo "---------------------------------------------------" . PHP_EOL . PHP_EOL;
40}
41
42// --- 使用例 ---
43
44// 1. テキスト文字列をバイナリデータとして処理する例
45//    PHPでは文字列はバイト列として扱われるため、テキストもバイナリデータとして渡せます。
46$textAsBinary = "Hello, world! 🌍 Libsodium Base64."; // UTF-8文字列
47demonstrateSodiumBase64Cycle($textAsBinary);
48
49// 2. ランダムなバイナリデータを処理する例
50//    暗号化などでよく使用される、判読不能なバイナリデータ
51$randomBinaryData = random_bytes(32); // 32バイトのランダムなバイナリデータ
52demonstrateSodiumBase64Cycle($randomBinaryData);
53
54// 3. 空の文字列を処理する例
55$emptyBinaryData = "";
56demonstrateSodiumBase64Cycle($emptyBinaryData);

PHPのsodium_base642bin関数は、Base64形式でエンコードされた文字列を、元のバイナリデータにデコードするために使用されます。この関数は、バイナリデータをテキストとして安全に扱いたい場合などに用いられるBase64エンコーディングにおいて、sodium_bin2base64関数で変換されたデータを元に戻す役割を担います。

第1引数$stringには、デコードしたいBase64エンコード済みの文字列を指定します。第2引数$idには、Base64のエンコード形式を識別する定数を渡します。この$idは、エンコード時にsodium_bin2base64で使用された形式と完全に一致している必要があります。一致しない場合、正しくデコードできない可能性があります。関数はデコードされたバイナリデータを文字列として返します。

サンプルコードでは、まず任意のバイナリデータをsodium_bin2base64関数とSODIUM_BASE64_VARIANT_ORIGINAL定数を使ってBase64文字列に変換しています。次に、そのBase64文字列をsodium_base642bin関数と同じSODIUM_BASE64_VARIANT_ORIGINAL定数で元のバイナリデータにデコードし、最終的に変換前後でデータが一致することを確認しています。PHPでは、通常のテキスト文字列も内部的にバイト列として扱われるため、テキストデータも本関数で適切に処理できます。

sodium_base642bin関数は、sodium_bin2base64関数でBase64エンコードされた文字列を元のバイナリデータに戻す際に利用します。この関数の最も重要な注意点は、第二引数の形式ID($id)です。Base64エンコード時にsodium_bin2base64で指定したIDと必ず一致させる必要があります。異なるIDを指定すると、正しくデコードできず、元のデータと異なる結果になったり、空の文字列が返されたりすることがありますのでご注意ください。サンプルコードではSODIUM_BASE64_VARIANT_ORIGINALという定数を使用しています。また、入力文字列は有効なBase64形式であることが前提です。PHPの文字列はバイナリデータも扱えますので、テキストデータだけでなく、暗号化データや画像データなどをBase64形式で安全にやり取りする際に活用できます。

関連コンテンツ

関連プログラミング言語