【PHP】openssl_decryptの引数
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を勉強してるけど吐きそう!!