PHP で非常に短い文字列を暗号化する最良の方法は何ですか?
-
01-07-2019 - |
解決
の提案を強くお勧めします クリス・カイト. 。何をしているのか、その理由、そして AES-128 から保護するために必要と予想される脅威について詳しく知らなくても、おそらく十分です。対称暗号化を使用できる機能は、データの復号化と暗号化の両方となるスタンドアロン アプリに最適です。両方として クリス・カイト そして クモ類 データのサイズが小さいため、データをパディングしてランダムな初期化ベクトルを使用することをお勧めします。
アップデート: なぜかというと……。データが十分に小さく、IV が予測できる場合は、平文と既知の IV のすべての組み合わせに対して暗号文を生成し、それをキャプチャされた暗号文と照合することで、平文を総当たり攻撃することが可能です。つまり、これがレインボー テーブルの仕組みです。
あるサーバーで暗号化し、別のサーバーで復号化する場合は、次の提案に従います。 プデイビス. 。非対称メソッドを使用すると、暗号化キーと復号化キーを分離できます。これにより、データを暗号化するサーバーが侵害された場合でも、攻撃者はデータを復号化できなくなります。
可能であれば、コミュニティが暗号化の使用例についてさらに知るのに役立ちます。上で述べたように、セキュリティ管理を評価する際には、考えられる脅威を適切に理解することが重要です。
他のヒント
私は、サーバー上で暗号化して、場合によってはサーバー上または別のサーバー上で復号化する必要があるものには GnuPG を使用するのが好きです (通常はこれが私の場合です)。私のシナリオでは、暗号化サーバーにはデータを復号化するためのキーがないため、これによりセキュリティのレベルがさらに高まります。また、手動による復号化も容易になります。さまざまな言語で使用できる優れたラッパーがいくつかあります (別の利点)。PHP 用のラッパーは次のとおりです。 GnuPGP PHP クラス.
mcrypt は、デフォルトで PHP のほとんどのビルドにリンクされます。これには、必要と思われるすべてのプリミティブが含まれています。何を暗号化しているのか、脅威モデルが何なのかなどについて詳しく知らなければ、使用するアルゴリズムや動作モードなどについて具体的な推奨事項を与えることは困難です。
確かに言えることが一つあります。短いテキスト文字列では、一意のランダムな初期化ベクトルを使用することがこれまで以上に重要です。そうでなければ、誰かが暗号化されたデータに対してさまざまな攻撃を仕掛けることは簡単です。
誰かがそれを解読できるかどうかは問題ですか? 単に難読化したいだけの場合 少し, 、ROT13を使用します。それは古い学校です。
私も Chris Kite の意見に同意します。AES 128 を使用するだけで十分です。
詳しい環境は分かりませんが、おそらくインターネット経由でデータを送信しているのだと思います。
ECB は使用しないでください。同じプレーン テキストに対して常に同じ結果が生成されます。
CBC モードは最適な方法であり、ランダムな初期化ベクトルを忘れないでください。このベクトルは暗号文と通信する必要があり、平文で送信できます。
データに関しては、AES はブロック暗号であるため、結果は常にブロック サイズの倍数になります。データが短いか長いかをオブザーバーに知らせたくない場合は、パディングを追加して、予想される最大サイズまでデータを拡張します。
アプリケーション内でデータを暗号化および復号化する場合は、対称キー暗号を使用する可能性が高くなります。AES は、最高機密データを保護するために NSA によって認定された対称ブロック暗号化アルゴリズムです。純粋な PHP 実装は次の場所で入手できます。 www.phpaes.com
この用途では、AES128 で十分だと思われます。ランダムな初期化ベクトルで CBC モードを使用する必要があります。そうしないと、同じデータから常に同じ暗号文が生成されます。
適切な暗号化アルゴリズムを選択することは良い最初のステップですが、安全なシステムには、キー管理など、適切に行うのが難しい要素が数多くあります。Bruce Schneier の『Applied Cryptography』や Ross Anderson の『Security Engineering』(オンラインで無料で入手可能) など、優れたリソースがあります。
Blowfish のような一方向暗号化アルゴリズムなら何でも良いと思います。フグは速くてオープンです。Blowfish は、crypt() 関数を通じて使用できます。私の知る限り、小さな文字列に対して特にうまく機能する暗号化アルゴリズムはありません。ただし、注意すべき点の 1 つは、このような小さな文字列に対する総当たり攻撃は非常に簡単であるということです。おそらく、セキュリティを強化するために、「シークレット」ソルト値とともに文字列を暗号化する必要があります。
組み込みの暗号化/解読関数に依存せずに、一般的なプログラミングのアイデアを使用できます。 例 関数を作成して呼び出します。
function encryptstring($string) {
$string_length=strlen($string);
$encrychars="";
/**
*For each character of the given string generate the code
*/
for ($position = 0;$position<$string_length;$position++){
$key = (($string_length+$position)+1);
$key = (255+$key) % 255;
$get_char_to_be_encrypted = SUBSTR($string, $position, 1);
$ascii_char = ORD($get_char_to_be_encrypted);
$xored_char = $ascii_char ^ $key; //xor operation
$encrypted_char = CHR($xored_char);
$encrychars .= $encrypted_char;
}
/**
*Return the encrypted/decrypted string
*/
return $encrychars;
}
暗号化が必要な ID を含むリンクのあるページ
/**
*While passing the unique value to a link
*Do the following steps
*/
$id=57;//or if you are fetching it automatically just pass it here
/**
*For more security multiply some value
*You can set the multiplication value in config file
*/
$passstring=$id*346244;
$encrypted_string=encryptstring($passstring);
$param=urlencode($encrypted_string);
/**
*Derive the url for the link
*/
echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ;
リンクをクリックした後に開かれるターゲットファイルについて
/**
*Retriving the value in the target file
*Do the following steps
*/
$fetchid=$_GET['aZ98#9A_KL'];
$passstring=urldecode(stripslashes($fetchid));
$decrypted_string= encryptstring($passstring);
/**
*Divide the decrypted value with the same value we used for the multiplication
*/
$actual_id= $decrypted_string/346244;