PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。
Q&A
解決済
3回答
5757閲覧
総合スコア7
0グッド
0クリップ
投稿2016/10/21 05:47
0
###前提・実現したいこと PHP において、データベースのPK となるようなユニークなキーを作成したい。
###わからないこと 色々調べると
md5(uniqid(rand(), true));
といったコードが見つかったのですが、uniqid はいいとして、md5 にかけると衝突する可能性が出てくる気がします。
md5 で生成した値を採用して大丈夫な理由があるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
質問へのコメント
回答3件
ベストアンサー
MD5は128ビットありますので、誕生日攻撃を考慮しても、衝突する確率は1兆個生成して1兆分の1もありません。
もちろん、セキュリティ上で重要な値(トークン、鍵など)に使うのであれば、MD5で「意図的に衝突する」データを作れることは問題となります。ただ、それは意図して重複するデータを作った場合の話で、偶然に作っていての衝突確率はじゅうぶんに低いです。
とはいえ、rand()の品質は絶望的に悪いので、OpenSSLの使える環境ならMD5を使わずに、openssl_random_pseudo_bytes()から暗号学的にも安全な擬似乱数を得てしまうのがいいかと思います(上の「誕生日攻撃」にもあるように、長さを長くすれば実用上衝突を無視することができるレベルは容易に達成できます)。
rand()
openssl_random_pseudo_bytes()
投稿2016/10/21 05:56
総合スコア146824
回答へのコメント
2016/10/21 06:00
md5でも良いですし、sha1でもcryptでも良いと思いますが、個人的には bin2hex(openssl_random_pseudo_bytes(桁数)) のような感じで作る事はありますが、 どちらにせよPKにする為に キー発行->そのキーがDBにすでに登録されていないかのチェック->既存(衝突)すればもう一回発行 をパスしたキーを採用というふうに、衝突の可能性が低くてもこのチェックをしていれば良いと思います。
投稿2016/10/21 06:04
総合スコア1689
人によって、プロジェクトによってみんな適時関数を作っていると思いますよ。
私は ・IPアドレス取得して ・発行時間取得して ・それぞれ違うアルゴリズムでハッシュ化して ・くっつけて ・更にsha256以上でハッシュ化 してます。
投稿2016/10/21 06:00
総合スコア686
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
15分調べてもわからないことはteratailで質問しよう!
ただいまの回答率85.29%
質問をまとめることで思考を整理して素早く解決
テンプレート機能で簡単に質問をまとめる
PHPでユニークなキーを作成する
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/21 06:00