Цифровая подпись файла и 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
);
}