【PHP】openssl_decryptの引数

ネコニウム研究所

PCを利用したモノづくりに関連する情報を掲載するブログ

【PHP】openssl_decryptの引数

2022-9-16 |

PHPのopenssl_decrypt関数の引数についての覚書だよ!

概要

今回の記事では、PHPのopenssl_decrypt関数の引数についての覚書を掲載する。

しょうもないことで嵌まりかけた。

仕様書

環境

  • PHP 8.0.17

手順書

PCアプリやスマホアプリ(クライアントサイド)でデータを暗号化して、WEBAPI(サーバーサイド)で復号化するケースを想定してる。

openssl_decrypt関数の定義は下記のような感じ。

openssl_decrypt(
    string $data,
    string $cipher_algo,
    string $passphrase,
    int $options = 0,
    string $iv = "",
    ?string $tag = null,
    string $aad = ""
) : string|false;

復号化したいデータ$dataの注意点

第1引数$dataに復号化したいデータをstringで渡す。プレーンテキスト(平文)、BASE64でエンコードされた文字列を渡すこともできる。戻り値は、BASE64でエンコードされた文字列を渡した場合でもデコードされた状態で返ってくる。

BASE64URLされた文字列では復号化に失敗するので、プレーンテキスト(平文)かBASE64にデコードしてから渡す。

パスフレーズ$passphraseと初期化ベクトルivはBASE64で渡せない

えー、私は何を勘違いしたのか、BASE64でエンコードされた文字列を渡してたのですが、エラーで復号化に失敗します。

パスフレーズ$passphraseと初期化ベクトルivはプレーンテキスト(平文)で渡す必要があります。POSTやらGETやJSONやらでBASE64でエンコードされたデータで受け取った場合はbase64_decode関数なのでデコードしてから渡す、

パスフレーズ$passphraseと初期化ベクトルivはバイナリ列で渡せない

えー、私は何を勘違いしたのか(Part2)、BASE64でエンコードされたバイナリ列をデコードして渡してたのですが、これもエラーで復号化に失敗します。

JavaやC#側の暗号化でパスフレーズや初期化ベクトルにバイナリ列を使えるけど、PHP側のopenssl_decrypt関数で復号化に失敗するのでパスフレーズや初期化ベクトルは文字列で作成する。

この節はちょっと怪しくで、他にやり方がありそうな気がする。

まとめ(感想文)

セキュリティってめちゃ大事だけど、くちゃ面倒くさいね!

SAMLを勉強してるけど吐きそうだ!