機密データを管理する安全なアプリケーションを開発しているので、何らかの安全なログイン メカニズムが必要です。私は Qt ライブラリ (C++ バージョン) を使用していますが、これまでのところ、ユーザーがアプリケーションからアカウントを作成するときに、この [暗号的に安全な疑似乱数ジェネレーター] を提供してソルトを取得する関数が見つかりません。パスワードをデータベースに保存する方法については認識しており、新しいソルトを作成するときは CSPRNG が必須のようです。Qtでこれを行う方法を見つけようと長い間探していましたが、Qtだけでこれを行う方法はないという結論に達しました。むしろ、少なくともありますかこれを行うためのクロスプラットフォーム、C++ アプローチ? ライブラリを含めても問題ありませんが、LGPL にしたいので、将来、独自の/クローズド ソースのアプリケーションを開発することを選択した場合でも、同じ方法を使用できます。追加情報として、今のところ SQL (MSSQL Express サーバー) を使用する可能性は低いので、SQL タグを追加します。それが役立つ場合は、おそらくQSslSocketも(クライアント/サーバー間の暗号化のために)使用する予定です。これではなく、いくつかの光を当てることができれば、私はとても感謝しています!
3 に答える
ソルトを生成するために暗号的に安全な PRNG が必要だと思われる場合は、ソルトとは何か、ソルトがどのように、なぜ機能するのか、どのような種類の攻撃に対して役立つのかを理解していないことをお伝えしなければなりません。
ソルトは、ソルト化されたパスワードのハッシュと一緒にプレーンテキストで保存する必要があるという単純な事実から、ソルト用の暗号的に安全な PRNG、またはそのための PRNG は実際には必要ないことがわかります。率直に言って、新しいソルトが必要になるたびに 1 ずつ増やす単純な 64 ビットの数値を使用できます。これは、暗号的に安全な PRNG によって生成されたソルトと同じくらい安全です。
標準ライブラリには、非決定論的 RNG へのアクセスを提供することを目的とし<random>
た が含まれています。std::random_device
暗号化された pRNG を提供するとは限らないため、関心のあるプラットフォームを確認する必要があります。
libc++ はデフォルトで /dev/urandom を使用します。これは、OS X (Yarrow) および Linux の crypto-pRNG です (枯渇する可能性があるエントロピー プールを使用します。代わりに「/dev/random」を使用するように random_device に指示することができます)。 .
libstdc++ IIRC は、マクロに応じて「/dev/urandom」を使用するか、決定論的な pRNG を使用します。
VS2012 の VC++ は、非決定論的なstd::random_device
. 以前のバージョンは確定的です。
の実装の中にrandom_device
は決定論的なものがあるため、代わりに Boost の random_device の実装を使用したい場合があります。Linux および OS X ではデフォルトで「/dev/urandom」を使用し、Windows では暗号化サービス プロバイダー「MS_DEF_PROV」を使用します。
OpenSSL の crypto ライブラリには、「暗号的に安全な疑似乱数ジェネレータ (PRNG) を実装する」 rand関数があります。
OpenSSL は 10 年以上前から存在しており、現在も活発に開発されています。
ここに OpenSSLライセンスがあります。