メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL の RAND() は、クエリ結果のシャッフルなどに使う疑似乱数を生成します。暗号学的に安全ではないため、トークン、ソルト、またはノンスを生成する場合には問題になります。RANDOM_BYTES() がそのギャップを埋め、VillageSQL の vsql_crypto 拡張機能は、統一された暗号 API の一部として gen_random_bytes() と gen_random_uuid() を追加します。

MySQL のランダム関数

MySQL には、目的が大きく異なる 2 つの組み込みランダム関数があります。 RAND() — 0 から 1 の間の疑似乱数の浮動小数点数を返します。高速で、セキュリティに関係しない用途に適しています。クエリ結果のランダム化、重み付きサンプリング、ランダムな行の選択などです。暗号学的に安全ではありません。
RANDOM_BYTES(n) — 暗号学的に安全な n バイトのランダムなバイト列を VARBINARY として返します。トークン、ソルト、ノンス、および鍵にはこれを使います。

VillageSQL の場合: gen_random_bytes() と gen_random_uuid()

VillageSQL の vsql_crypto 拡張機能は gen_random_bytes() と gen_random_uuid() を追加します。これらは、RANDOM_BYTES() と同じエントロピー源である OpenSSL の RAND_bytes() を使用します。
組み込み関数ではなくこれらを使う主な理由は一貫性です。すでに vsql_crypto の digest()、hmac()、または encrypt() を使っている場合、すべての暗号操作を 1 つの拡張機能にまとめておくと、アップグレードと監査が簡単になります。

テストデータの生成

ランダム関数はテストテーブルへのデータ投入に役立ちます。

ワンタイムトークンと招待コード

適切な関数の選択

RANDOM_BYTES() と gen_random_bytes() は機能的に同等で、どちらも同じ品質の乱数を返します。すでに vsql_crypto を使っている場合は、暗号関連の機能を 1 か所にまとめるために gen_random_bytes() を使います。ランダムなバイト列だけが必要で他に何も要らない場合は、MySQL の RANDOM_BYTES() で十分です。 ソート可能なバリアント(v7)とバイナリ格納を備えた UUID 型が必要な場合は、gen_random_uuid() ではなく vsql_uuid 拡張機能を使います。完全な比較は MySQL の UUID を参照してください。

よくある質問

RAND() はトークンの生成に安全ですか?

いいえ。RAND() は予測可能な状態からシードされる疑似乱数生成器です。ORDER BY RAND() などセキュリティに関係しない用途には問題ありませんが、RAND() で生成したトークンは理論上予測できます。セキュリティ上重要なものには RANDOM_BYTES() または gen_random_bytes() を使ってください。

安全なトークンには何バイト必要ですか?

セッショントークンと API キーには 32 バイト(256 ビット)が標準です。16 バイト(128 ビット)が実用的なセキュリティの最低ラインです。安全のために 32 バイトを使ってください。

gen_random_bytes() を DEFAULT として使用できますか?

いいえ。MySQL 自体は DEFAULT 式で非決定的な関数を許可しており、UUID()、RAND()、および NOW() はそこで機能します。gen_random_bytes() が拒否されるのは、非決定的として登録された VillageSQL 拡張機能の関数だからで、VEF は MySQL 自体が何を許可するかに関係なく、DEFAULT 式でそれらをブロックします。代わりに各 INSERT ステートメントで値を生成してください。

gen_random_uuid() と vsql_uuid の UUID_V4() の違いは何ですか?

gen_random_uuid() は VARCHAR の UUID 文字列を返します。vsql_uuid 拡張機能の UUID_V4() は、16 バイトのバイナリ格納を持つネイティブの UUID 型を返します。UUID を主キーとして使う場合は、vsql_uuid の UUID_V4() または UUID_V7() を優先してください。UUID 文字列が必要で、別の拡張機能をインストールしたくない場合は gen_random_uuid() を使います。

トラブルシューティング

関連項目