HWRandはIntelプロセッサのRDRAND、RDSEED命令を用いた乱数生成を行うためのSecureRandom実装です。 RDRANDはNIST SP 800-90A、RDSEEDはNIST SP 800-90BとCに対応しているようです。 The Difference Between RDRAND and RDSEED
NIST SP 800-90A~Cは JEP 273: DRBG-Based SecureRandom Implementations として、JDK 9で実装が追加される予定ですが、HWRandを利用することで、Linux x86/x86_64環境ではJDK 8以前でもこれらの乱数が利用可能となります。
- JDK 6以降
- Linux x86_64
- 動作チェックはUbuntu 20.04 (WSL2) x86_64で実施
- ビルドにはJDK、GCC、GNU Make、GNU Assembler、Maven必須
JDK 22 以降の場合は Foreign Function & Memory API を用いた、RDRAND / RDSEED 各命令のダイレクト呼び出しをサポートします。これは Linux だけでなく Windows でも動作します。
JAVA_HOME=/path/to/jdk8 mvn compile test
JAVA_HOME=/path/to/jdk22 mvn package
- SecureRandom#getInstance(String) にそれぞれの引数を与えてインスタンスを取得してください。
- RDRAND(NIST SP 800-90A)
- X86RdRand
- FFMX86RdRand
- RDSEED(NIST SP 800-90B/C)
- X86RdSeed
- FFMX86RdSeed
- RDRAND(NIST SP 800-90A)
- 具体的な利用方法については テストコード もご覧ください。
- HWRandは、実行されるプロセッサがRDRAND、RDSEEDをサポートするか判断し、未サポートのCPUの上では当該機能が利用できません。
- RDRAND(NIST SP 800-90A)
- Ivy Bridge以降
- RDSEED(NIST SP 800-90B/C)
- Broadwell以降
- RDRAND(NIST SP 800-90A)
- 実装は SecureRandomSpi に対して行っていますが、engineGenerateSeed()とengineNextBytes()は同じ挙動(同じソースからの乱数取得)となります。また、engineSetSeed()は何も行いません(空実装です)。
- クラッシュ等、アプリケーションが異常終了した場合は一時ディレクトリに生成されるネイティブライブラリ(
libhwrandx86-*.so
)が残存する場合があります(デフォルトでは/tmp
配下)。
GNU General Public License v2