現在の位置: ホーム> 最新記事一覧> [UniQIDとMT_RANDを使用して、より安全な一意のIDを生成する方法は?

[UniQIDとMT_RANDを使用して、より安全な一意のIDを生成する方法は?

gitbox 2025-07-26

uniqid関数

UniQID関数は、PHPの組み込み関数の1つであり、現在の時間に基づいて一意のIDを生成するために使用されます。その構文は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$prefix</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$more_entropy</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
  • $プレフィックス:生成された一意のIDにプレフィックスされるオプションの文字列パラメーター。

  • $ more_entropy :boolean値は、生成されたIDにランダムな文字を追加するかどうかを決定し、その複雑さを増やし、デフォルトでfalseになります。

UniQIDの生成方法は、現在のタイムスタンプ(マイクロ秒)に基づいており、高精度が高いため、ほとんどの場合、生成されたIDは一意です。たとえば、 uniqid()を呼び出すと、 5f5d5e5c8f1a7に似たIDが取得されます。

欠点:

UniQidは現在の時刻に基づいて一意の値を生成しますが、それはあまり安全ではありません。タイムスタンプは連続的に成長するため、 UniQIDが同時に複数回呼び出された場合、生成されたIDは同じかもしれません。さらに、デフォルトでUNIQIDによって生成されたIDはタイムスタンプに基づいているため、攻撃者がタイムスタンプが成長する順序を予測できる場合、生成されたIDは推測しやすくなります。


MT_RAND関数

MT_RANDは、PHPの擬似ランダム数ジェネレーターです。 RAND関数と比較して、 MT_RANDはより効率的であり、高品質の乱数を生成します。構文は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$min</span></span><span> = PHP_INT_MIN, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$max</span></span><span> = PHP_INT_MAX): </span><span><span class="hljs-keyword">int</span></span><span>
</span></span>
  • $ min :生成された乱数の最小値、デフォルトはphp_int_minです。

  • $ max :生成された乱数の最大値、デフォルトはphp_int_maxです。

MT_RANDは、指定された範囲内でランダムな整数を返します。これは疑似ランダムですが、一般的な乱数要件には十分です。

欠点:

MT_RANDは非常にランダムですが、依然として擬似ランダムであり、暗号的に安全な乱数ではありません。生成されたIDが高度なセキュリティである必要がある場合(推測や衝突の防止など)、十分に安全ではない場合があります。


UniQidMT_RANDの使用方法は?

一意のIDを生成するセキュリティを改善するために、 UniQIDMT_RANDを一緒に使用できます。これにより、生成されたIDがタイムスタンプにランダム性を追加することが保証され、衝突の難しさが強化されます。

組み合わせ方法:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateSecureId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$prefix</span></span></span><span> = </span><span><span class="hljs-string">""</span></span><span>) {
    </span><span><span class="hljs-comment">// 一意の時間ベースを生成します ID</span></span><span>
    </span><span><span class="hljs-variable">$uniqid</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-variable">$prefix</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
    
    </span><span><span class="hljs-comment">// 唯一 ID 乱数を追加します</span></span><span>
    </span><span><span class="hljs-variable">$randomNumber</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(</span><span><span class="hljs-number">100000</span></span><span>, </span><span><span class="hljs-number">999999</span></span><span>);

    </span><span><span class="hljs-comment">// スプライシングによって生成される一意 ID および乱数</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$uniqid</span></span><span> . </span><span><span class="hljs-variable">$randomNumber</span></span><span>;
}
</span></span>

サンプル出力:

 <span><span><span class="hljs-variable">$secureId</span></span><span> = </span><span><span class="hljs-title function_ invoke__">generateSecureId</span></span><span>(</span><span><span class="hljs-string">"order_"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$secureId</span></span><span>;
</span></span>

出力は次のようになるかもしれません:

 <span><span>order_60d17e5c5f1b4.829278031116635204001234
</span></span>

上記の方法では、 UNIQID関数は時間に基づいて一意の部分を生成し、 MT_RANDは高品質の擬似ランダム数を追加します。結合されたIDを予測するのはより困難です。これにより、タイムスタンプの独自性が保証されるだけでなく、複数の同一のIDを同時に生成する問題も回避できます。


なぜUniQIDMT_RANDの組み合わせが必要なのですか?

  1. ランダム性の増加:タイムスタンプに基づいてUniQIDによって生成されたIDには特定の順序があり、攻撃者によって推測される場合があります。 MT_RANDによって生成された乱数は予測不可能性を高め、IDを推測するのがより困難になります。

  2. 衝突の防止UNIQIDのみを使用します。IDの生成間の時差が非常に小さい場合、衝突が発生する可能性があります(つまり、生成されたIDは同じです)。 MT_RANDの導入により、ランダム因子が追加され、衝突の確率が効果的に減少します。

  3. セキュリティの改善:いくつかのシナリオ(支払いシステム、ユーザー検証など)では、IDには機密情報が含まれたり、推測を防ぐ必要がある場合があります。 UniQIDのみに依存している場合、セキュリティリスクがある可能性があり、 MT_RAND乱数を追加すると生成されたIDがさらに予測不可能になります。