Windows: надежный способ узнать, прошла ли определенная дата?

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

Каковы стандартные способы сделать это?

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

Изменить. Я бы не хотел использовать сетевое решение.


person shoosh    schedule 19.07.2010    source источник
comment
У меня есть файлы будущего, но мои часы идут правильно. Моя страховая прислала мне файлы из 2050 года в zip-архиве. Как насчет проверки NTP-сервера?   -  person spender    schedule 19.07.2010
comment
@spender, возможно, распаковывает файлы из будущего.   -  person sarnold    schedule 19.07.2010
comment
@spender - зачем он это делает?   -  person shoosh    schedule 19.07.2010
comment
Я понятия не имею, почему файловая метка — 2050. Содержимое документов имеет правильные даты, так что это не проблема, но я подумал, что важно подчеркнуть, что будущие файлы могут проникнуть в системы людей.   -  person spender    schedule 19.07.2010


Ответы (7)


Я читаю между строк. Я думаю, вы хотите сделать "Пробную версию программного обеспечения". Тем более, что вы упомянули «взлом».

Лучшее несетевое решение, которое я могу представить для дат «пробного периода», — это не беспокоиться об абсолютной дате, а вместо этого реализовать обратный отсчет дня. Даже если вы проиграли в течение нескольких дней из-за того, что пользователь изменил дату и время CMOS/BIOS, вы все равно можете сохранить дату, время и количество системных тиков при последней загрузке и при следующей загрузке. вверх, если кажется, что дата сделала что-то иное, чем продвинулась вперед на небольшой промежуток времени, который меньше дня, затем уменьшите свой счетчик «дни, оставшиеся в вашей пробной версии». Вы также можете подсчитывать часы, в течение которых приложение было активным, и отсчитывать их тоже. Кто-то может продлить срок действия пробной версии на неопределенный срок, удерживая ваше приложение вдали от сети и откатывая часы, но если вы запускаете службу, которая всегда работает в фоновом режиме, вы можете поймать откат часов и деактивировать после того, как ваша фоновая служба обнаружит некоторое количество (скажем, три) отката часов.

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

На самом деле, если вы рассматриваете «пробную версию» программного обеспечения, почему бы просто не предоставить пользователю «xx часов пробного времени» вместо «30 дней». Если прошло 30 дней, а ваш пользователь не возился с датой/временем, чтобы продлить его, он может быть настолько раздражен тем, что срок действия вашей пробной версии истек до того, как он провел какое-либо время с вашим программным обеспечением, что вы можете потерять продажу.

Google Sketch-up Pro использует технику «обратного отсчета часов», и я обнаружил, что оценить ее намного проще.

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

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

person Warren P    schedule 19.07.2010
comment
Это не для пробной версии, а для какой-то схемы лицензирования, которую придумал какой-то юрист. Лицензия говорит, что срок действия программного обеспечения истекает в определенную дату, поэтому абсолютные даты являются обязательным требованием. - person shoosh; 19.07.2010

Полагаться на ОС для проверки даты, которую можно изменить --> вы уже проиграли игру

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

Ключевые слова в вашем вопросе

Надежный

и простой ответ НЕТ, нет смысла забивать квадратный колышек в круглое отверстие..

Изменить 1: слабое решение

Хорошо, понимая, что это в значительной степени проигранная битва, если вы все еще настаиваете на том, чтобы иметь какое-то очень слабое решение, вот одна из возможностей:

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

(1) При первом запуске приложения создайте зашифрованный файл с текущей датой (меткой времени).

(2) Каждый раз, когда приложение запускается, сначала проверяйте этот файл и проверяйте текущее время в ОС.

(3) исходя из нашего базового предположения, мы должны ожидать, что текущее время всегда должно быть больше сохраненного времени. Если это так, мы можем СЛАБО предположить, что время ОС является «надежным».

(3) Если текущее время меньше сохраненного времени, то кто-то подделывает время ОС -> плохой парень.

(5) При закрытии зашифруйте текущее время.

(6) Если зашифрованный файл отсутствует, значит, это тоже плохой парень.

person Darknight    schedule 19.07.2010
comment
К тому же нет смысла хвастаться по этому поводу. Я прекрасно понимаю, что идеального решения не существует. Я просто прошу что-то получше, чем тривиально взломанный. Есть два типа программистов: те, которые говорят, что это невозможно сделать, и те, которые просто делают. - person shoosh; 19.07.2010
comment
Это даже хуже, чем представляет Darknight: Ваш код находится на чужом компьютере —› вы уже потеряли контроль - person Ben Voigt; 19.07.2010

Вы можете запросить ntp-сервер вашей компании. Конечно, пользователи могут исключить ваш ntp-сервер из строя, так что вам придется решить, сколько работы вы готовы предпринять, чтобы поддержать пользователей либо драконовскими политиками безопасности, либо пользователями, пытающимися обойти ваши методы лицензирования.

person sarnold    schedule 19.07.2010

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

person Johann Strydom    schedule 19.07.2010

Вы можете запросить любой общедоступный веб-сервер (скажем, www.com) и получить дату из заголовка ответа.

person olegz    schedule 19.07.2010

Вы можете разрешить пользователю использовать приложение только определенное количество раз, если это сценарий пробной версии.

person Johann Strydom    schedule 19.07.2010

Я не уверен, что shoosh означает отсутствие сетевых решений. Доступен веб-сервис для получения даты и времени в любом месте.

EarthTools

Приложение может получить дату и время в местоположении создателя при установке приложения и при его запуске.

EarthTools просит вас не отправлять более одного запроса в секунду, что должно быть достаточно для большинства целей.

Вот пример запроса для Нью-Йорка: http://www.earthtools.org/timezone/40.71417/-74.00639

Вот пример ответа:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<timezone xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://www.earthtools.org/timezone.xsd">
    <version>1.1</version>
    <location>
        <latitude>40.71417</latitude>
        <longitude>-74.00639</longitude>
    </location>
    <offset>-5</offset>
    <suffix>R</suffix>
    <localtime>4 Dec 2005 12:06:56</localtime>
    <isotime>2005-12-04 12:06:56 -0500</isotime>
    <utctime>2005-12-04 17:06:56</utctime>
    <dst>False</dst>
</timezone>
person Gilbert Le Blanc    schedule 19.07.2010
comment
А что, если пользователь не в сети? Вы, очевидно, видели комментарий об отсутствии сетевых решений и все равно дали его? - person Ben Voigt; 19.07.2010
comment
не уверен, что означает shoosh под отсутствием сетевых решений - решение, которое каким-то образом зависит от присутствия сети. - person shoosh; 19.07.2010