8

人々がファイルをアップロードし、リンクを友人に送信して後で取得できるようにするファイル ホスティング サイトを作成し、ファイルが保存されている場所に確実に複製されるようにしたいとします。PHP の sha1_file はそのタスクに十分でしょうか? 代わりに md5_file を使用しない理由はありますか?

フロントエンドの場合、データベース内の元のファイル名ストアを使用して隠蔽されますが、これにより元のポスターについて何かが明らかになるかどうかという追加の懸念があります. ファイルは、最終変更者や投稿者などのメタ情報を継承しますか?それとも、ファイル システムに基づいているものですか?

また、レインボーテーブル攻撃に関するセキュリティはこれには何の意味もなく、ハッシュは後でチェックサムとして使用される可能性があるため、ソルトの使用は軽薄ですか?

最後にスケーラビリティについて。最初は、数メガの小さなファイルにのみ使用されますが、最終的には...

編集 1: ハッシュのポイントは、主にファイルの重複を回避することであり、あいまいさを作成することではありません。

4

4 に答える 4

6

sha1_fileで十分ですか?

ほとんどの場合、sha1_file を使用するだけで十分です。衝突の可能性はごくわずかですが、それはほとんど起こりません。可能性をほぼ 0 に減らすには、ファイル サイズも比較します。

function is_duplicate_file( $file1, $file2)
{   
    if(filesize($file1) !== filesize($file2)) return false;

    if( sha1_file($file1) == sha1_file($file2) ) return true;

    return false;
}

md5 は sha1 よりも高速ですが、生成される固有の出力が少なくなります。md5 を使用した場合の衝突の可能性はまだ非常に小さいと考えられています。

スケーラビリティ?

ファイルを比較するにはいくつかの方法があります。どの方法を使用するかは、パフォーマンスの問題によって異なります。さまざまな方法で小さなテストを行いました。

1- 直接ファイル比較:

if( file_get_contents($file1) != file_get_contents($file2) )

2- Sha1_file

if( sha1_file($file1) != sha1_file($file2) )

3-md5_file

if( md5_file($file1) != md5_file($file2) )

結果: それぞれ 1.2MB の 2 つのファイルを 100 回比較した結果、次の結果が得られました。

--------------------------------------------------------
 method                  time(s)           peak memory
--------------------------------------------------------
file_get_contents          0.5              2,721,576
sha1_file                  1.86               142,960
mdf5_file                  1.6                142,848

file_get_contents は sha1 よりも 3.7 高速でしたが、メモリ効率が良くありません。

Sha1_file と md5_file はメモリ効率が高く、file_get_contents が使用するメモリの約 5% を使用しました。

md5_file は、sha1 よりも少し高速であるため、より適切なオプションである可能性があります。

したがって、結論は、比較を高速化するか、メモリ使用量を減らすかによって異なります。

于 2015-11-08T20:52:13.530 に答える
4

@ykaganovichの回答に対する私のコメントによると、SHA1は(驚くべきことに)MD5よりもわずかに高速です。

問題の説明から、安全なハッシュを作成しようとしているのではなく、大きな名前空間でファイルを非表示にするだけです。この場合、ソルト/レインボーテーブルの使用は関係ありません。唯一の考慮事項は、誤った衝突の可能性です(ここで、2つの異なるファイルが同じハッシュを提供します)。これがmd5で発生する可能性は、非常に低いです。それはsha1でさらに遠くにあります。ただし、2人の独立したユーザーが同じウェアーズをサイトにアップロードするとどうなるかを考える必要があります。ファイルの所有者は誰ですか?

実際、ハッシュを使用する理由はまったくないようです。十分に長いランダム値を生成するだけです。

于 2010-02-19T13:14:12.040 に答える
2

SHA は、「通常の」環境では問題なく動作するはずです。「Git Magic」の著者 Ben Lynn は次のように述べています。

A.1。SHA1 の弱点 時間が経つにつれて、暗号学者は SHA1 の弱点をどんどん発見していきます。十分な資金のある組織では、すでにハッシュの衝突を見つけることは可能です。数年以内に、典型的な PC でさえも、Git リポジトリを黙って破壊するのに十分な計算能力を持つようになるでしょう。さらなる研究によって SHA1 が破壊される前に、Git がより優れたハッシュ関数に移行することを願っています。

SHA256、またはさらに長い他のものをいつでも確認できます。MD5 衝突の検出は、SHA1 よりも簡単です。

于 2010-02-19T04:01:39.377 に答える
0

どちらも問題ないはずです。sha1 は md5 よりも安全なハッシュ関数です。これは、低速であることも意味します。これは、おそらく md5 を使用する必要があることを意味します :)。非常に小さなファイルの場合、salt を使用してプレーンテキスト/レインボー攻撃を防ぎたいと考えています (人々があなたのサイトに何をアップロードするかについて推測しないでください)。パフォーマンスの違いはごくわずかです。ソルトを知っている限り、チェックサムとして使用できます。

スケーラビリティに関しては、CPU バウンドではなく IO バウンドになる可能性が高いと思います。そのため、チェックサムを計算しても大きなオーバーヘッドが生じるとは思いません。アップロード中のストリームで行う場合。

于 2010-02-19T03:52:01.990 に答える