2016-04-25 21 views
1

私は自分のウェブサイトのユーザー用に動的なアバターを作成しようとしています。 stackoverflowのようなもの。 (およびその文字列のPHPスクリプトは、ベースの画像を生成して:私は自分のアバターの名前として、ユーザーの電子メールのMD5を使用したい2つの異なる文字列のMD5が同一である可能性はありますか?

path/to/avatar.php?hash=string 

:私は、文字列に基づいて画像を生成するPHPスクリプトを持っています

$email = $_GET['email']; 
$hash = md5($email); 
copy("path/to/avatar.php?hash=$hash","path/img/$hash.jpg"); 

)に今、私は自分のアバターの名前として自分の電子メールのMD5を使用することができ、確認したいですか?同じMD5の出力を持っている2つの異なる文字列はありませんか?言い換えれば、2つの異なる文字列の出力が一意であるかどうかを知りたいですか?

私の質問はわかりません。私が知りたいのは、2つの異なる電子メールのMD5を複製する可能性はありますか?

+0

はい、可能です。約1兆チャンスの可能性があります。 – AbraCadaver

+0

@AbraCadaverどうすれば一意の文字列を生成できますか?自分の情報をデータベースに挿入する前にユーザーの「id」にアクセスしません。 – Shafizadeh

+0

暗号エキスパートが来て修正しますが、電子メールアドレスを難読化しようとしているだけであれば、MD5はおそらく大丈夫です。 SHA256または512を使用することもできます。 – AbraCadaver

答えて

2

ここでの目標は、暗号強度ではなく、一意性のためにハッシュを使用することです。MD5は受け入れ可能です。私はまだそれをお勧めしませんが。

MD5を使用して解決する場合は、ユーザー提供の電子メールアドレスではなく、塩で制御するグローバル一意のIDを使用します。しかしながら

すなわち

$salt = 'random string'; 
$hash = md5($salt . $userId); 

:まだ衝突の小さなチャンスがある

  • (2 で開始起因Birthday Paradoxに比較的迅速2 に近づきます)。 チャンス、ハッシュ n、ハッシュ n + 1が衝突する可能性があることに注意してください。
  • ハッシュからuserIdを決定する妥当な方法はありません(私は128ビットハッシュをインデックスすることは妥当であると質問していません)。

例としてStackOverflowを使用します。このサイト上の

ユーザープロファイルは次のようになります。http://stackoverflow.com/users/2805376/shafizadeh

のでhttp://your_site/users/2805376/avatar.pngのようなアバターのURLを持つと間違って何ですか?バックエンド・ストレージは、単にこれは、一意の名前を保証し、かつ、保存位置、およびユーザーに戻って画像に割り当てられたIDを逆転させる方法で動作するように非常にシンプルで簡単なを提供します/path/to/images/002/805/376.png

である可能性があります。

+0

良い説明。 Thx ... +1 – Shafizadeh

+0

また、この文章のために:*したがって、http://your_site/users/2805376/avatar.png'*のようなアバターURLを持つことに間違っています。私は、彼のアバターの名前としてユーザーのIDを使用していると言わざるを得ない。ユーザーが私のウェブサイトに登録されていないときに彼はIDを持っていないので、彼の登録前に自分のアバターの名前が必要なので、それはどういうことか分かりません。 – Shafizadeh

1

これは実際にGravatarがやっていることです(これはStackoverflowでアバターを取得する標準的な方法でした)。 Gravatars implementationをご覧ください。

実際には衝突の可能性はごくわずかですが、意図的に2つの(バイナリ)ストリングを作成して同じMD5を生成するのは難しく、EMailのサイズと文字数は制限されています。

MD5のブルートフォースは非常に速いので(100 Giga MD5 per second)、MD5が現在表示されている元のメールアドレスを見つけようとする可能性があるため、このアプローチの1つの問題がFred-ii-短い電子メールの場合、これは妥当な時間内に機能します。

UUIDを使用すると、EMailアドレスから取得するのに適しています。このようなIDをデータベースにアクセスすることなく作成して、重複しないようにすることができます。

+0

Thx ........ +1 – Shafizadeh

関連する問題