إنشاء SecureString من سلسلة الشفرة غير المدارة
-
21-08-2019 - |
سؤال
وأنا على الراغبين في محاولة لادراك التعادل وظيفة ويندوز 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-قليلا من الفوضى، وأظن عدد قليل جدا من الناس الحصول على ذلك الحق في كل مكان. أنا متأكد من أني لا. لحسن الحظ في العديد من الأماكن التي لا تحتاج ما يدعو للقلق ...)