13

PHP を使用して、暗号的に安全な一意の uuid を生成したいと考えています。

uniqid() は一意ではあるがセキュアではない ID を提供し、openssl_random_pseudo_bytes() はセキュアではあるが一意ではない ID を提供します。2つ(次のコード)の組み合わせは適切なアプローチですか、それともより良い解決策がありますか?

uniqid(bin2hex(openssl_random_pseudo_bytes(10)), true);
4

3 に答える 3

0

一番上の答えは実際には正しいですが、理論的には正しくありません。

あなたの質問にも完璧な答えはありません。

セキュリティは、偏りのない、予測不可能な真のランダム性に依存しています。しかし、本当にランダムなものは常に繰り返される可能性があり、そうでない場合はランダムではありません。100 万面のサイコロが連続して 100 万回同じ数字に出る可能性がありますが、その確率は非常に低いです。

UUIDv4 の強みは、同じ ID を 2 回取得する (衝突する) 確率が天文学的に小さいことです。「銀河から同じ原子を 2 回選択する」ということは、かなり小さいことです。

一意性を追加しようとすると、実際にはセキュリティが低下します。一意性を保証するために、マイクロ秒のタイムスタンプまたは自動インクリメント値とミリメートル精度の空間座標を追加できます。しかし、その後、ID が作成された場所、方法、および順序に関する情報を追加します...

繰り返しになりますが、すべての実用的な目的のために、UUIDv4 を安全で一意の識別子として使用しても安全です。

またmd5sha1uniqid、 などはそれ自体では完全ではなく、それらをランダムに組み合わせても衝突が減少したり、セキュリティが向上したりするとは限りません。ハッシュ関数は、せいぜいハッシュしているものと同じくらい一意であり、通常は一意性を低下させます。

答えは常に、ランダム性と長さにあります。

于 2016-10-27T11:50:01.360 に答える
-1

openssl_random_pseudo_bytes の出力をハッシュしないのはなぜですか? タイムスタンプを連結して、後でハッシュすることもできます

md5(bin2hex(openssl_random_pseudo_bytes(10)).strval(time()));

例として md5 を使用します。任意のハッシュ アルゴリズムを使用できます。

于 2015-07-16T10:24:32.140 に答える