تولد مفاتيح آمنة تشفير وآمنة من الناحية التشفية و IVEC

StackOverflow https://stackoverflow.com/questions/4303607

سؤال

خلفية

أقوم بتصميم نظام يمكّن تطوير مخططات المصادقة الديناميكية لمستخدم محتوى ويب ثابت. يتمثل الدافع في تكوين كميات كبيرة من محتوى الويب المعقد إلى الوراثي ، ولكن الحساسة ، ثم تقديمها بشكل ثابت مع مصادقة ملفات تعريف الارتباط (تضمين المعلومات المشفرة بشكل عكسي) في مكانها ، والتي يفرضها خادم الويب في حدود. باستخدام تشفير الوضع AEAD بدائي.

المشكلة

أحتاج إلى إنشاء IVEC والمفاتيح الصالحة للمدة الزمنية ، على سبيل المثال أسبوع واحد (الزوج الحالي المعدل). وأن IVECs/المفاتيح السابقة صالحة أيضًا لمدة أسبوعين (تاريخيا-valid) وأي بيانات مشفرة مع الأسرار الصالحة تاريخيا سيتم إعادة إدراجها مع IVEC/المفتاح الحالي.

ما أحتاجه هو csprng حتمية تفيد البذور ذات الأرقام العشوائية وبقالة المرور والتي يمكن أن تنتج بطريقة فهرسة 64 بت أو 128 بت من الأرقام. إذا كنت أستخدم أسابيع-خلال 1 يناير 1970 "كأحد العناصر الفهرسة في CSPRNG الافتراضية ، يجب أن أكون قادرًا على إنشاء نظام يغير المفاتيح بشكل تلقائي مع مرور الوقت.

النهج الذي أفكر فيه

الآن لا أرى مثل هذه الوظيفة في Cryptopp ، أو أعرف الآن المصطلحات جيدًا بما يكفي ، وبما أن Cryptopp هو الأكثر تقدماً في مكتبات التشفير هناك ، فلن أجد ثقة أخرى. لذا ، إذا لم أتمكن من العثور على تطبيق هناك ، فيجب أن أتعامل مع بلدي. هل سيؤدي إنشاء بنية سلسلة ثابتة من البيانات المتسلسلة ثم تجزئةها (كما هو موضح أدناه) هل الخدعة؟

RIPEMD160 (RandommeredfixedNonce: passphrase: uint64sinceepoch: 128BitBlockIndexNumber) ؛

ملاحظة: سيتم تعيين blocknumbers ولها بنية منتظمة ، لذلك على سبيل المثال لهضم 128 بت ، أول 64 بت من الكتلة 0 ستكون لـ IVEC ، وكل العنصر 1 للمفتاح 128 بت.

هل هذا نهج سليم (-. ، آمن من الناحية التشفية)؟

-تحرير: ما بعد قبول التعليق-

بعد بعض الانعكاس ، قررت دمج ما اعتبرته في الأصل عبارة الممر و nonce/salt في مفتاح 16 بايت (تشفير قوي) ، واستخدم التقنيات الموضحة في PKCS #5 لاستخلاص مفاتيح متعددة القائمة على الوقت. لا توجد حاجة إلى ملح ، حيث لا تستخدم عبارات المرور.

هل كانت مفيدة؟

المحلول

سؤال مهم.

أولاً ، لا يجب أن تكون المتجهات الأولية لك كميات عشوائية قوية من الناحية التشفية ، لكنها ينبغي كن فريدًا لكل وسيلة. إن IV هو في الحقيقة مجرد نوع من قيمة الملح التي تضمن أن الرسائل المماثلة المشفرة باستخدام نفس المفتاح لا نظرة مماثلة بمجرد تشفيرها. يمكنك استخدام أي مولد سريع للعشوائي الزائفة لإنشاء IV ، ثم إرساله (يفضل التشفير) إلى جانب البيانات المشفرة.

المفاتيح ، بالطبع ، يجب أن تكون قوية بقدر ما يمكنك صنعها عمليا.

يبدو أن اقتراحك لتجزئة سلسلة نصية تحتوي على بيانات غير مميزة ، وبيانات الصلاحية ، يبدو لي أنها معقولة جدًا - إنها تتماشى بشكل واسع مع ما يتم القيام به من قبل نظام آخر يستخدم عبارة تمريرة لإنشاء مفتاح. يجب عليك تجزئة عدة مرات-وليس مرة واحدة فقط-لجعل الجيل الرئيسي مكلفًا من الناحية الحسابية (والتي ستكون مشكلة أكبر لأي شخص يحاول أن يحمل القدر من المفتاح مما هو بالنسبة لك).

قد ترغب أيضًا في إلقاء نظرة على مخطط الولادة الرئيسية المنصوص عليها في PKCS#5 (على سبيل المثال في http://www.faqs.org/rfcs/rfc2898.html) التي يتم تنفيذها في cryptopp مثل passwordbaredbanedkeyderivationfunction. يتم استخدام هذه الآلية بالفعل على نطاق واسع ومعروفة بأنها آمنة معقولة (لاحظ أن PKCS#5 توصي بتجزئة بيانات عبارة الممر 1000 مرة على الأقل). يمكنك فقط إلحاق فترة صلاحيتك وفهرس البيانات إلى عبارة الممر واستخدام PasswordBariveKeyderivationFunction كما هو الحال.

لا تقل ما هي خوارزمية التشفير التي تقترح استخدامها لتشفير البيانات ، لكنني أقترح أنه يجب عليك اختيار شيء على نطاق واسع ومعروف أنه آمن ... وعلى وجه الخصوص أقترح أن تستخدم AES. أود أن أقترح أيضًا استخدام إحدى وظائف SHA Digest (ربما كمدخلات لـ PasswordBasedKeyderivationFunction). SHA-2 حالي ، لكن SHA-1 يكفي لأغراض توليد المفاتيح.

لا تقل أيضًا ما هو طول المفتاح الذي تبحث عنه ، ولكن يجب أن تدرك أن كمية الانتروبيا في مفاتيحك تعتمد على طول عبارة المرور التي تستخدمها ، وما لم تكن عبارة المارة جداً منذ فترة طويلة سيكون أقل بكثير من الطول المفتاح الذي يتطلبه بشكل مثالي.

أضعف ارتباط في هذا المخطط هو عبارة الممر نفسه ، وهذا دائمًا ما يحد من مستوى الأمان الذي يمكنك تحقيقه. طالما أنك تسلل بياناتك (كما تفعل) وجعل الجيل الرئيسي مكلفًا لإبطاء هجمات القوة الغاشمة التي يجب أن تكون على ما يرام.

نصائح أخرى

ما أحتاجه هو csprng حتمية تفيد البذور ذات الأرقام العشوائية وبقالة المرور والتي يمكن أن تنتج بطريقة فهرسة 64 بت أو 128 بت من الأرقام. إذا كنت أستخدم أسابيع-خلال 1 يناير 1970 "كأحد العناصر الفهرسة في CSPRNG الافتراضية ، يجب أن أكون قادرًا على إنشاء نظام يغير المفاتيح بشكل تلقائي مع مرور الوقت.

حسنا ، أنا فكر في جزء من الحل هو استخدام مولد غير قائم على الوقت. وبهذه الطريقة ، إذا بدأ كلا الجانبين بنفس البذور ، فإن كلاهما ينتجون نفس الدفق العشوائي. يمكنك طبقة منطق "الأسابيع منذ الأسبوع الأول ، 1970" على رأس ذلك.

للقيام بذلك ، سوف تستخدم 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. إنه تطبيق رأس فقط ، ويمكنك العثور عليه في Wiki Crypto ++ عشوائي عدد المولدات.

انظر أيضا الموضوع قابلية اعادة الأنتاج إلى عن على RandomNumberGenerator الفصل على التشفير ++ ويكي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top