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

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


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

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

5   голосов , оценка 3.8 из 5
Похожие ответы