2009-12-15 11 views
1

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

Моя первоначальная мысль заключается в том, что данные будут храниться в 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. Что такое рекомендуемый способ предоставления данных зашифрованных данных, поэтому я могу использовать это значение проверки, чтобы узнать, содержит ли содержимое файла (полезная нагрузка зашифрованные данные) отличается от оригинала.?
+6

Вы хотите, чтобы мы снабдили кодом шифрования, контрольным суммированием, кодом записи файлов? Что-нибудь еще? – 2009-12-15 11:06:09

+1

Не обижайтесь, но это бессмысленная трата времени. Предотвращение кого-либо из воровства или модификации вашей программы является социальной проблемой, не являющейся технической проблемой. По сути, вы не можете защитить что-то там, где оно и средства его защиты, как на машине, которую вы не контролируете. Миллиарды были потрачены впустую на меры по борьбе с пиратством на DVD/Blu-ray, пытаясь игнорировать эту простую истину (и потерпеть неудачу). – cletus

+0

Нейлу: Значит, ты можешь читать мысли теперь? Я не помню, чтобы спрашивать кого-нибудь о подробном коде реализации в моем первоначальном вопросе. Все, что я задал, были некоторыми рекомендациями от тех, кто действительно знал о шифровании. –

ответ

9

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

При этом стандарт OpenPGP делает оба. GnuPG является популярной реализацией: http://www.gnupg.org/gph/en/manual.html

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

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

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

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

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

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

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

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

+1

Спасибо за ваш информативный ответ Стив. Его люди, подобные вам, делают StackOverflow отличным сайтом, который он –

+0

«Хорошая безопасность позволяет выполнять работу, которую для вас сделал другой, более умный человек. Это добродетельный вид лень». Он хэш, мне нравится такая лень .. :) –

1

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

0

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

Для q1 (шифрование): при шифровании и расшифровке на своих серверах вы можете использовать symmetric key algorithm. В противном случае вы можете использовать public key cryptography.

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

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

+0

SHA-1 больше не считается криптографически безопасным. Я бы предложил использовать SHA-256 для генерации хэша подписи. –

0

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

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

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

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

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

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