C++ 乱数生成ライブラリがセキュリティ対パフォーマンスのトレードオフを巡って激しい議論を引き起こす

BigGo Editorial Team
C++ 乱数生成ライブラリがセキュリティ対パフォーマンスのトレードオフを巡って激しい議論を引き起こす

WELL(Well Equidistributed Long-period Linear)ジェネレータを特徴とする新しい C++ 乱数生成ライブラリが、すべてのアプリケーションにおいて暗号学的に安全な乱数生成器をデフォルトの選択肢とすべきかどうかについて、プログラミングコミュニティで熱い議論を巻き起こしている。

このライブラリは、クロスプラットフォーム再現性や最適化された分布アルゴリズムなどの機能を備えた高性能な疑似乱数生成に焦点を当てており、ソフトウェア開発におけるセキュリティ対パフォーマンスに関するより広範な哲学的議論の中心となっている。

WELL ジェネレータファミリー比較

  • WELL44497b と WELL19937a は、異なるプログラミング言語において TestU01 で「逆転した」結果を示す
  • 状態空間サイズの最適化は主に TBit と MASK 値に依存する
  • 追加パラメータ(K、J)は制約を提供するが、テストバッテリーのパフォーマンスに大きな影響を与えない

セキュリティ優先論に強い反発

最も議論を呼んだ点の一つは、ある開発者が非暗号化乱数生成器の使用例は極めて少ないと主張し、すべての乱数生成はデフォルトで暗号学的に安全であるべきだと提案したことだった。証明可能なセキュリティ保証を提供する Randen のようなアルゴリズムを支持するこの立場は、コミュニティから大きな抵抗を受けた。

批判者たちは、このアプローチが持つ大きなパフォーマンスへの影響を素早く指摘した。複数の開発者が、科学、ニューラルネットワーク、シミュレーション、ゲーム、レンダリング、気象モデリング、核研究、ロボティクス、信号処理を含む多数の業界で、数十億から数兆の乱数を迅速に必要とすることを強調した。これらのアプリケーションにとって、暗号学的に安全なジェネレータのオーバーヘッドは禁止的なものとなるだろう。

セキュリティに関する考慮事項

  • ChaCha CSPRNG 実装では、シードエントロピーが不十分な可能性がある(32-64ビット)
  • 出力ストリームは2^32ブロック後にラップアラウンドするが、拡張可能
  • Randen アルゴリズムは AES プリミティブに基づく証明可能なセキュリティを提供
  • Linux vDSO getrandom() は高速で暗号学的に安全な乱数を提供(2024年7月にマージ)

API 設計哲学が技術的議論を引き起こす

会話は基本的な API 設計原則、特にシード機構についても深く掘り下げられた。開発者たちは、便利な関数が手動シードを許可すべきか、常にエントロピーソースを使用すべきかについて議論した。この議論は、後方互換性とセキュリティ改善の間の古典的な緊張関係を明らかにし、glibc の rand() 関数のようなレガシーシステムが API 契約のために時代遅れのアルゴリズムに縛られ続けていることへの言及もあった。

提案された興味深い技術的解決策の一つは、スレッドローカルストレージを使用して利便性と適切なシードの両方を提供することで、現代の C++ 機能が従来の乱数生成の課題にどのように対処できるかを実証していた。

パフォーマンス主張に懐疑的な見方

標準ライブラリのパフォーマンスの100-105%で動作する一部のジェネレータを示すライブラリのパフォーマンスベンチマークは、経験豊富な開発者たちの間で眉をひそめさせた。これらの数値の信憑性を疑問視する者もいれば、浮動小数点数生成やクロスプラットフォーム一貫性に対するライブラリのアプローチのような、より実用的な懸念に焦点を当てる者もいた。

議論では、暗号学的に安全な乱数への高速アクセスを提供する Linux の vDSO getrandom() のような新興のカーネルレベルソリューションにも触れられたが、開発者たちは、これが高スループットアプリケーション向けの特殊化された疑似乱数ジェネレータよりも依然として大幅に遅いことを指摘した。

パフォーマンス比較の主張

  • std::minstd_rand: 100%ベースラインパフォーマンス
  • std::mt19937: ベースラインパフォーマンスの105%
  • ライブラリは、クロスプラットフォームシーケンス一貫性を持つ、より高速な均等分布/正規分布を主張
  • ゲーミング/ファジング用途向けの popcount ベースの二項近似を使用した高速正規分布

結論:文脈が重要

この議論は最終的に、ソフトウェア開発における重要な原則を再確認した:適切なツールを適切な仕事に選ぶこと。暗号学的に安全なジェネレータはセキュリティに敏感なアプリケーションには不可欠だが、科学計算、ゲーム、シミュレーション作業における乱数使用の大部分は、特殊化された疑似乱数ジェネレータが提供する速度と決定性を必要とする。

「適切なツールを適切な仕事に使用せよ。物事が何に使用されるかについて視野を広げよ。」

この議論は、異なる領域が大きく異なる要件を持つことを浮き彫りにし、常に暗号学的に安全なジェネレータを使用するという包括的な推奨事項が、プログラミングコミュニティの多様なニーズを考慮していないことを示した。

参考: well-random