Цифровая подпись файла и RSA: Требуется гарантировать достоверность владельца файла и его содержимого - C#
Формулировка задачи:
Здравствуйте,
Требуется гарантировать достоверность владельца файла и его содержимого.
Т.е. есть коллекция файлов(текстовые конфиги программы, подхватываемые "на лету"). Требуется при подхватывании подтвердить что файл был создан доверенным лицом и после создания его ни кто не изменял. При этом файл должен остаться текстовым и открываться в блокноте.
Насколько я понимаю задача решается цифровой подписью. Имеется сертификат, представляющий комбинацию идентификатора владельца и открытого ключа шифрования(асинхронная модель). Вычисляется хэш файла, далее он шифруется сертификатом, на выходе получается строка - цифровая подпись. Цифровая подпись хранится в метаданных(атрибуте файла).
Таким образом на выходе получается только 1 файл, не создается дополнительных файлов - это обязательное требование.
Т.к. хочу встроить это в свой C# код, готовые программы по подписыванию файлов не подойдут.
Собственно вопрос в том, как можно из кода вписать подпись в метеданные файла?
На просторах интерента не удалось найти что-либо конкретное на эту тему.
Решение задачи: «Цифровая подпись файла и RSA: Требуется гарантировать достоверность владельца файла и его содержимого»
textual
Листинг программы
byte[] hash; //... using (var fstream = NtfsDataStreamHelper.OpenOrCreateDatastream(@"d:\test.txt", "Signature")) { fstream.Write(hash, 0, hash.Length); } public static class NtfsDataStreamHelper { public static FileStream OpenOrCreateDatastream(string path, string streamName) { FileAccess access = FileAccess.ReadWrite; SafeFileHandle fileHandle = CreateFile(path + ":" + streamName, access, FileShare.None, IntPtr.Zero, FileMode.OpenOrCreate, FileAttributes.Normal, IntPtr.Zero); if (fileHandle.IsInvalid) { Exception innerEx = null; try { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } catch (Exception ex) { innerEx = ex; } throw new IOException(string.Format("Failed to open data stream '{0}'", streamName), innerEx); } return new FileStream(fileHandle, access); } [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern SafeFileHandle CreateFile( [MarshalAs(UnmanagedType.LPTStr)] string filename, [MarshalAs(UnmanagedType.U4)] FileAccess access, [MarshalAs(UnmanagedType.U4)] FileShare share, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes, IntPtr templateFile ); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д