Skip to content

יצירה או פתיחה של מפתח RSA CNG ללא מדיניות דריסה משתמעת

יצירה או פתיחה של מפתח RSA CNG ללא מדיניות דריסה משתמעת

הקוד להמחשה ולא הורץ.

המקור האנגלי פורסם בתאריך 2022-05-24T08:43:00.005+03:00. המאמר המקורי באנגלית

האיור אינו זמין: איור בנושא קריפטוגרפיה מהמאמר המקורי (מקור התמונה המקורי).

שמות מפתחות CNG מזהים אובייקטים מתמידים בתוך ספק ובהיקף של משתמש או מחשב. יצירה ופתיחה צריכות להיות פעולות נפרדות עם מדיניות מפורשת למחזור החיים. בדיקת Exists ולאחריה Create אינה אטומית, ושם קיים אינו מוכיח שהמפתח שייך ליישום המיועד. הדוגמה הארכיונית גם מעניקה AllUsages ומשתמשת כברירת מחדל בהיקף מחשב, הרחב מהנדרש לדוגמת חתימה בלבד. [1][2]

הפונקציות הבאות מיועדות ל־Windows בלבד, משמשות להמחשה ולא נקראו. יצירת מפתח בעל שם משנה מצב אבטחה מתמיד ומחייבת תוכנית פריסה שאושרה בנפרד. הדוגמה משתמשת במכוון בהיקף המשתמש הנוכחי, ב־Signing בלבד וללא הרשאת ייצוא. הספק והשם חייבים להגיע מאותה תוכנית; אין להחליף בשקט ספק TPM שהתבקש בספק תוכנה אם הוא אינו זמין. [1][3]

using System;
using System.Security.Cryptography;

public static class CngKeyExample
{
    // Illustrative methods only: do not invoke as part of reviewing this article.
    public static CngKey CreateNew(string approvedName, CngProvider approvedProvider, int bits)
    {
        if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException();
        if (string.IsNullOrWhiteSpace(approvedName)) throw new ArgumentException("Name required.");
        if (approvedProvider == null) throw new ArgumentNullException(nameof(approvedProvider));
        if (bits != 2048 && bits != 3072 && bits != 4096)
            throw new ArgumentOutOfRangeException(nameof(bits));
        var options = new CngKeyCreationParameters {
            Provider = approvedProvider,
            KeyCreationOptions = CngKeyCreationOptions.None, // Current user; no overwrite.
            KeyUsage = CngKeyUsages.Signing,
            ExportPolicy = CngExportPolicies.None
        };
        options.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(bits), CngPropertyOptions.None));
        // A duplicate-name/provider failure is surfaced, not reinterpreted as approval to replace.
        return CngKey.Create(CngAlgorithm.Rsa, approvedName, options);
    }

    public static CngKey OpenExisting(string approvedName, CngProvider approvedProvider, int expectedBits)
    {
        if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException();
        if (string.IsNullOrWhiteSpace(approvedName)) throw new ArgumentException("Name required.");
        if (approvedProvider == null) throw new ArgumentNullException(nameof(approvedProvider));
        CngKey key = CngKey.Open(approvedName, approvedProvider, CngKeyOpenOptions.None);
        try
        {
            if (key.AlgorithmGroup != CngAlgorithmGroup.Rsa || key.IsMachineKey ||
                key.KeySize != expectedBits || key.KeyUsage != CngKeyUsages.Signing ||
                key.ExportPolicy != CngExportPolicies.None)
                throw new CryptographicException("Existing key does not meet this example's policy.");
            return key; // Caller must dispose it; this does not delete the persisted key.
        }
        catch { key.Dispose(); throw; }
    }
}

הקוד הקורא חייב לשחרר גם את ה־CngKey המוחזר וגם כל עטיפת RSACng בסיום השימוש. שחרור משאבים סוגר ידיות; הוא אינו מחיקת מפתח. בדיקות מאפיינים מועילות אך אינן מוכיחות את מקור המפתח: יש לקשור מזהה ידוע של המפתח הציבורי ליישום ולאמת את הספק, ההרשאות והזהות המיועדת. אין לייצא מפתח פרטי רק כדי להשוות אותו. [2]

Microsoft Platform Crypto Provider הוא הספק המיועד ל־TPM ושמו מופיע בארכיון. אורכי מפתחות, אלגוריתמים, התנהגות ממשק משתמש והרשאות נתמכים תלויים בספק ובהתקן; הגדלים שהדוגמה מקבלת אינם טענה שכל TPM תומך בכולם. מפתחות ברמת המחשב מחייבים תכנון מכוון של היקף מחשב ובקרת גישה. יש להתייחס לכשלי הרשאות, ספק ושם כפול כאל בעיות פריסה נפרדות, ולא כסיבות לנסות שוב הגדרות חלשות יותר. [1][3][4]

שימוש בחוזה המאפיינים המתועד

לגבי CngProperty, יש להסתמך על מזהי מאפייני אחסון המפתחות המתועדים של Windows ועל תיעוד הספק, ולא להתייחס לקבועים פנימיים מקוד המקור לעיון כחוזה ציבורי מלא. Length הוא מספר ביטים; Key Usage ו־Export Policy הם דגלי מדיניות; חלק מהמאפיינים הם לקריאה בלבד או ייחודיים לספק. עצם קיומו של שם מאפיין אינו אומר שאפשר להגדירו בזמן היצירה או שמשמעותו זהה בכל ספק. הקישור הארכיוני לקוד המקור נשמר להלן כהקשר היסטורי, ולא כמפרט המחייב של המאפיינים. [3]

מקורות ראשוניים

  1. Microsoft CngKey.Create
  2. Microsoft CngKey
  3. Microsoft key-storage property identifiers
  4. Microsoft key storage and retrieval

הקישורים המקוריים נשמרו לצורכי ייחוס. הם אינם אישור לתקינות הקוד הישן; זמינותם הנוכחית לא אומתה.

Post a Comment

Previous Post Next Post