Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий Дв.  
#1 Оставлено : 18 октября 2021 г. 13:28:36(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Время выпуска сертификата и его срок годности имеет формат FILETIME, которые можно перевести в SYSTEMTIME методом CSP_FileTimeToSystemTime, но вот как дальше получить время с учётом часового пояса, т.е. не в utc? Может быть есть какой нибудь аналог SystemTymeToTzSpetificLocalTime начинающийся с CSP_...? в хэдерах такого метода нет
Offline Андрей *  
#2 Оставлено : 18 октября 2021 г. 13:48:06(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
ЯП\Задача какая?

1) c++ ?
2) utc to local time? В гугле?

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 18 октября 2021 г. 13:50:32(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#4 Оставлено : 18 октября 2021 г. 13:52:16(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline Дмитрий Дв.  
#5 Оставлено : 18 октября 2021 г. 13:54:03(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Автор: Андрей * Перейти к цитате
ЯП\Задача какая?

1) c++ ?
2) utc to local time? В гугле?




Это же под ios, тут предлагаемые варианты в гугле для win не подходят насколько понял...
Задача отобразить даты с учётом пояса, сейчас это выполняется так, без учёта часового пояса:
NSString* getNotBefore(PCCERT_CONTEXT *pCertContext) {
FILETIME fileTime = (*pCertContext)->pCertInfo->NotBefore;
SYSTEMTIME systemTime;
CSP_FileTimeToSystemTime(&fileTime, &systemTime);
return [NSString stringWithFormat:@"%d.%d.%d %d:%d",
systemTime.wDay,
systemTime.wMonth,
systemTime.wYear,
systemTime.wHour,
systemTime.wMinute];
}

Отредактировано пользователем 18 октября 2021 г. 13:54:34(UTC)  | Причина: Не указана

Offline Дмитрий Дв.  
#6 Оставлено : 18 октября 2021 г. 13:58:56(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Автор: Андрей * Перейти к цитате


и на ios тоже должен такой быть? т.е. не нужен аналог начинающийся что то вроде с CSP_FileTimeToLocalFileTime?
Offline two_oceans  
#7 Оставлено : 19 октября 2021 г. 17:07:55(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Добрый день.
Проблема отображения поясного времени очень болезненна для любого программного окружения.
Дело в том, что смещение времени не постоянно (часы преводят, часовые пояса меняют границы), кроме того даже не кратно целому часу (в большинстве случаев кратно 5 минутам) и есть полугодовые поправки в 1 секунду в зависимости от вращения земного шара.
Другими словами, если нужна точность, то функция перевода времени должна это все учитывать. Либо, например, доверить ОС заботу об этом и запрашивать смещение от ОС.

С другой стороны, если Вам каким-то образом уже известно смещение времени для пояса, то и FileTimeToLocalFileTime не нужно: просто трактуете FILETIME как 64-битное (без)знаковое целое число (ULONGLONG если не ошибаюсь) и прибавляете (или вычитаете) смещение в секундах умноженное на 10 миллионов (так как FILETIME считает 10-миллионные доли секунды). Выходит, что для получения московского времени надо прибавить 3 * 3600 * 10 млн = 108 миллиардов. Что-то вроде:
Код:
FILETIME fileTime = (*pCertContext)->pCertInfo->NotBefore;
LONG offset = 3 * 3600;  // здесь получить актуальное смещение для пояса (в секундах)
(ULONGLONG) fileTime += offset * 10000000;
SYSTEMTIME systemTime;
CSP_FileTimeToSystemTime(&fileTime, &systemTime);


Например, если у Вас какая-то ИС с аккаунтом пользователя, можно дать пользователю возможность выбора часового пояса и рассчитывать смещение оттуда. В простейшем варианте - выбор пояса на страничке где показываете данные о времени сертификата. По сути в iOS то же самое уже есть, остается только как-то получить информацию о часовом поясе и его смещении от iOS. Еще вариант - получать отметку времени по гринвичу с какого-нибудь сервера и сравнивать с датой на устройстве, разница с округлением до 5 минут обычно и будет смещением.

Отредактировано пользователем 19 октября 2021 г. 17:32:57(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Дмитрий Дв. оставлено 19.10.2021(UTC)
Offline Дмитрий Дв.  
#8 Оставлено : 19 октября 2021 г. 18:29:35(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Да, спасибо, смещения через offset будет достаточно
Offline Дмитрий Дв.  
#9 Оставлено : 20 октября 2021 г. 16:21:57(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Но ведь формат FILETIME = {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
}
Как тут учесть смещение? если смещение пытаться прибавить следующим образом (ULONGLONG) fileTime += offset * 10000000; топоявляется ошибка связанная с приведением типов(пробовал по разному, например unsigned_int)
Offline two_oceans  
#10 Оставлено : 20 октября 2021 г. 17:53:47(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Для удобства использования на 32-битных ОС Maйкрософт просто поделили 64-битное целое число на 2 части и объявили как структуру. Обратите внимание, что часть Low идет первой, что соответствует принципу x86 процессоров Intel - "младший байт по младшему адресу" Little Endian - поэтому в памяти представление двух 4-байтовых полей такое же как у 8-байтовой числовой целой переменной. Если у Вас другая целевая архитектура (какой-нибудь ARM с BigEndian), то возможны несоответствия, поэтому возможно компилятор и упирается.

На FreePascal / Delphi я просто привожу к типу int64 либо QWORD - проверял, работает в 32-разрядных Windows приложениях. Какой тип подходит для 64-разрядных операций на С++ наверно Вам виднее (так как я в основном читаю программы на С++ и переписываю на паскале). Знаю что есть разница в длине переменных на разных компиляторах C++.

Еще может быть проблема в самом выражении "offset * 10000000" связанная с переполнением типа, неявно выбранного компилятором для результата умножения, в этом случае offset можно указать подлиннее или присваивать "offset * 10000000" в длинную промежуточную переменную, это даст компилятору "подсказку", что надо ждать большое число.

Отредактировано пользователем 20 октября 2021 г. 19:52:03(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Дмитрий Дв. оставлено 21.10.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.