2017-12-29 37 views
3

私はプロジェクトの暗号化に取り組んでおり、openssl_encryptopenssl_decryptの作業方法についてはちょっと助けが必要なので、最も基本的で正しい方法を知りたいだけです。ここで私はこれまで得たものである:正しい方法php openssl_encryptを使用する

// 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); 

$encryptedDataを復号化するとき、私は、その後の使用のために$cypherMethod$key、および$ivを格納します。 (、のは、私は値を格納する方法を詳しく説明していない感謝をしましょう!)

// To decrypt an encrypted string 

$decryptedData = openssl_decrypt($encryptedData, $cypherMethod, $key, $options=0, $iv); 

まず第一に、上記の例のコードはphp openssl_encryptを使用する方法の正しい例ですか?

第2に、正しい方法で$key$ivを生成する方法はありますか?私は読書を続けているので、鍵は暗号的に安全でなければなりません。

最後に、AES-256-CBCには32-byteの値が必要ですか?はいの場合、その理由はopenssl_cipher_iv_length()は長さとしてint(16)だけを返しますか? int(32)ではありませんか?

答えて

1

最初に、上記のコード例は、php openssl_encryptの使い方の正しい例ですか?

この関数の使用法は正しいと思われますが、CBC以外の操作モードを検討することもできます。このモードでデータを暗号化するだけでは、攻撃者が暗号文を変更して平文に意味のある変更を加えることができる悪名高いCBC bit-flipping attackなどの攻撃が知られているため、CBCは正しく処理するのが難しいです。可能であれば、可能ならばGCMのような認証された暗号化モードを使用します(it's supported in PHP 7.1+ (Example #1)のように見えます)。

CBCモードを使用する場合は、Example #2 in the docsをご覧ください。暗号化後、MAC(メッセージ認証コード)が暗号文を介して計算され、格納されることに留意されたい。このMACは、暗号文を解読する前に再計算されるべきであり、もしそれが記憶されたMACと一致しなければ、暗号文は変更され無効である。

次に、$キーと$ ivを正しい方法で生成する方法はありますか?私は読書を続けているので、鍵は暗号的に安全でなければなりません。

暗号化された安全な乱数ジェネレータを使用してキーを生成する必要があります。幸運なことに、ほとんどのオペレーティングシステムは、/dev/urandomで1つのパッケージを提供しています。 This answerはPHPの/dev/urandomからの読み方を説明しています。また、times when this is not the caseがあります。

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

最後に、AES-256-CBCには32バイトの値が必要ですか?はいの場合、なぜopenssl_cipher_iv_length()は長さとしてint(16)だけを返しますか? int(32)でなければならない?

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

+0

有益な情報をいただきありがとうございます。ただの簡単な質問ですが、私は1回の一般的な使用キーを使うべきですか、それとも毎回無作為に生成するべきですか? –

+0

同じキーを使うことができます。 'openssl_encrypt'を呼び出すたびに新しいIVを生成するようにしてください。 – puzzlepalace

関連する問題