2

誰かが次の方法で暗号化する多目的なPHP暗号化/復号化アルゴリズムを提案できますか?

  1. これは速い
  2. それは短く、YouTubeのビデオIDに似ています
  3. 有効なID(要素属性)として使用できます
  4. URLの一部として安全に使用できます

ここでは、セキュリティは主要な関心事ではありません。URLを変更することで、カジュアルな「ハッカー」が特定のページに簡単にアクセスできないようにしたいだけです(たとえば、www.domain.com /?id = 1はwww.domain.com/?id=2に簡単に変更できます)。

4

4 に答える 4

3

Can't you use MySQL's built-in MD5 function?

You can use MD5 to hash the database id, then the URL will be something like

mysite.com/?id=2343423423j23kj3kkjdslfjsldjfsfjs

E.g.

$id = $_GET['id'];

And in MySQL

select * from product where md5(id) =  $id;
于 2014-04-24T13:43:07.207 に答える
2

本当に本当に主キーを暗号化したい場合 (非常に非効率的です。後で説明します) を使用します。

$url = substr(md5(uniqid($row['id'], true)),0,6);

行['id'] は主キーです。これにより、url/html セーフの 6 文字の文字列が作成され、すべてが一意になります (以下を参照)。

今。これが、これを行うべきではない理由です。

  1. クライアント側ではなく、SQL データベースにデータをアップロードするときは、常にバックエンドで暗号化を行う必要があります。一般的なルールは、クライアント側の処理が少ないほど良いということです。$row['id'] がキーである SQL データベースから $row['url'] をプルするか、ID をプルしてから暗号化を実行するかの違いは、クライアント側です。これにより、クライアント側にさらに 1 つのステップが追加されます。
  2. 可能性は非常に低いですが、以下のような暗号化を使用すると、重複が発生する可能性があります。(サイトに 1000 以上のキーがある場合、重複の可能性が高くなります) したがって、重複を防ぐには、キーを暗号化する必要があります。次に、SQL 検索を実行してすべてのキーを取得し、各キーを暗号化し、すべてのキーを比較します現在の暗号化されたキー。これにより、処理時間が 4 倍になります (キーの数に関係なく)。
  3. 本当に形が悪いだけです。暗号化された URL に基づいてページを検索したいという永遠の理由がある場合は、すべてのキーを再度取得し、それらすべてを暗号化して比較する必要があります。

他のすべての人にとって、効率が必要な場合はこれを使用してください

一意のIDを作成するスクリプトがあります

$token = substr(md5(uniqid(rand(), true)),0,6); // creates a 6 digit token

以前に使用した ID を格納するために mysql データベースを使用していますが、他の種類のデータベースを使用して ID を格納することもできます。

function generateUniqueID () {
  $token = substr(md5(uniqid(rand(), true)),0,6); // creates a 6 digit token
  $query = "SELECT count(*) FROM table WHERE url = $token";
  $result = mysql_query($query, $connection) or die(mysql_error());
  $numResults = mysql_num_rows($result);
  if ($numResults) {
    generateUniqueID();
  }
}

このコードを使用すると、クライアント側で1つのステップがあり、idの行を取得してから行['rl']を受け取ります。

プログラムの効率性についてよく読み、 mysqlのドキュメントを参照してください。そうすれば、より多くのクライアントを満足させることができます :)

于 2012-08-03T02:16:42.170 に答える
2

データベースを変更して「識別子」を保持する新しい列を追加する可能性がない場合は、ブロックサイズが小さいブロック暗号を使用できます。

ふぐはあなたが行くことができるものです。ID を秘密鍵で暗号化し、16 進形式で出力します。このようにして、16 バイトの 16 進数でエンコードされた識別子が得られます (数値 ID が Blowfish のブロック サイズに収まる限り)。

大まかに次のようなものです(検証は含まれていません):

$key = md5('crypto key...', true); // For demonstration purpose

function encrypt($id, $key)
{
    $id = base_convert($id, 10, 36); // Save some space
    $data = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $id, 'ecb');
    $data = bin2hex($data);

    return $data;
}

function decrypt($encrypted_id, $key)
{
    $data = pack('H*', $encrypted_id); // Translate back to binary
    $data = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $data, 'ecb');
    $data = base_convert($data, 36, 10);

    return $data;
}

この種のアプローチには暗号化の欠点がありますが、ID 番号が 2821109907455 を超えない (そして負でない) と仮定すると、これで問題ありません。17 バイトの識別子があれば問題ありません (encrypt 関数からの 16 バイトの暗号化されたデータと、html 属性が文字で始まることを確認するための 1 バイトのハードコードされた文字)。

于 2012-08-03T10:21:07.240 に答える
1

ID 自体を生成する必要がある場合は、uniqid()関数が探しているものになる可能性があります。

于 2012-08-03T02:16:08.700 に答える