C# Protected Memory

Data Protection

ในการเขียนโปรแกรม สิ่งสำคัญที่สุดคือข้อมูลที่มีการใช้งานภายในโปรแกรม ซึ่งอาจเป็นข้อมูลที่สำคัญมากหรือ Sensitive data
บางส่วนอาจมีการเก็บใน Disk บางส่วนอาจอยู่ใน Memory แล้วแต่โปรแกรมเมอร์จะออกแบบ
แต่ในกรณีที่จำเป็นจะต้องเก็บข้อมูลสำคัญลงใน Memory ใน .NET ได้ Provides ProtectedMemory Class ให้เราได้เรียกใช้งานในการปกป้องข้อมูลสำคัญใน Memory

ProtectedMemory Class

Namespace: System.Security.Cryptography
Assembly: System.Security.dll

ใน ProtectedMemory Class ได้ Provides 2 Methods ในการป้องกันและยกเลิกการป้องกันข้อมูลใน Memory

Methods  
Protect(Byte[], MemoryProtectionScope) Protects the specified data.
Unprotect(Byte[], MemoryProtectionScope) Unprotects data in memory that was protected using the Protect(Byte[], MemoryProtectionScope) method.

ตัวอย่างการใช้งาน ProtectedMemory Class

ในการเรียกใช้งาน Protect Method ข้อมูลที่ต้องการป้องกัน จะต้องเป็น Bytes array ที่มีขนาด 16
กรณีที่ข้อมูลมีขนาดใหญ่ อาจจะต้องมีการนำ Loop เข้ามาช่วยในการแบ่งข้อมูลเพื่อให้ได้ขนาดตามที่กำหนด

using System;
using System.Security.Cryptography;
using System.Text;

namespace ProtectedMemorySample
{
    class Program
    {
        static void Main(string[] args)
        {
            var data = "####Code4Sec####";
            Console.WriteLine("Original data: {0}",data);
            // Create the original data to be encrypted (The data length should be a multiple of 16).
            byte[] secret = Encoding.UTF8.GetBytes(data);
            Console.WriteLine("Before Protect: {0}", BitConverter.ToString(secret));          

            // Encrypt the data in memory. The result is stored in the same array as the original data.
            ProtectedMemory.Protect(secret, MemoryProtectionScope.SameLogon);
            Console.WriteLine("Protect: {0}", BitConverter.ToString(secret));

            // Decrypt the data in memory and store in the original array.
            ProtectedMemory.Unprotect(secret, MemoryProtectionScope.SameLogon);
            Console.WriteLine("Unprotect: {0}", BitConverter.ToString(secret));

            Console.ReadLine();
        }
    }
}


ผลลัพธ์



Reference:

AKA

BlackDragon