سؤال

وأنا على الراغبين في محاولة لادراك التعادل وظيفة ويندوز API CryptUnprotectData وصافي SecureString معا بأفضل طريقة ممكنة. CryptUnprotectData يعود هيكل DATA_BLOB تتكون من مجموعة من وحدات البايت وطول بايت. في برنامجي هذا سيكون يونيكود UTF-16 سلسلة. SecureString لديها منشئ الذي يأخذ شار * وطول بارامس، لذلك أود أن تكون قادرة على فعل شيء مثل:

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);

وهذا يعمل، باستثناء UTF-16 هو طول متغير، لذلك أنا لا أعرف حقا ما لاستخدام كوسيطة طول. يفترض المثال أعلاه 2 أحرف بايت (BMP)، ولكن للطائرات الأخرى التي يمكن أن تصل إلى 4 بايت. أريد أن أعرف عدد UTF-16 حرفا في صفيف بايت. ما هي أفضل طريقة للقيام بذلك دون نسخ القيم حولها في الذاكرة (وبالتالي تعريض الأمن). أنوي على التصفير خارج وتحرير صفيف بايت في أسرع وقت ممكن.

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

المحلول

ومعظم الصفقات ويندوز API مع UTF-16 نقطة متاحة بقدر ما أنا على علم - وبعبارة أخرى، يمكنك علاج أزواج بديلة كما نقطتين التعليمات البرمجية بدلا من حرف واحد. وبالنظر إلى أن منشئ SecureString يتعامل مع مؤشر إلى القيم System.Char. NET (والتي هي UTF-16) وأعتقد مقتطف الشفرة كنت قد حصلت على ما يرام - عدد العناصر في pbData <م> هو نصف حجمه في بايت.

وعلى سبيل المثال إذا الواردة pbData (فقط) زوج مركب، cbData ستكون 4 وكنت لا تزال تريد تمرير في 2 كما الوسيطة الثانية - لأن هذا هو عدد من القيم System.Char كنت تشييد SecureString من. والحقيقة أنه من غير BMP-حرف واحد يونيكود لا علاقة لها عدد من UTF-16 قيم System.Char انها ممثلة في.

(ونعم، ودعم البيانات غير BMP-قليلا من الفوضى، وأظن عدد قليل جدا من الناس الحصول على ذلك الحق في كل مكان. أنا متأكد من أني لا. لحسن الحظ في العديد من الأماكن التي لا تحتاج ما يدعو للقلق ...)

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