プロジェクトで暗号化を使用していますが、_openssl_encrypt
_および_openssl_decrypt
_の操作方法について少し助けが必要です。最も基本的で正しい方法を知りたいだけです。ここに私がこれまでに得たものがあります:
_// To encrypt a string
$dataToEncrypt = 'Hello World';
$cypherMethod = 'AES-256-CBC';
$key = random_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cypherMethod));
$encryptedData = openssl_encrypt($dataToEncrypt, $cypherMethod, $key, $options=0, $iv);
_
次に、_$cypherMethod
_を復号化するときに使用するために、_$key
_、_$iv
_、および_$encryptedData
_を保存します。 (値の保存方法については詳しく説明しません、ありがとう!)
_// To decrypt an encrypted string
$decryptedData = openssl_decrypt($encryptedData, $cypherMethod, $key, $options=0, $iv);
_
まず、上記のサンプルコードは_php openssl_encrypt
_の使用方法の正しい例ですか?
第二に、_$key
_および_$iv
_を生成するための私の方法は正しく安全ですか?私は読み続けているので、キーは暗号的に安全でなければなりません。
最後に、_32-byte
_に_AES-256-CBC
_値は必要ありませんか?はいの場合、openssl_cipher_iv_length()
が長さとしてint(16)
のみを返すのはなぜですか? int(32)
であってはなりませんか?
まず、上記のサンプルコードはphp openssl_encryptの使用方法の正しい例ですか?
関数の使用方法は正しいように見えますが、CBC以外の操作モードを検討することもできます。このモードでデータを暗号化するだけで悪名高い CBC bit-flipping attack などの既知の攻撃があるため、CBCは正しく処理するのが困難です。これにより、攻撃者は、暗号文。可能であれば、可能であればGCMのような認証された暗号化モードを使用します( PHP 7.1+(Example#1) でサポートされています)。
CBCモードを使用する場合は、 ドキュメントの例#2 をご覧ください。 MAC(メッセージ認証コード)を暗号化した後、暗号文上で計算され、保存されることに注意してください。このMACは、暗号文を復号化する前に再計算する必要があり、保存されているMACと一致しない場合、暗号文は変更されており、無効です。
第二に、$ keyと$ ivを生成する私の方法は正しく安全ですか?私は読み続けているので、キーは暗号的に安全でなければなりません。
暗号的に安全な乱数ジェネレータを使用してキーを生成する必要があります。幸いなことに、ほとんどのオペレーティングシステムでは、/dev/urandom
。 この回答 は、/dev/urandom
PHPで。 openssl_random_pseudo_bytes
shouldは暗号的にも安全ですが、 そうでない場合 があります。
初期化ベクトル(IV)はランダムである必要があり、同じキーで再利用しないでください。
最後に、AES-256-CBCには32バイトの値は必要ありませんか?はいの場合、なぜopenssl_cipher_iv_length()は長さとしてint(16)のみを返すのですか? int(32)であってはなりませんか?
AESは、キーサイズに関係なく、128ビット(16バイト)ブロックで機能するブロック暗号です。