質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

5276閲覧

PHPでユニークなキーを作成する

subcig

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/10/21 05:47

###前提・実現したいこと
PHP において、データベースのPK となるようなユニークなキーを作成したい。

###わからないこと
色々調べると

md5(uniqid(rand(), true));

といったコードが見つかったのですが、uniqid はいいとして、md5 にかけると衝突する可能性が出てくる気がします。

md5 で生成した値を採用して大丈夫な理由があるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

MD5は128ビットありますので、誕生日攻撃を考慮しても、衝突する確率は1兆個生成して1兆分の1もありません。

もちろん、セキュリティ上で重要な値(トークン、鍵など)に使うのであれば、MD5で「意図的に衝突する」データを作れることは問題となります。ただ、それは意図して重複するデータを作った場合の話で、偶然に作っていての衝突確率はじゅうぶんに低いです。

とはいえ、rand()の品質は絶望的に悪いので、OpenSSLの使える環境ならMD5を使わずに、openssl_random_pseudo_bytes()から暗号学的にも安全な擬似乱数を得てしまうのがいいかと思います(上の「誕生日攻撃」にもあるように、長さを長くすれば実用上衝突を無視することができるレベルは容易に達成できます)。

投稿2016/10/21 05:56

編集2016/10/21 05:57
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

subcig

2016/10/21 06:00

ありがとうございました。
guest

0

md5でも良いですし、sha1でもcryptでも良いと思いますが、個人的には
bin2hex(openssl_random_pseudo_bytes(桁数))
のような感じで作る事はありますが、
どちらにせよPKにする為に
キー発行->そのキーがDBにすでに登録されていないかのチェック->既存(衝突)すればもう一回発行
をパスしたキーを採用というふうに、衝突の可能性が低くてもこのチェックをしていれば良いと思います。

投稿2016/10/21 06:04

hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

人によって、プロジェクトによってみんな適時関数を作っていると思いますよ。

私は
・IPアドレス取得して
・発行時間取得して
・それぞれ違うアルゴリズムでハッシュ化して
・くっつけて
・更にsha256以上でハッシュ化
してます。

投稿2016/10/21 06:00

takepieee

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問