安全なワンタイム認証トークンを生成するために、uuid主キー列でPostgresのuuid_generate_v4を使用しています。よろしいですか? PostgresはこれらのUUIDの生成に安全な乱数ソースを使用しますか、それともデータベースに挿入する前にアプリケーション側で安全な乱数ソースを使用してそれらを生成する必要がありますか?
PostgreSQLドキュメント は、UUIDの生成が OSSPライブラリ に依存していることを示しています。 OSSP(バージョン1.6.2)のソースコードを見ると、コードはUnixライクなシステムでは_/dev/urandom
_を使用しており(WindowsではCryptGenRandom()
)、はるかに弱いPRNG現在時刻、プロセスID、およびCライブラリRand()
関数に基づいています。幸い、2つの出力はXORされるため、_/dev/urandom
_を使用すれば、強力なランダム性、他の弱さに関わらずPRNG可能性があります。残念ながら、何らかの理由で_/dev/urandom
_のオープンが失敗した場合(たとえば、プロセスが不足した場合)その時点での空きファイル記述子の数)、ライブラリは弱いPRNG=のみの使用にフォールバックし、警告はありません。
したがって、PostgreSQLによって生成されるv4 UUIDは通常に暗号学的に強力なランダム性の122ビットを含める必要がありますが、その発生をテストする信頼できる方法がないため、常にはるかに弱い動作に低下する可能性があります。また、これは実際に文書化されているようには見えないため、他のライブラリバージョンでは変更される可能性があります。したがって、注意はnotがPostgreSQLによって生成されたUUIDの強力なランダム性に依存し、代わりにアプリケーション側で明示的に強力なランダムソースを使用することをお勧めします(通常_/dev/urandom
_、ただしnotアクセスエラーを非表示にします)。