Проверка того, что что-то было «сделано» с помощью хэшей / шифрования - PullRequest
3 голосов
/ 01 июля 2010

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

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

Я также не хочу, чтобы результат был "поддельным" (хотя, опять же, я знаю, что если приложить достаточно усилий, чтобы сломать его, и т.д. Следовательно, это означает, что если я использую хеш, я не могу просто иметь хеш для «да» и хеш для «нет» (поскольку это означает, что хеш будет только одним из 2 вариантов - легко поддельных).

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

Как бы вы это реализовали? Возможно, я не объяснил ничего лучше, но, надеюсь, ты понял суть того, что я хочу сделать.

Если бы кто-то реализовывал подобные вещи раньше, любые указатели были бы очень благодарны.

Этот вопрос больше касается «как реализовать», чем конкретно спрашивать о коде, поэтому, если я пропустил важный тег, пожалуйста, не стесняйтесь редактировать!

Ответы [ 6 ]

3 голосов
/ 05 июля 2010

Я вставляю в один из ваших комментариев здесь, потому что это идет к сути вопроса:

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

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

Самый простой способ сделать это - взять пару элементов, которые не являются постоянными и легко проверяемыми, и хэшировать их. Например, ваше ответное сообщение может быть:

  • Системная дата / время
  • Hostname
  • Имя пользователя
  • Результат теста
  • HASH (Системная дата / время | Имя хоста | Имя пользователя | Результат теста)

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

3 голосов
/ 01 июля 2010

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

Если посмотреть с высоты птичьего полета, основной поток будет выглядеть примерно так:

На компьютере пользователя:

  • запустить процесс
  • получить результат, добавить метку времени и т. Д.
  • шифровать, используя ваш открытый ключ
  • знак, используя закрытый ключ пользователя (вам может понадобиться какой-то способ идентификации пользователя здесь - парольные фразы, смарт-карты, биометрия, ...)
  • отправить на ваш сервер

На вашем сервере:

  • проверить подпись, используя открытый ключ пользователя
  • расшифровать, используя свой закрытый ключ
  • процесс по мере необходимости

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

2 голосов
/ 01 июля 2010

Как насчет того, чтобы взять выходные данные вашей программы ("да" или "нет"?) И объединить их со случайным числом, а затем включить хэш этой строки?

Итак, вы в конечном итогекогда пользователь отправляет вам что-то вроде:

YES-3456234
b23603f87c54800bef63746c34aa9195

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

Затем вы можете проверить, что md5("YES-3456234") == "b23603f87c54800bef63746c34aa9195".

Если пользователь не обладает достаточными техническими знаниями, чтобы выяснить, как сгенерировать хэш md5, этого должно быть достаточно.

Несколько лучшее решение будет объединено с другим (жестко закодировано, "secret") соль для генерации хеша, но оставьте эту соль вне вывода.

Теперь у вас есть:

YES-3456234
01428dd9267d485e8f5440ab5d6b75bd

И вы можете проверить, что

md5("YES-3456234" + "secretsalt") == "01428dd9267d485e8f5440ab5d6b75bd"

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

Конечно, если он достаточно умен, он может извлечь соль из вашей программы.

Если требуется что-то более пуленепробиваемое, то вы смотрите на правильную генерацию криптографической подписи,и я просто отсылаю вас к ответу Писквора , так как мне нечего добавить к этому:)

1 голос
/ 01 июля 2010

Стоит отметить, что вы на самом деле не ищете шифрование .

Ответ «безотказно» почти на деньги, но все, что вам действительно нужно, чтобы гарантировать, откуда пришло ваше сообщение, это надежно подписать сообщение.Неважно, если кто-то может перехватить и прочитать ваше сообщение, если они не могут вмешаться в него без вашего ведома.

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

Обратите внимание, что в принципе вы никогда не сможете гарантировать безопасность, если приложениена чужом оборудовании - но безопасность никогда не связана с «уверенностью», а с «уверенностью» - вы уверены, что достаточно для нужд вашего бизнеса, что сообщение не было подделано?

1 голос
/ 01 июля 2010

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

Если у пользователя в руках исполняемая программа, то все может быть подделано.

1 голос
/ 01 июля 2010

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

Пользователь отправляет вам свой результат и подпись, сгенерированную программой. Теперь вы можете подтвердить результат, проверив, если hash(result + private_salt) == signature. Если это не так, результат подделывается.

На практике это практически невозможно, потому что вы не можете скрыть соль от пользователя. Это в основном та же проблема, которая обсуждается в этом вопросе: Как скрыть секретные ключи в коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...