【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を勉強してるけど吐きそう!!