Работа с конфиденциальными данными в памяти - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть некие данные которые хранятся на диски в зашифрованном виде. Мне нужна как-то с ними работать (чтение, запись и т. п.). Если я расшифрую и загружу эти данные в string, то они будут висеть какое-то в памяти в открытом виде, что нехорошо. Как быть в такой ситуации?

Решение задачи: «Работа с конфиденциальными данными в памяти»

textual
Листинг программы
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Security;
  6. using System.Security.Cryptography;
  7. using System.Text;
  8.  
  9. namespace ConsoleApplication53
  10. {
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             string samplePass = "Hello world!";
  16.             using (var md5 = MD5.Create())
  17.             {
  18.                 byte[] originalHash = md5.ComputeHash(Encoding.Unicode.GetBytes(samplePass));
  19.                 Console.WriteLine(string.Concat(originalHash.Select(x=>x.ToString("X2"))));
  20.                 var sec = new SecureString();
  21.                 foreach (char c in samplePass)
  22.                 {
  23.                     sec.AppendChar(c);
  24.                 }
  25.                 using (var secureStringStream = new SecureStringStream(sec))
  26.                 {
  27.                     byte[] arr = md5.ComputeHash(secureStringStream);
  28.                     Console.WriteLine(string.Concat(arr.Select(x => x.ToString("X2"))));
  29.                 }
  30.             }
  31.         }
  32.     }
  33.  
  34.  
  35.     class SecureStringStream : Stream
  36.     {
  37.         private IntPtr _bstr;
  38.  
  39.         public SecureStringStream(SecureString secureString)
  40.         {
  41.             _bstr = Marshal.SecureStringToBSTR(secureString);
  42.             Length = Marshal.ReadInt32(_bstr, -4);
  43.         }
  44.  
  45.         public override int Read(byte[] buffer, int offset, int count)
  46.         {
  47.             if (Position == Length)
  48.                 return 0;
  49.             buffer[0] = Marshal.ReadByte(_bstr, (int) Position);
  50.             Position++;
  51.             return 1;
  52.         }
  53.  
  54.         public override long Seek(long offset, SeekOrigin origin)
  55.         {
  56.             switch (origin)
  57.             {
  58.                 case SeekOrigin.Begin:
  59.                     return Position = offset;
  60.                 case SeekOrigin.End:
  61.                     return Position = Length - offset - 1;
  62.                 case SeekOrigin.Current:
  63.                     return Position += offset;
  64.             }
  65.             throw new NotImplementedException();
  66.         }
  67.  
  68.         protected override void Dispose(bool disposing)
  69.         {
  70.             base.Dispose(disposing);
  71.             if (_bstr != IntPtr.Zero)
  72.             {
  73.                 Marshal.ZeroFreeBSTR(_bstr);
  74.                 _bstr = IntPtr.Zero;
  75.             }
  76.         }
  77.  
  78.         public override void Flush()
  79.         {
  80.             throw new NotImplementedException();
  81.         }
  82.  
  83.         public override void SetLength(long value)
  84.         {
  85.             throw new NotImplementedException();
  86.         }
  87.  
  88.         public override void Write(byte[] buffer, int offset, int count)
  89.         {
  90.             throw new NotImplementedException();
  91.         }
  92.  
  93.         public override bool CanRead { get; } = true;
  94.         public override bool CanSeek { get; } = false;
  95.         public override bool CanWrite { get; } = false;
  96.         public override long Length { get; }
  97.         public override long Position { get; set; }
  98.     }
  99. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы