मैं एक Linux बूट-टाइम (kinit) सिग्नेचर चेकर पर ECC प्रमाणपत्रों का उपयोग करके काम कर रहा था, जो बदल रहा था कच्चे आरएसए हस्ताक्षरों से लेकर सीएमएस-प्रारूप ईसीसी हस्ताक्षरों तक। ऐसा करने में, मैंने पाया CMS_Verify() फ़ंक्शन तब तक रुका रहता है जब तक कि कर्नेल "crng init did" प्रिंट नहीं कर लेता, यह दर्शाता है कि यह क्रिप्टोग्राफ़िक रूप से सुरक्षित रैंडम नंबर जनरेशन के लिए पर्याप्त सिस्टम एन्ट्रॉपी होने की प्रतीक्षा करें। चूंकि सिस्टम में और कुछ नहीं चल रहा है, इसलिए बीगलबोन ब्लैक पर इसमें लगभग 90 सेकंड का समय लगा।

इसने मुझे आश्चर्यचकित कर दिया, मुझे उम्मीद है कि प्रमाणपत्र निर्माण के लिए या शायद हस्ताक्षर पीढ़ी के लिए सुरक्षित यादृच्छिक संख्याओं की आवश्यकता होगी, लेकिन सार्वजनिक-कुंजी हस्ताक्षर सत्यापन में सुरक्षा के लिए कोई रहस्य नहीं है। तो क्या देता है?

(मैंने इसे समझ लिया लेकिन समाधान कहीं और नहीं ढूंढ पाया, इसलिए उत्तर दूसरों के लिए नीचे है)।

2
Corey Mutter 15 अप्रैल 2020, 20:49

1 उत्तर

सबसे बढ़िया उत्तर

एक श्रमसाध्य डिबग-बाय-प्रिंटफ प्रक्रिया के माध्यम से (मेरा सबसे अच्छा विकल्प यह एक किनीट है), मैंने पाया कि एक मौलिक ईसीसी ऑपरेशन साइड-चैनल हमलों के खिलाफ बचाव के रूप में यादृच्छिक संख्याओं का उपयोग करता है। इसे "ब्लाइंडिंग" कहा जाता है और कुछ अनिश्चितता को जोड़कर हमलावरों को गणना में कितना समय लगता है, कैश मिस, पावर स्पाइक्स आदि के आधार पर रहस्यों को बाहर निकालने से रोकने में मदद करता है।

ओपनएसएसएल स्रोत के भीतर गहरी टिप्पणियों से:

/*-
* Computes the multiplicative inverse of a in GF(p), storing the result in r.
* If a is zero (or equivalent), you'll get a EC_R_CANNOT_INVERT error.
* Since we don't have a Mont structure here, SCA hardening is with blinding.
*/
int ec_GFp_simple_field_inv(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
                            BN_CTX *ctx)

और वह फ़ंक्शन BN_priv_rand_range() पर कॉल करता रहता है।

लेकिन सार्वजनिक-कुंजी हस्ताक्षर सत्यापन में सुरक्षा के लिए कोई रहस्य नहीं हैं। समस्या को हल करने के लिए, मेरे kinit में मैंने ओपनएसएसएल रैंडम नंबर जनरेटर को यादृच्छिक रूप से चुने गए डेटा के एक निश्चित सेट के साथ प्री-सीड किया, जैसा कि निम्नानुसार है:

    RAND_seed( "\xe5\xe3[...29 other characters...]\x9a", 32 );

यदि आपका प्रोग्राम रहस्यों के साथ काम करता है या कोई कुंजी, हस्ताक्षर, या यादृच्छिक संख्या उत्पन्न करता है तो ऐसा न करें। एक हस्ताक्षर-जांच kinit में यह ठीक है। ऐसे प्रोग्राम में जिसके लिए अधिक सुरक्षा की आवश्यकता होती है, मैं ऑन-चिप आरएनजी हार्डवेयर (/ dev/hw_random) से डेटा के साथ सीड कर सकता था, या अगर मेरे पास कोई एंट्रॉपी सुरक्षित स्टोरेज में बचा था, या इसे चूसा और crng init किया .

2
Corey Mutter 15 अप्रैल 2020, 17:49