web-dev-qa-db-ja.com

php openssl_encryptを使用する正しい方法

プロジェクトで暗号化を使用していますが、_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)であってはなりませんか?

7
Jo E.

まず、上記のサンプルコードは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_bytesshouldは暗号的にも安全ですが、 そうでない場合 があります。

初期化ベクトル(IV)はランダムである必要があり、同じキーで再利用しないでください。

最後に、AES-256-CBCには32バイトの値は必要ありませんか?はいの場合、なぜopenssl_cipher_iv_length()は長さとしてint(16)のみを返すのですか? int(32)であってはなりませんか?

AESは、キーサイズに関係なく、128ビット(16バイト)ブロックで機能するブロック暗号です。

4
puzzlepalace