CakePHP にレコードを挿入するときに、真に一意のトークンを作成する必要があります。テーブルには何百万もの行が含まれている可能性があるため、ランダムに生成された文字列に基づいているだけではありません。microtime()
2 つのレコードがまったく同時に送信される可能性は非常に低いですが、あるため、a も使用したくありません。もちろん、最善の解決策は を使用することString::uuid()
ですが、cakephp のドキュメントから
uuid メソッドは、 RFC 4122に従って一意の識別子を生成するために使用されます。uuid は、485fc381-e790-47a3-9794-1337c0a8fe68 の形式の 128 ビット文字列です。
だから、私が理解している限り、それはその生成にケーキのセキュリティソルトを使用していません. そのため、セキュリティ コンポーネントのハッシュ関数 (または認証パスワード関数) によってハッシュすることにしました。これは、一意であると同時に非常に安全である必要があるためです。しかし、それは良い考えではないと言って質問を見つけましたが、php uniqidとmd5の場合です。 MD5 で UUID を使用するのが得策ではないのはなぜですか?
また、セキュリティ コンポーネントによってハッシュされた文字列は、推測するのがはるかに難しいと思います。たとえばString::uuid()
、for ループには次のような出力があるためです。
for ($i = 0; $i < 30; $i++) {
echo String::uuid()."<br>";
}
die;
// outputs
51f3dcda-c4fc-4141-aaaf-1378654d2d93
51f3dcda-d9b0-4c20-8d03-1378654d2d93
51f3dcda-e7c0-4ddf-b808-1378654d2d93
51f3dcda-f508-4482-852d-1378654d2d93
51f3dcda-01ec-4f24-83b1-1378654d2d93
51f3dcda-1060-49d2-adc0-1378654d2d93
51f3dcda-1da8-4cfe-abe4-1378654d2d93
51f3dcda-2af0-42f7-81a0-1378654d2d93
51f3dcda-3838-4879-b2c9-1378654d2d93
51f3dcda-451c-465a-a644-1378654d2d93
51f3dcda-5264-44b0-a883-1378654d2d93
したがって、文字列の一部は似ていますが、ハッシュ関数を使用する場合、結果はかなり異なります
echo Security::hash('stackoverflow1');
echo "<br>";
echo Security::hash('stackoverflow2');
die;
// outputs
e9a3fcb74b9a03c7a7ab8731053ab9fe5d2fe6bd
b1f95bdbef28db16f8d4f912391c22310ba3c2c2
それで、問題は、結局のところ、Cake で uuid() をハッシュできるかということです。または、真に一意でハッシュ化された(私のセキュリティソルトによると)安全なトークンを取得するための最良の安全な方法は何ですか.
アップデート
安全なトークンとは、推測するのがいかに難しいかということです。UUID は非常にユニークですが、上記の例から、いくつかのレコードには類似性があります。しかし、ハッシュされた結果はそうではありません。
ありがとう !!