VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
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() を使います。
トラブルシューティング
関連項目
- MySQL でのパスワードハッシュ — 資格情報の保存でランダムなバイト列をソルトとして使う
- MySQL の UUID — UUID v4 は暗号学的な乱数のよくある用途