12

潜在的には約 3 ~ 4 文字しかないが、約 20 文字になる可能性がある文字列を暗号化したいと考えています。情報も解読できるようにしたいので、ハッシュ関数 ( md5sha1cryptなど) は適していません。mcrypt拡張機能には、非常に多くの可能性があります。

短い文字列を安全に暗号化するための最良の方法とその理由について、誰か考えがありますか? カジュアルなプログラマーに実用的な暗号化シナリオを紹介する資料へのリンクはありますか?

4

8 に答える 8

7

サーバー上で暗号化する必要があり、サーバーまたは別のサーバーで復号化する必要がある場合は、GnuPG を使用するのが好きです (これは通常、私の場合です)。私のシナリオでは、暗号化サーバーはデータを復号化するためのキーを持っていないため、これによりセキュリティのレベルが向上します。また、手動での復号化も容易になります。さまざまな言語で使用できる優れたラッパーがいくつかあります (もう 1 つの利点)。PHP 用のラッパーはGnuPGP PHP Classです。

于 2008-09-19T15:32:07.873 に答える
6

mcryptは、デフォルトで PHP のほとんどのビルドにリンクされています。必要になる可能性のあるすべてのプリミティブが含まれています。何を暗号化しているのか、脅威モデルは何かなどについて詳しく知らなければ、使用するアルゴリズムや操作モードなどについて具体的な推奨事項を提示することは困難です。

確かに言えることは、短いテキスト文字列では、一意のランダムな初期化ベクトルを使用することがこれまで以上に重要になるということです。そうでなければ、誰かが暗号化されたデータに対してさまざまな攻撃を仕掛けるのは簡単なことです。

于 2008-09-19T16:50:15.003 に答える
4

Chris Kiteの提案を強くお勧めします。何をしているのか、その理由、および AES-128 から保護する必要があると予想される脅威について詳しく知らなくても、おそらく十分です。対称暗号化を使用する機能は、データの復号化と暗号化の両方を行うスタンドアロン アプリに最適です。Chris KiteArachnidの両方が言ったように、データのサイズが小さいため、データをパディングしてランダムな初期化ベクトルを使用することをお勧めします。

更新:理由については....データが十分に小さく、IVが予測できる場合、プレーンテキストと既知のIVの組み合わせごとに暗号テキストを生成し、一致させることにより、プレーンテキストをブルートフォースすることができますキャプチャされた暗号文まで。つまり、これがレインボー テーブルの仕組みです。

あるサーバーで暗号化し、別のサーバーで復号化する場合は、pdavisの提案に従います。非対称方式を使用することで、暗号化キーを復号化キーから分離できます。このようにして、データを暗号化するサーバーが侵害された場合でも、攻撃者はデータを復号化できません。

可能であれば、コミュニティが暗号化のユースケースについてもっと知るのに役立ちます. 前述したように、セキュリティ コントロールを評価する際には、考えられる脅威を正しく理解することが重要です。

于 2008-09-26T22:18:48.437 に答える
2

アプリケーション内でデータを暗号化および復号化する場合は、対称鍵暗号を使用することをお勧めします。トップシークレットデータを保護するためにNSAによって認定された対称ブロック暗号化アルゴリズムであるAESが最良の選択です。www.phpaes.comで利用可能な純粋なPHPの実装があります

あなたの使用のためにそれはAES128で十分であるように聞こえます。ランダムな初期化ベクトルでCBCモードを使用する必要があります。そうしないと、同じデータが常に同じ暗号文を生成します。

適切な暗号化アルゴリズムを選択することは良い最初のステップですが、安全なシステムには、鍵管理など、適切に実行するのが難しい多くの要因があります。BruceSchneierによるAppliedCryptographyやRossAndersonによるSecurityEngineering(オンラインで無料で入手可能)など、優れたリソースがあります。

于 2008-09-19T16:35:46.800 に答える
2

私はChris Kiteに同意します.AES 128を使用するだけで十分です.

あなたの環境は正確にはわかりませんが、インターネット経由で何らかの方法でデータを送信していると思います。

ECB を使用しないでください。これは、同じプレーン テキストに対して常に同じ結果を生成します。

CBC モードが最適で、ランダムな初期化ベクトルを忘れないでください。このベクトルは暗号文と通信する必要があり、平文で送信できます。

データに関しては、AES はブロック暗号であるため、結果は常にブロック サイズの倍数になります。データが短いか長いかをオブザーバーに知らせたくない場合は、パディングを追加して、予想される最大サイズまで拡張します。

于 2008-09-24T15:39:46.800 に答える
2

誰かがそれを解読できるかどうかは重要ですか? 少し 難読化するだけの場合は、ROT13 を使用してください。それは古い学校です。

于 2008-09-19T15:26:28.323 に答える
0

Blowfish のような一方向の暗号化アルゴリズムで十分だと思います。フグは速くてオープンです。crypt() 関数を介して Blowfish を使用できます。私の知る限り、小さな文字列で特にうまく機能する暗号化アルゴリズムはありません。ただし、このような小さな文字列を総当たり攻撃するのは非常に簡単です。セキュリティを強化するために、「秘密の」ソルト値とともに文字列を暗号化する必要があるかもしれません。

于 2008-09-19T15:30:19.533 に答える