web-dev-qa-db-ja.com

Nodejs createCipherとcreateCipheriv

私は現在、NodeJSを使用して保存データを暗号化しようとしています。Node APIドキュメントでcreateCipherを使用しない 推奨 を読みました。

Crypto.createCipher()の実装は、OpenSSL関数EVP_BytesToKeyを使用して、ダイジェストアルゴリズムをMD5、1回の反復、ソルトなしに設定して、キーを導出します。同じパスワードは常に同じキーを作成するため、ソルトがないと辞書攻撃が可能になります。反復回数が少なく、暗号的に安全でないハッシュアルゴリズムにより、パスワードを非常に迅速にテストできます。

EVP_BytesToKeyの代わりにpbkdf2を使用するというOpenSSLの推奨事項に沿って、開発者はcrypto.pbkdf2()を使用して独自にキーとIVを導出し、crypto.createCipheriv()を使用してCipherオブジェクトを作成することをお勧めします。

createCipherは、保存データを暗号化するための実行可能で安全な方法ですか?このメソッドは非推奨と見なされますか?十分な情報に基づいた攻撃者がデータを解読する可能性はありますか?

createCipherivを使用するソリューションは常にcreateCipherよりも優先されますか?

その他の詳細や推奨事項は高く評価されています。

14
andrsnn

CreateCipherは、保存されているデータを暗号化するための実行可能で安全な方法ですか?

もちろん非推奨のAPI呼び出しを使用することは決して推奨されませんが、createCipherを使用して安全なシステムを作成することは可能です。このため、指定された「パスワード」は、オフライン、および場合によっては並行攻撃に耐えるのに十分な強さである必要があります。このため、指定されたパスワードは、推測されないように十分なエントロピー(ランダムである必要があります)を持っている必要があります。たとえば、パスワードマネージャーを使用して〜80ビット以上のパスワードを作成し、それらを使用できます。

createCipherivを使用するソリューションは常にcreateCipherよりも優先されますか?

はい、もし作成者がすでにあなたに警告していて、コードのレビューがcreateCipherがまだ実行可能かどうか再検討する必要がある場合に限ります。メソッドがCryptoJSから削除された場合(可能性は低いですが、結局非推奨になっています)、コードは実行されなくなります。

それでも、パスワードをキーとして直接使用する場合、createCipherivの使用はcreateCipherより安全性が低くなりますになります。更新されたドキュメントに示されているように、PBKDF2などの正しいパスワードベースのキー導出関数を使用して、出力キーマテリアルを取得する必要があります。

その他の詳細や推奨事項は高く評価されています。

ほとんどの場合、暗号化メッセージ構文(CMS、PKCS#7で指定)、PGP、または類似のハイエンドプロトコル/コンテナ形式などのハイエンドの暗号化/復号化方法を使用します。

本当に暗号を直接使用する必要がある場合は、GCMによって提供されるauthenticated encryptionがオプションかどうかを試してみてください。

2
Maarten Bodewes

廃止されたcreateCipher関数は、一意のivを許可しなかったため、createCipherivが推奨されます。

鍵導出機能を使用して鍵を導出する一方で、ivが防止する辞書攻撃から暗号テキストを保護することはできません。

0
jas-