質問

バックグラウンド

静的Webコンテンツのユーザー向けに動的認証スキームの開発を可能にするシステムを設計しています。動機は、大量の複雑なものから生成的でありながら敏感なWebコンテンツを事前に生成し、その後、Cookieベースの(包括的に暗号化された情報を埋め込む)認証を設置して、Webサーバーによって施行された状態で静的に提供することです。 AEADモード暗号化プリミティブを使用します。

問題

1週間(現在のvalidペア)などの期間有効なIVECとキーを生成する必要があります。また、過去のIVECS/キーは、たとえば2週間(歴史的に検証)に有効であり、歴史的に有効な秘密で暗号化されたデータは、現在のValid IVEC/キーで再構築されます。

私が必要とするのは、乱数とパスフレーズの種子がインデックスされたファッション64ビットまたは128ビットの数字ブロックで生成できる決定論的なcsprngです。 「1970年1月1日」という1週間の「1970年1月1日」を使用すると、仮説的なCSPRNGのインデックス要素の1つとして使用すると、時間が経つにつれて本質的にキーを自動的に変更するシステムを構築できるはずです。

私が検討しているアプローチ

今、私はCryptoppにそのような機能を見ていません、または私は今では用語を十分に知っているようになりました、そして、Cryptoppはそこにある暗号化ライブラリの中で最も先進的であるため、私は別のものを見つける自信がありません。ですから、実装が見つからない場合は、自分のものを転がす必要があります。 Concatidedデータから静的文字列構造を生成し、それをハッシュする(以下に示す)。

RIPEMD160(RandOmpregeneratedFixedNonce:PassPhrase:UINT64SINCEPOCH:128BITBLOCKINDEXNUMBER);

注:ブロック数は割り当てられ、通常の構造があるため、たとえば128ビットダイジェストの場合、ブロック0の最初の64ビットはIVEC用で、128ビットキーのすべての要素1です。

これは健全なアプローチですか(-.ie、暗号化的に安全です)?

- 編集:コメントを受け入れる -

いくつかの反省の後、私はパスフレーズとノンセ/塩を最初に16バイト(暗号化された強い)キーに考えていたものをマージし、PKCS#5で概説されているテクニックを使用して複数の時間ベースのキーを導き出すことにしました。パスフレーズは使用されていないため、塩は必要ありません。

役に立ちましたか?

解決

興味深い質問。

まず、最初のベクトルは暗号化的に強いランダム量である必要はありませんが、それらは したほうがいい ユニークな一人のメッセージになりましょう。 IVは、実際には同じキーを使用して暗号化されていない同様のメッセージが保証される一種の塩値です 見る 暗号化されると似ています。任意のクイック擬似ランダムジェネレーターを使用してIVを生成し、暗号化されたデータとともに(できれば暗号化された)送信できます。

もちろん、キーは実際に作ることができる限り強力でなければなりません。

NonCe、PassPhrase、および有効性データを含むテキスト文字列をハッシュする提案は、私にとって非常に合理的であるように思われます。これは、パスフレーズを使用してキーを生成する他のシステムによって行われていることとほぼ一致しています。キージェネレーションを計算的に高価にするために、1回だけでなく、何度もハッシュする必要があります(これは、あなたよりもキーをブルートしようとしている人にとっては大きな問題になります)。

また、PKCS#5に記載されているキージェネレーションスキームをご覧ください(例: http://www.faqs.org/rfcs/rfc2898.html)CryptoppでパスワードBasedKeyDerivationFunctionとして実装されています。このメカニズムはすでに広く使用されており、合理的な安全性があることが知られています(PKCS#5は、少なくとも1000回パスフレーズデータをハッシュすることを推奨しています)。有効期間とインデックスデータをPassPhraseに追加して、パスワードBasedKeyDerivation機能を使用するだけで使用できます。

データを暗号化するために使用することを提案する暗号化アルゴリズムは言うことはありませんが、広く使用され、安全であることが知られているものを選択することをお勧めします...特にAESを使用することをお勧めします。また、SHAダイジェスト関数の1つを使用することをお勧めします(PasswordBasedKeyDerivation機能への入力として)。 SHA-2は最新ですが、SHA-1は主要な生成の目的で十分です。

また、生成しようとしているキーの長さは言うこともありませんが、キーのエントロピーの量は、使用するパスフレーズの長さに依存し、パスフレーズが使用されない限り、 非常に それは理想的に必要なキーレングよりもはるかに少なくなります。

このスキームの最も弱いリンクはパスフレーズ自体であり、それは常にあなたが痛む可能性のあるセキュリティのレベルを制限します。 (あなたがしているように)データを塩漬けし、主要な世代を高価にしてブルートフォース攻撃を遅くする限り、あなたは大丈夫です。

他のヒント

私が必要とするのは、乱数とパスフレーズの種子がインデックスされたファッション64ビットまたは128ビットの数字ブロックで生成できる決定論的なcsprngです。 「1970年1月1日」という1週間の「1970年1月1日」を使用すると、仮説的なCSPRNGのインデックス要素の1つとして使用すると、時間が経つにつれて本質的にキーを自動的に変更するシステムを構築できるはずです。

まあ、私 考える ソリューションの一部は、非時間ベースのジェネレーターを使用することです。そうすれば、双方が同じ種子で始まる場合、両方とも同じランダムストリームを生成します。その上に、「1970年の第1週からの週」の論理を重ねることができます。

それを行うには、使用します OFB_mode<T>::Encryption. 。 Ofbモードを使用するため、発電機として使用できます AdditiveCipherTemplate<T>, 、由来する RandomNumberGenerator.

実際、CRPYTO ++はジェネレーターを使用します test.cpp そのため、何かが失敗した場合に結果を再現できます。使用方法は次のとおりです OFB_mode<T>::Encryption. 。また適用されます CTR_Mode<T>::Encryption:

SecByteBlock seed(32 + 16);
OS_GenerateRandomBlock(false, seed, seed.size());

for(unsigned int i = 0; i < 10; i++)
{
    OFB_Mode<AES>::Encryption prng;
    prng.SetKeyWithIV(seed, 32, seed + 32, 16);

    SecByteBlock t(16);
    prng.GenerateBlock(t, t.size());

    string s;
    HexEncoder hex(new StringSink(s));

    hex.Put(t, t.size());
    hex.MessageEnd();

    cout << "Random: " << s << endl;
}

通話 OS_GenerateRandomBlock からバイトを取得します /dev/{u|s}random そして、それをシミュレートされた共有シードとして使用します。プログラムの各実行は異なります。プログラムの各実行内で、次のように印刷します。

$ ./cryptopp-test.exe
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD

同じことを行う別のジェネレーターがありますが、Crypto ++ライブラリの一部ではありません。それは呼ばれています AES_RNG, 、およびAES-256に基づいています。そのヘッダーのみの実装、そしてあなたはそれをcrypto ++ wikiで見つけることができます ランダムナンバーゲネレーター.

トピックも参照してください 再現性 にとって RandomNumberGenerator Crypto ++ Wikiのクラス。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top