2017-06-17 25 views
1

アプリケーションを起動するたびに、最大確率でメッセージが選択されていないように、128ビットのランダムメッセージを作成する必要があります。これは安全でなければなりません(つまり、 )。例えば、システム時刻から取得したシードを持つ標準ランダムジェネレータを使用すると、システム時刻を何とかフリーズすることで壊れる可能性があるため、安全ではありません(これは何とかできますか?)。C++:CryptGenRandomへの移植可能な代替方法

Windowsの機能CryptGenRandomがこれに適しているようです。しかし、移植可能な代替品はありますか?そうでない場合は、LinuxとMacに対応する機能はありますか?

+1

これは簡単ではないかもしれません。いくつかの発言(imhoを慎重に提示しているビットがあるが)はここにある(http://www.pcg-random.org/posts/simple-portable-cpp-seed-entropy.html)。コアメッセージは、std :: random_deviceにいくつかの欠陥があるかもしれないが、私は決してそれと連絡を取ったことがなく、おそらくそれはあなたを助けるだろうということです。それにもかかわらず、あなたの質問は少し広いです。たぶんあなたのcryptoPRNGの現在の状態をローカルのDBやファイルに保持するほうがずっと簡単です(これは非常に簡単です(1つのinitだけが必要です; collision-probは無視されます)。もちろん、これは正確なユースケースに依存します。 – sascha

+0

@sascha:興味深いリンク、またstd :: random_deviceが役に立つかもしれません。ありがとう、これは役に立ちました! –

答えて

3

Windowsの関数CryptGenRandomがこれに適しているようです。しかし、移植可能な代替品はありますか?

これはどのように表示されるかによって異なります。プラットフォームのRNGの周りを直接ラップできるスタンドアロンのラッパーがあるかどうかはわかりません。しかし、ほとんどの暗号ライブラリには、OS乱数ジェネレータからのシード自体を直接参照するか、より可能性が高いランダムジェネレータがあります。

例えば、AutoSeededの暗号化の生成器++ hereについて読んでください。これらのライブラリは、OSによって提供される機能を抽象化して、基盤となるプラットフォームへの呼び出しを最小限に抑える移植性のあるオプションを提供します(つまり、セキュリティーはともにです)。

対応していない場合、対応するLinuxとMacの機能はありますか?

暗号ランダムを直接使用する場合は、/dev/urandomを使用してください。一般に、ブロックする可能性のある/dev/randomを使用する理由はありません。私はよく検証されたライブラリを使用することをお勧めします。あなたはそれがOSの乱数発生器が十分にランダムであることを確認するために支払う埋め込みまたは仮想化デバイス& OSを使用している場合は特に


。仮想化されたシステムでは、VM拡張機能がOS用にインストールされていることを確認することをお勧めします。

乱数ジェネレータにも追加のシードが追加される可能性があります。乱数の強度が不明な場合は、シードとして追加することをお勧めします。

インテルRD_RANDなどのRNG拡張機能(OSまたはライブラリで使用される)を持つCPUを持つことはもちろん意味があります。

関連する問題