Работа с конфиденциальными данными в памяти - C#
Формулировка задачи:
Здравствуйте. Есть некие данные которые хранятся на диски в зашифрованном виде. Мне нужна как-то с ними работать (чтение, запись и т. п.). Если я расшифрую и загружу эти данные в string, то они будут висеть какое-то в памяти в открытом виде, что нехорошо. Как быть в такой ситуации?
Решение задачи: «Работа с конфиденциальными данными в памяти»
textual
Листинг программы
- using System;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Security;
- using System.Security.Cryptography;
- using System.Text;
- namespace ConsoleApplication53
- {
- class Program
- {
- static void Main(string[] args)
- {
- string samplePass = "Hello world!";
- using (var md5 = MD5.Create())
- {
- byte[] originalHash = md5.ComputeHash(Encoding.Unicode.GetBytes(samplePass));
- Console.WriteLine(string.Concat(originalHash.Select(x=>x.ToString("X2"))));
- var sec = new SecureString();
- foreach (char c in samplePass)
- {
- sec.AppendChar(c);
- }
- using (var secureStringStream = new SecureStringStream(sec))
- {
- byte[] arr = md5.ComputeHash(secureStringStream);
- Console.WriteLine(string.Concat(arr.Select(x => x.ToString("X2"))));
- }
- }
- }
- }
- class SecureStringStream : Stream
- {
- private IntPtr _bstr;
- public SecureStringStream(SecureString secureString)
- {
- _bstr = Marshal.SecureStringToBSTR(secureString);
- Length = Marshal.ReadInt32(_bstr, -4);
- }
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (Position == Length)
- return 0;
- buffer[0] = Marshal.ReadByte(_bstr, (int) Position);
- Position++;
- return 1;
- }
- public override long Seek(long offset, SeekOrigin origin)
- {
- switch (origin)
- {
- case SeekOrigin.Begin:
- return Position = offset;
- case SeekOrigin.End:
- return Position = Length - offset - 1;
- case SeekOrigin.Current:
- return Position += offset;
- }
- throw new NotImplementedException();
- }
- protected override void Dispose(bool disposing)
- {
- base.Dispose(disposing);
- if (_bstr != IntPtr.Zero)
- {
- Marshal.ZeroFreeBSTR(_bstr);
- _bstr = IntPtr.Zero;
- }
- }
- public override void Flush()
- {
- throw new NotImplementedException();
- }
- public override void SetLength(long value)
- {
- throw new NotImplementedException();
- }
- public override void Write(byte[] buffer, int offset, int count)
- {
- throw new NotImplementedException();
- }
- public override bool CanRead { get; } = true;
- public override bool CanSeek { get; } = false;
- public override bool CanWrite { get; } = false;
- public override long Length { get; }
- public override long Position { get; set; }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д