Как предотвратить подделку файла - PullRequest
1 голос
/ 15 декабря 2009

Я хочу хранить конфиденциальные данные в файле с цифровой подписью, чтобы знать, когда его содержимое было подделано.

Первоначально я думал, что данные будут храниться в NVP (пары имя-значение) с некоторой контрольной суммой CRC или другой контрольной суммой для проверки содержимого.

Я думаю о реализации создания (т.е. записи) и проверки (чтения) такого файла с использованием ANSI C ++.

Предполагая, что это данные, которые я хочу сохранить:

    //Unencrypted, raw data to be stored in file
    struct PrivateInfo {
         double age; weight;
         FitnessScale fitness;
         Location  loc;
         OtherStuff stuff;
    };

    //128-bit Encrypted Data (Payload to be stored in file)
    struct EncryptedData {
     // unknown fields/format ??

    };

[После того, как я прочитал несколько ответов на этот вопрос]

Судя по комментариям, которые я получил до сих пор, я боюсь, что люди попадают в тупик со словом «лицензирование», которое кажется большинству людей красным флагом. Я подозревал, что это может быть так, но в сегодняшней атмосфере повышенной безопасности и общей нервозности я подумал, что лучше бы подробно описать, что мне нужно, чтобы «прятаться», чтобы кто-то подумал, что я собираюсь передать «пароль Nuke» некоторым террористы или что-то. Теперь я удалю слово «лицензия» из моего вопроса.

Рассматривайте это скорее как технический вопрос. Представьте, что я студент (и я), и что я пытаюсь узнать о рекомендуемых (или передовых методах) кодирования информации, которая должна быть защищенной.

С учетом вышеизложенного я переформатирую свои вопросы следующим образом:

  1. Учитывая структуру полей различных типов данных, что является «рекомендуемым» алгоритмом для обеспечения «разумно безопасного» шифрования (я все еще предпочитаю использовать 128-битное - но это только я)
  2. Каков рекомендуемый способ предоставления ROBUST проверки зашифрованных данных, чтобы я мог использовать это значение проверки, чтобы узнать, отличается ли содержимое файла (полезная нагрузка зашифрованных данных) от исходного .

Ответы [ 4 ]

9 голосов
/ 15 декабря 2009

Во-первых, обратите внимание, что «подписание» данных (чтобы заметить, когда они были подделаны) является совершенно отдельной и независимой операцией от «шифрования» данных (чтобы не дать другим людям их читать).

Тем не менее, стандарт OpenPGP делает и то, и другое. GnuPG - это популярная реализация: http://www.gnupg.org/gph/en/manual.html

В основном вам нужно:

  • Создайте пару ключей, но не беспокойтесь о публикации публичной части.
  • Подпишите и зашифруйте ваши данные (это одна операция в gpg)
  • ... хранилище ...
  • Расшифруйте и проверьте подпись (это также одна операция).

Но имейте в виду, что это может использоваться только в том случае, если вы можете хранить свой закрытый ключ более надежно, чем остальные данные. Если вы не можете гарантировать безопасность ключа, то GPG не сможет помочь вам против злонамеренной попытки чтения или подделки ваших данных. И ни одна другая схема шифрования / подписи не может.

Забывая о шифровании, вы можете подумать, что вы можете подписать данные на каком-либо защищенном сервере с помощью закрытого ключа, а затем проверить их на компьютере какого-либо пользователя с помощью открытого ключа. Это хорошо, насколько это возможно, но если пользователь злонамеренный и умный, он может придумать новые данные, подписать их, используя собственный закрытый ключ, и изменить ваш код, чтобы заменить ваш открытый ключ своим. Их данные затем будут проверены. Таким образом, вам все еще нужно, чтобы хранилище открытого ключа было защищено от несанкционированного доступа, согласно вашей модели угроз.

Вы можете реализовать эквивалент самостоятельно, что-то вроде:

  • Выберите длинную строку случайных символов. Это твой ключ.
  • Объедините ваши данные с ключом. Хеш это с помощью безопасной хэш-функции (SHA-256). Затем объедините полученный хеш с вашими данными и зашифруйте его, используя ключ и безопасный симметричный шифр (AES).
  • ... хранилище ...
  • Расшифруйте данные, отрежьте хеш-значение, верните ключ обратно, хеш-код и сравните результат с хеш-значением, чтобы убедиться, что он не был изменен.

Вероятно, это будет быстрее и будет использовать меньше кода в целом, чем gpg: для начала PGP - это криптография с открытым ключом, и это больше, чем вам требуется здесь. Но сворачивание собственного означает, что вы должны выполнить некоторую работу, написать часть кода и убедиться, что в только что описанном протоколе нет глупой ошибки. Например, у него есть потенциальные недостатки, если данные не имеют фиксированной длины, которую решает HMAC.

Хорошая безопасность избегает выполнения работы, которую какой-то другой, умный человек сделал для вас. Это добродетельная лень.

1 голос
/ 15 декабря 2009

Err, почему бы не использовать хорошо известную систему шифрования, как GPG?

0 голосов
/ 15 декабря 2009

Я собираюсь изменить формулировку вопроса и посмотреть, делает ли это людей счастливее (или меня опровергают). На самом деле задаются два типа вопросов:

  1. Вы создаете какую-то компьютерную игру и хотите узнать, кто-то возился с вашими файлами сохранения. (подпись данных)

  2. Вы пишете программу обмена сообщениями и хотите, чтобы журналы сообщений людей оставались конфиденциальными. (шифрование данных)

Я буду иметь дело со вторым (шифрование данных). Это чрезвычайно сложная тема, и вам следует искать готовые программы (такие как PGP / GPG ), даже тогда вам потребуется много времени, чтобы понять и правильно использовать. Думайте о шифровании так: оно будет взломано; ваша задача сделать так, чтобы это не стоило усилий. Другими словами, приложите усилие, необходимое, чтобы сломать его больше, чем ценность информации.

Что касается первого, он снова может быть сломан. Но контрольная сумма - хорошая идея. см. ответ Амнона для некоторых ссылок на этом.

Надеюсь, это направит вас в правильном направлении. Я не эксперт по обоим темам, но я надеюсь, что это даст вам отправную точку. (возможно, вы захотите перефразировать вопрос и посмотреть, получите ли вы лучшие ответы)

0 голосов
/ 15 декабря 2009

Ответы на отредактированный вопрос зависят от конкретного сценария.

Для q1 (шифрование): если вы шифруете и дешифруете на своих серверах, вы можете использовать алгоритм симметричного ключа . В противном случае вы можете использовать криптографию с открытым ключом .

Для q2, если вы просто хотите проверить, изменился ли файл, вы можете использовать любой криптографический хеш , такой как SHA-1 - при условии, что вы можете убедиться, что сам хэш не изменился.

Если генератор данных и верификатор оба безопасны, вы можете использовать MAC алгоритм, такой как HMAC , чтобы проверить, что данные и MAC совпадают. Но это работает, только если секретный ключ остается секретным. В противном случае вы можете использовать цифровые подписи .

...