Расшифровка API SN и спецификация ILSAC GF-5
Есть достаточно причин, что бы узнать, почему API SN в 2010 году стало новой классификацией API, для моторных масел бензиновых двигателей. Одна из причин в том, что классификация API SN возглавила новую категорию моторных масел под названием — ресурсосберегающие.
Чтобы понять, что такого в ресурсосберегающем масле API SN, нужно разобраться с API SM энергосберегающем.
Расшифровка API SN и SM
Когда в 2005 году был разработан новый класс API SM, он получил дополнительную спецификацию, точнее его определили в новую на то время категорию энергосберегающих масел, в которой он до сих пор один (API SM).
Energy Conserving (обозначается EC, пример API SM EC) т.е. энергосберегающее масло, которое обладает маловязкостными свойствами (другими словами более текучее или жидкое), за счет чего достигалась экономия топлива не менее 1,5% от аналогичного эталонного API SM.
Resource Conserving (обозначается RC, пример API SN RC) и является ресурсосберегающим маслом и в этой категории только классификация моторного масла API SN.
Подводя итоги отмечу, отличием RC от EC является требования к спецификации. Можно сказать, что ресурсосберегающее масло превосходит энергосберегающее, так как требует не только экономии топлива от качественного масла, а так же сохранение деталей системы выхлопа, турбонаддува и совместимость с биотопливом.
На этом расшифровка API SN не закончена. Для более правильного и понятного представления в улучшениях нужно просто сравнить спецификацию API SN и SM.
- Улучшенная степень защиты при высокой температуре в цилиндрах
- Меньше отложений в виде нагара
- Улучшена совместимость с разными видами топлива
- Улучшенные моющие свойства
- Улучшенные защитные свойства
Требования для стандарта ILSAC GF-5 аналогичны API SN RC.
На самом деле, требования для международного азиатского рынка достаточно объективны. Если вы найдете на японском масле ILSAC GF-5, можете не сомневаться, что это масло отвечает требованиям API SN RC. Отсутствие спецификации ресурсосберегающего масла лишает его возможности получить стандарт ILSAC GF-5
Что такое API / Хабр
Содержание
Слово «API» мелькает в вакансиях даже для начинающих тестировщиков. То REST API, то SOAP API, то просто API. Что же это за зверь такой? Давайте разбираться!
— А зачем это мне? Я вообще-то web тестирую! Вот если пойду в автоматизацию, тогда да… Ну, еще это в enterprise тестируют, я слышал…
А вот и нет! Про API полезно знать любому тестировщику. Потому что по нему системы взаимодействуют между собой. И это взаимодействие вы видите каждый день даже на самых простых и захудалых сайтах.
Любая оплата идет через API платежной системы. Купил билет в кино? Маечку в онлайн-магазине? Книжку? Как только жмешь «оплатить», сайт соединяет тебя с платежной системой.
Но даже если у вас нет интеграции с другими системами, у вас всё равно есть API! Потому что система внутри себя тоже общается по api. И пока фронт-разработчик усиленно пилит GUI (графический интерфейс), вы можете:
- скучать в ожидании;
- проверять логику работы по API
Конечно, я за второй вариант! Так что давайте разбираться, что же такое API. Можно посмотреть видео на
youtube, или прочитать дальше в виде статьи.
Что такое API
API (Application programming interface) — это контракт, который предоставляет программа. «Ко мне можно обращаться так и так, я обязуюсь делать то и это».
Если переводить на русский, это было бы слово «договор». Договор между двумя сторонами, как договор на покупку машины:
- мои обязанности — внести такую то сумму,
- обязанность продавца — дать машину.
Перевести можно, да. Но никто так не делает ¯\_(ツ)_/¯
Все используют слово «контракт». Так принято. К тому же это слово входит в название стиля разработки:
- Code first — сначала пишем код, потом по нему генерируем контракт
- Contract first — сначала создаем контракт, потом по нему пишем или генерируем код (в этой статье я буду говорить именно об этом стиле)
Мы же не говорим «контракт на продажу машины»? Вот и разработчики не говорят «договор». Негласное соглашение.
API — набор функций
Когда вы покупаете машину, вы составляете договор, в котором прописываете все важные для вас пункты. Точно также и между программами должны составляться договоры. Они указывают, как к той или иной программе можно обращаться.
Соответственно, API отвечает на вопрос “Как ко мне, к моей системе можно обратиться?”, и включает в себя:
- саму операцию, которую мы можем выполнить,
- данные, которые поступают на вход,
- данные, которые оказываются на выходе (контент данных или сообщение об ошибке).
Тут вы можете мне сказать:
— Хмм, погоди. Операция, данные на входе, данные на выходе — как-то всё это очень сильно похоже на описание функции!
Если вы когда-то сталкивались с разработкой или просто изучали язык программирования, вы наверняка знаете, что такое функция. Фактически у нас есть данные на входе, есть данные на выходе, и некая магия, которая преобразует одно в другое.
И да! Вы будете правы в том, что определения похожи. Почему? Да потому что API — это набор функций. Это может быть одна функция, а может быть много.
Как составляется набор функций
Да без разницы как. Как разработчик захочет, так и сгруппирует. Например, можно группировать API по функционалу. То есть:
- отдельно API для входа в систему, где будет регистрация и авторизация;
- отдельно API для отчетности — отчет 1, отчет 2, отчет 3… отчет N. Для разных отчетов у нас разные формулы = разные функции. И все мы их собираем в один набор, api для отчетности.
- отдельно API платежек — для работы с каждым банком своя функция.
- …
Можно не группировать вообще, а делать одно общее API.
Можно сделать одно общее API, а остальные «под заказ». Если у вас коробочный продукт, то в него обычно входит набор стандартных функций. А любые хотелки заказчиков выносятся отдельно.
Получается, что в нашей системе есть несколько разных API, на каждое из которых у нас написан контракт. В каждом контракте четко прописано, какие операции можно выполнять, какие функции там будут
И конечно, функции можно переиспользовать. То есть одну и ту же функцию можно включать в разные наборы, в разные апи. Никто этого не запрещает.
Получается, что разработчик придумывает, какое у него будет API. Либо делает общее, либо распределяет по функционалу или каким-то своим критериям, и в каждое апи добавляет тот набор функций, который ему необходим.
При чем тут слово «интерфейс»
— Минуточку, Оля! Ты же сама выше писала, что API — это Application programming interface. Почему ты тогда говоришь о контракте, хотя там слово интерфейс?
Да потому, что в программировании контракт — это и есть интерфейс. В классическом описании ООП (объектно-ориентированного программирования) есть 3 кита:
- Инкапсуляция
- Наследование
- Полиморфизм
Инкапсуляция — это когда мы скрываем реализацию. Для пользователя все легко и понятно. Нажал на кнопочку — получил отчет. А как это работает изнутри — ему все равно. Какая база данных скрыта под капотом? Oracle? MySQL? На каком языке программирования написана программа? Как именно организован код? Не суть. Программа предоставляет интерфейс, им он и пользуется.
Не всегда программа предоставляет именно графический интерфейс. Это может быть SOAP, REST интерфейс, или другое API. Чтобы использовать этот интерфейс, вы должны понимать:
- что подать на вход;
- что получается на выходе;
- какие исключения нужно обработать.
Пользователи работают с
GUI — graphical user interface. Программы работают с
API — Application programming interface. Им не нужна графика, только контракт.
Вызвать апи можно как напрямую, так и косвенно.
Напрямую:
- Система вызывает функции внутри себя
- Система вызывает метод другой системы
- Человек вызывает метод
- Автотесты дергают методы
Косвенно:
- Пользователь работает с GUI
Вызов API напрямую
1.
Система вызывает функции внутри себяРазные части программы как-то общаются между собой. Они делают это на программном уровне, то есть на уровне API!
Это самый «простой» в использовании способ, потому что автор API, которое вызывается — разработчик. И он же его потребитель! А значит, проблемы с неактуальной документацией нет =)
Шучу, проблемы с документацией есть всегда. Просто в этом случае в качестве документации будут комментарии в коде. А они, увы, тоже бывают неактуальны. Или разработчики разные, или один, но уже забыл, как делал исходное api и как оно должно работать…
2. Система вызывает метод другой системы
А вот это типичный кейс, которые тестируют тестировщики в интеграторах. Или тестировщики, которые проверяют интеграцию своей системы с чужой.
Одна система дергает через api какой-то метод другой системы. Она может попытаться получить данные из другой системы. Или наоборот, отправить данные в эту систему.
Допустим, я решила подключить подсказки из Дадаты к своему интернет-магазинчику, чтобы пользователь легко ввел адрес доставки.Я подключаю подсказки по API. И теперь, когда пользователь начинает вводить адрес на моем сайте, он видит подсказки из Дадаты. Как это получается:
- Он вводит букву на моем сайте
- Мой сайт отправляет запрос в подсказки Дадаты по API
- Дадата возвращает ответ
- Мой сайт его обрабатывает и отображает результат пользователю
Вон сколько шагов получилось! И так на каждый введенный символ. Пользователь не видит этого взаимодействия, но оно есть.
И, конечно, не забываем про кейс, когда мы разрабатываем именно API-метод. Который только через SOAP и можно вызвать, в интерфейсе его нигде нет. Что Заказчик заказал, то мы и сделали ¯\_(ツ)_/¯
Пример можно посмотреть в Users. Метод MagicSearch создан на основе реальных событий. Хотя надо признать, в оригинале логика еще замудренее была, я то под свой сайт подстраивала.Но тут фишка в том, что в самой системе в пользовательском интерфейсе есть только обычный поиск, просто строка ввода. Ну, может, парочка фильтров. А вот для интеграции нужна была целая куча доп возможностей, что и было сделано через SOAP-метод.
Функционал супер-поиска доступен только по API, пользователь в интерфейсе его никак не пощупает.
В этом случае у вас обычно есть ТЗ, согласно которому работает API-метод. Ваша задача — проверить его. Типичная задача тестировщика, просто добавьте к стандартным тестам на тест-дизайн особенности тестирования API, и дело в шляпе!
(что именно надо тестировать в API — я расскажу отдельной статьей чуть позднее)
3. Человек вызывает метод
Причины разные:
- Для ускорения работы
- Для локализации бага (проблема где? На сервере или клиенте?)
- Для проверки логики без докруток фронта
Если система предоставляет API, обычно проще дернуть его, чем делать то же самое через графический интерфейс. Тем более что вызов API можно сохранить в инструменте. Один раз сохранил — на любой базе применяешь, пусть даже она по 10 раз в день чистится.
Для примера снова идем в Users. Если мы хотим создать пользователя, надо заполнить уйму полей!Конечно, это можно сделать в помощью специальных плагинов типа Form Filler. Но что, если вам нужны адекватные тестовые данные под вашу систему? И на русском языке?
Заполнение полей вручную — грустно и уныло! А уж если это надо повторять каждую неделю или день на чистой тестовой базе — вообще кошмар. Это сразу первый приоритет на автоматизацию рутинных действий.
И в данном случае роль автоматизатора выполняет… Postman. Пользователя можно создать через REST-запрос CreateUser. Один раз прописали нормальные “как настоящие” данные, каждый раз пользуемся. Профит!
Вместо ручного заполнения формы (1 минута бездумного заполнения полей значениями «лпрулпк») получаем 1 секунду нажатия на кнопку «Send». При этом значения будут намного адекватнее.
А еще в постмане можно сделать отдельную папку подготовки тестовой базы, напихать туда десяток запросов. И вот уже на любой базе за пару секунд вы получаете столько данных, сколько вручную вбивали бы часами!
Если вы нашли баг и не понимаете, на кого его вешать — разработчика front-end или back-end, уберите все лишнее. Вызовите метод без графического интерфейса. А еще вы можете тестировать логику программы, пока интерфейс не готов или сломан.
4. Автотесты дергают методы
Есть типичная пирамида автоматизации:
- GUI-тесты — честный тест, «как это делал бы пользователь».
- API-тесты — опускаемся на уровень ниже, выкидывая лишнее.
- Unit-тесты — тесты на отдельную функцию
Слово API как бы намекает на то, что будет использовано в тестах ツ
Допустим, у нас есть:
- операция: загрузка отчета;
- на входе: данные из ручных или автоматических корректировок или из каких-то других мест;
- на выходе: отчет, построенный по неким правилам
Правила построения отчета:
- Ячейка 1: Х — Y
- Ячейка 2: Z * 6
- …
GUI-тесты — честный тест, робот делает все, что делал бы пользователь. Открывает браузер, тыкает на кнопочки… Но если что-то упадет, будете долго разбираться, где именно.
API-тесты — все то же самое, только без браузера. Мы просто подаем данные на вход и проверяем данные на выходе. Например, можно внести итоговый ответ в эксельку, и пусть робот выверяет ее, правильно ли заполняются данные? Локализовать проблему становится проще.
Unit-тесты — это когда мы проверяем каждую функцию отдельно. Отдельно смотрим расчет для ячейки 1, отдельно — для ячейки 2, и так далее. Такие тесты шустрее всего гоняются и баги по ним легко локализовать.
Косвенный вызов API
Когда пользователь работает с GUI, на самом деле он тоже работает с API. Просто не знает об этом, ему это просто не нужно.
То есть когда пользователь открывает систему и пытается загрузить отчет, ему не важно, как работает система, какой там magic внутри. У него есть кнопочка «загрузить отчет», на которую он и нажимает. Пользователь работает через GUI (графический пользовательский интерфейс).
Но на самом деле под этим графическим пользовательским интерфейсом находится API. И когда пользователь нажимает на кнопочку, кнопочка вызывает функцию построения отчета.
А функция построения отчета уже может вызывать 10 разных других функций, если ей это необходимо.
И вот уже пользователь видит перед собой готовый отчет. Он вызвал сложное API, даже не подозревая об этом!
В первую очередь, мы подразумеваем тестирование ЧЕРЕЗ API. «Тестирование API» — общеупотребимый термин, так действительно говорят, но технически термин некорректен. Мы не тестируем API, мы не тестируем GUI (графический интерфейс). Мы тестируем какую-то функциональность через графический или программный интерфейс.
Но это устоявшееся выражение. Можно использовать его и говорить “тестирование API”. И когда мы про это говорим, мы имеем в виду:
- автотесты на уровне API
- или интеграцию между двумя разными системами.
Интеграция — когда одна система общается с другой по какому-то протоколу передачи данных. Это называется Remote API, то есть общение по сети, по некоему протоколу (HTTP, JMS и т. д.). В противовес ему есть еще Local API (он же «Shared memory API») — это то API, по которому программа общается сама с собой или общается с другой программой внутри одной виртуальной памяти.
Когда мы говорим про тестирование API, чаще всего мы подразумеваем тестирование Remote API. Когда у нас есть две системы, находящихся на разных компьютерах, которые как-то между собой общаются.
И если вы видите в вакансии «тестирование API», скорее всего это подразумевает умение вызвать SOAP или REST сервис и протестировать его. Хотя всегда стоит уточнить!
API (Application programming interface)
— это контракт, который предоставляет программа. «Ко мне можно обращаться так и так, я обязуюсь делать то и это».
Контракт включает в себя:
- саму операцию, которую мы можем выполнить,
- данные, которые поступают на вход,
- данные, которые оказываются на выходе (контент данных или сообщение об ошибке).
Вызвать API можно как напрямую, так и косвенно:
- Система вызывает функции внутри себя
- Система вызывает метод другой системы
- Человек вызывает метод
- Автотесты дергают методы
- Пользователь работает с GUI
Когда говорят про API с тестировщиком, обсуждают два варианта:
- автотесты на уровне API (умение автоматизировать)
- интеграцию между двумя разными системами (обычно SOAP или REST, то есть работу в SOAP Ui или Postman).
Если вы хотите отработать второй вариант и поучиться отправлять запросики — используйте бесплатную систему
Users! И мои обучающие видосики, например, «
Как отправить REST-запрос за 5 минут».
API Docdoc расшифровка | MindMeister ментальными картами
API Docdoc расшифровка создатель Irina Vasileva1. Отзыв
1.1. Id
1.1.1. Уникальный идентификатор отзыва
1.1.1.1. 9185
1.2. Client
1.2.1. Каноническое имя клиента
1.2.1.1. Ирина
1.3. Text
1.3.1. Комментарий посетителя
1.3.1.1. Всё прошло хорошо, доктор нормальная, в принципе она молодец!
1.4. Date
1.4.1. Дата отзыва
1.4.1.1. 30.10.2013
1.5. DoctorId
1.5.1. Идентификатор врача
1.5.1.1. 167
1.6. ClinicId
1.6.1. Идентификатор клиники
1.6.1.1. 100
1.7. Answer
1.7.1. Текст ответа клиники на отзыв
1.7.1.1. null
1.8. RatingDoctor
1.8.1. Оценка врачу (от 0 до 10)
1. 8.1.1. 5
1.9. RatingClinic
1.9.1. Оценка клинике (от 0 до 10)
1.9.1.1. 5
1.10. RatingQlf
1.10.1. Оцененная посетителем квалификация
1.10.1.1. 4
1.11. RatingAtt
1.11.1. Оцененное посетителем отношение
1.11.1.1. 5
1.12. RatingRoom
1.12.1. Оцененные посетителем цена-качество
1.12.1.1. 4
1.13. WaitingTime
1.13.1. Ожидание в очереди (в минутах от 0 до 60)
1.13.1.1. 5
1.14. TagClinicLocation
1.14.1. Удобно добираться
1.14.1.1. true
1.15. TagClinicService
1.15.1. Качественное обслуживание
1.15.1.1. false
1.16. TagClinicCost
1.16.1. Доступные цены
1.16.1.1. true
1.17. TagClinicRecommend
1.17.1. Вы рекомендуете клинику
1.17.1.1. true
1.18. TagDoctorAttention
1.18.1. Врач был внимателен
1.18.1.1. false
1.19. TagDoctorExplain
1.19.1. Врач понятно объяснял
1.19.1.1. true
1.20.
TagDoctorQuality1.20.1. Цена соответствует качеству
1.20.1.1. true
1.21. TagDoctorRecommend
1.21.1. Вы рекомендуете врача
1.21.1.1. false
2. Данные врача
2.1. Входные параметры
2.1.1. ID
2.1.1.1. Число ID врача, передается всегда
2.1.2. city
2.1.2.1. Число ID города, может не передаваться
2.1.3. withSlots
2.1.3.1. Число Вывод временных слотов расписания врача
2.1.3.1.1. 0 — не выводить / 1 — выводить
2.1.4. slotsDays
2.1.4.1. Число Кол-во дней, на которое нужно выводить расписание врача. Если параметр не указан, то по умолчанию используется 21 день.
2.1.4.1.1. withSlots 1 — выводить
2.2. Врач
2.2.1. Id
2.2.1.1. число Уникальный идентификатор врача
2.2.1.1.1. 26705
2.2.2. Name
2.2.2.1. строка ФИО врача
2.2.2.1.1. Сергейко Анатолий Анатольевич
2.2.3. Alias
2.2.3.1. строка Алиас для ЧПУ
2.2.3.1.1. Sergeyko_Anatoliy
2. 2.4. Rating
2.2.4.1. вещ. число Рейтинг DocDoc врача
2.2.4.1.1. 4.75
2.2.5. InternalRating
2.2.5.1. вещ. число Внутренний рейтинг ДокДок врача
2.2.5.1.1. 1788.7
2.2.6. Price
2.2.6.1. число Меньшая стоимость первичного приёма из всех клиник где работает врач
2.2.6.1.1. 1700
2.2.7. SpecialPrice
2.2.7.1. число Меньшая специальная стоимость приёма из всех клиник где работает врач
2.2.7.1.1. 0 или 1000
2.2.8. Sex
2.2.8.1. число Пол специалиста
2.2.8.1.1. 0/1
2.2.9. Img
2.2.9.1. строка Путь к фотографии врача
2.2.9.1.1. https://cdn.docdoc.ru/doctor/53519_small.jpg
2.2.10. OpinionCount
2.2.10.1. число Число отзывов
2.2.10.1.1. 9
2.2.11. TextAbout
2.2.11.1. строка Информация о враче
2.2.11.1.1. Главный врач. Занимается исследованием гортани, пищевода, желудка, кишечника, удалением новообразования слизистой желудка и кишечника, проводит тест на Helicobacter Pilori, хромоскопию. Автор 43 статей.
2.2.12. Text*
2.2.12.1. Описание достижений, званий и тп. врача
2.2.12.1.1. Заполнен ли этот тег у врачей? Что в нем?
2.2.13. Departure
2.2.13.1. число Выезд домой
2.2.13.1.1. 1 — выбор врачей, выезжающих на дом
2.2.13.1.2. 0 — выбор врачей, не выезжающих на дом
2.2.14. ExperienceYear
2.2.14.1. число Стаж специалиста
2.2.14.1.1. 23
2.2.15. Category
2.2.15.1. строка Категория врача
2.2.15.1.1. Врач первой категории
2.2.16. Degree
2.2.16.1. строка Ученая степень
2.2.16.1.1. Кандидат медицинских наук
2.2.17. Rank
2.2.17.1. статус
2.2.17.1.1. Доцент Профессор Академик
2.2.18. Clinics
2.2.18.1. массив Массив клиник
2.2.18.1.1. Id
2.2.18.1.2. OnlineBooking
2.2.19. Specialities
2.2.19.1. массив Массив специальностей, от всех клиник где работает врач
2.2.19.1.1. Пример
2.2.20. Stations
2.2.20.1. массив Массив станций метро, на которых специалист преимущественно ведет свою деятельность
2. 2.20.1.1. Пример
2.2.21. Extra
2.2.21.1. поле, которое позволяет вывести врачей из близлежаших районов, чтобы предлагать пользователям альтернативу, на случай, если врачей по конкретному гео мало (null / geo / best)
2.2.22. KidsReception
2.2.22.1. число Врач принимает детей (Детский врач)
2.2.22.1.1. 1 — выбор врачей, осуществляющих детский прием
2.2.22.1.2. 0 — выбор врачей, не осуществляющих детский прием
2.2.23. Slots
2.2.23.1. Массив с данными по расписанию разбитый по клиникам
2.2.23.1.1. 0/1
2.2.24. ClinicsInfo
2.2.24.1. Массив данных с ценами, специальностью, рейтингом по клиникам
2.2.24.1.1. ClinicId
2.2.24.1.2. Longitude
2.2.24.1.3. Latitude
2.2.24.1.4. Stations
2.2.24.1.5. Specialities
2.2.25. Description
2.2.25.1. Описание врача от клиники
2.2.25.1.1. Главный врач. Занимается исследованием гортани, пищевода, желудка, кишечника, удалением новообразования слизистой желудка и кишечника, проводит тест на Helicobacter Pilori, хромоскопию. Автор 43 статей.
2.2.26. BookingClinics
2.2.26.1. Массив идентификаторов клиник с онлайн записью
2.2.26.1.1. [0] => 55
3. Данные клиники
3.1. Входные данные
3.1.1. workAllTime
3.1.1.1. 0 — клиника работает НЕ круглосуточно
3.1.1.2. 1 — клиника работает круглосуточно
3.1.1.3. круглосуточно — каждый день с 00:00 по 24:00, включая выходные
3.2. Клиника
3.2.1. id
3.2.1.1. число Уникальный идентификатор клиники
3.2.1.1.1. 5727
3.2.2. Name
3.2.2.1. строка Название клиники
3.2.2.1.1. Ниармедик на Гамалеи
3.2.3. ShortName
3.2.3.1. Короткое название клиники
3.2.3.1.1. Ниармедик на Гамалеи
3.2.4. RewriteName
3.2.4.1. Название клиники для ur
3.2.4.1.1. niarmedik_na_shtukinskoy
3.2.5. Alias
3.2.5.1. строка Алиас
3.2.6. URL
3.2.6.1. строка Адрес url
3.2.6.1.1. http://www.nrmed.ru/
3.2.7. logoPath
3.2.7.1. cтрока Название файла логотипа
3. 2.7.1.1. logo_clinica_niarmedic_na_shukinskoi.jpg
3.2.8. Logo
3.2.8.1. url логотипа
3.2.8.1.1. https://s.docdoc.ru/img/clinic/logo/logo_clinica_niarmedic_na_shukinskoi.jpg?1517881855
3.2.9. Geo
3.2.9.1. City
3.2.9.1.1. строка Идентификатор города
3.2.9.2. Street
3.2.9.2.1. строка Улица
3.2.9.3. House
3.2.9.3.1. строка Дом
3.2.9.4. StreetId
3.2.9.4.1. строка Идентификатор улицы
3.2.9.5. DistrictId
3.2.9.5.1. cтрока Идентификатор района
3.2.9.6. Stations
3.2.9.6.1. массив Список станций метро
3.2.9.7. Longitude
3.2.9.7.1. строка Долгота
3.2.9.8. Latitude
3.2.9.8.1. строка Широта
3.2.10. Контакты
3.2.10.1. Phone
3.2.10.1.1. Контактный телефон docdoc колл-центра
3.2.10.2. PhoneAppointment
3.2.10.2.1. Прямой телефон клиники. Записи через него оплачены не будут. Используйте ReplacementPhone
3.2.10.3. ReplacementPhone
3.2.10.3.1. Подменный телефон для клиники (если у вас нет подменного телефона сюда будет передаваться Phone = телефон нашего колл-центра)
3. 2.10.4. Email
3.2.10.4.1. [email protected]
3.2.11. Doctors
3.2.11.1. массив строк Доктора клиники
3.2.12. Description
3.2.12.1. строка Описание
3.2.12.1.1. Многопрофильный медицинский центр. Обследование взрослых. Расположен в 10 мин. езды на общ. транспорте от м. Щукинская (марш. №100м до ост. Институт им. Гамалеи). Прием происходит по предварительной записи.
3.2.13. ShortDescription
3.2.13.1. строка Краткое описание
3.2.13.1.1. Многопрофильный медицинский центр. Обследование взрослых. Расположен в 10 мин. езды на общ. транспорте от м. Щукинская (марш. №100м до ост. Институт им. Гамалеи). Прием происходит по предварительной записи.
3.2.14. Вид клиники
3.2.14.1. IsDiagnostic
3.2.14.1.1. строка Флаг — диагностический центр
3.2.14.2. IsClinic
3.2.14.2.1. строка Флаг — клиника
3.2.14.3. IsDoctor
3.2.14.3.1. строка Флаг — частный врач
3.2.15. TypeOfInstitution
3.2.15.1. Тип клиники
3. 2.15.1.1. многопрофильный медицинский центр
3.2.15.1.2. многопрофильная медицинская клиника
3.2.15.1.3. и т.п.
3.2.16. ScheduleState
3.2.16.1. cтрока Работа по онлайн расписанию
3.2.16.1.1. disable
3.2.17. MinPrice
3.2.17.1. Минимальная цена первичного приема
3.2.17.1.1. 1600
3.2.18. MaxPrice
3.2.18.1. Максимальная цена первичного приема
3.2.18.1.1. 1950
3.2.19. Diagnostics
3.2.19.1. массив Список исследований
3.2.19.1.1. [Id] => 86
3.2.19.1.2. [Name] => УЗИ (ультразвуковое исследование) органов малого таза
3.2.19.1.3. [Price] => 1800
3.2.19.1.4. [SpecialPrice] => 0
3.2.20. Specialities
3.2.20.1. массив Список специальностей
3.2.20.1.1. [Id] => 67
3.2.20.1.2. [Name] => Акушер
3.2.20.1.3. [Alias] => akusher
3.2.21. Services
3.2.21.1. массив Массив услуг в которых указана цена
3.2.21.1.1. [ServiceId] => 436
3.2. 21.1.2. [ServiceName] => Криотерапия псориатических бляшек
3.2.21.1.3. [Price] => 650
3.2.21.1.4. [SpecialPrice]=> 0
3.2.22. Schedule
3.2.22.1. массив Время работы по дням недели
3.2.22.1.1. [Day] => 0
3.2.22.1.2. [StartTime] => 08:00
3.2.22.1.3. [EndTime] => 21:00
3.2.22.1.4. [DayTitle] => пн-пт
3.2.23. Order
3.2.23.1. Порядок сортировки клиник по умолчанию
3.2.23.1.1. 912
3.2.24. Rating
3.2.24.1. Рейтинг отображаемый на сайте
3.2.24.1.1. 9.09
3.2.25. ParentId
3.2.25.1. целое число Идентификатор основной клиники, если текущая клиника — основная, то идентификатор текущей клиники
3.2.25.1.1. 5727
3.2.26. BranchesId
3.2.26.1. Масиив целых чисел — идентификаторов филиалов сетевой клиники. Если текущая клиника является филиалом, то ее идентификатор тоже будет тут.
3.2.26.1.1. [0] => 242
3.2.26.1.2. [1] => 243
3.2.26.1.3. [2] => 244
3. 2.27. OnlineRecordDoctor
3.2.27.1. Возможна ли запись онлайн к врачу в этой клинике
3.2.28. IsActive
3.2.28.1. Состояние активности клиники (активна/неактивна)
4. Рекомендации перед приёмом
4.1. Входные параметры
4.1.1. sector
4.1.1.1. число Идентификатор специализации врача
4.1.1.1.1. 0/1
4.1.2. service
4.1.2.1. число Идентификатор услуги
4.1.2.1.1. 0/1
4.1.3. diagnostic
4.1.3.1. число Идентификатор диагностики
4.1.3.1.1. 0/1
4.2. Рекомендация
4.2.1. Id
4.2.1.1. число Уникальный идентификатор
4.2.2. Title
4.2.2.1. строка Заголовок
4.2.3. Image
4.2.3.1. URL Ссылка на картинку для рекомендации
4.2.4. Text
4.2.4.1. текст Текст рекомендации (в формате HTML)
5. Изображения клиники
5.1. clinicID
5.1.1. Число Идентификатор клиники
5.2. description
5.2.1. null
5.3. url
5.3.1. https://s.docdoc. ru/img/clinic/photos/1293_453.jpg
6. Диагностические услуги и подуслуги
6.1. Id
6.1.1. число Уникальный идентификатор услуги
6.2. Name
6.2.1. строка Наименование услуги
6.3. Alias
6.3.1. строка Наименование услуги для ЧПУ
6.4. SubDiagnosticList
6.4.1. массив Подуслуги
6.5. Id @ SubDiagnosticList
6.5.1. число Идентификатор подуслуги
6.6. Name @ SubDiagnosticList
6.6.1. строка Наименование подуслуги
6.7. Alias @ SubDiagnosticList
6.7.1. строка Наименование подуслуги для ЧПУ
7. Услуги
7.1. Id
7.1.1. число идентификатор услуги
7.1.1.1. 3469
7.2. Name
7.2.1. строка название услуги
7.2.1.1. Циркумцизио (обрезание)
7.3. Lft
7.3.1. число левая позиция в дереве
7.3.1.1. 6391
7.4. Rgt
7.4.1. число правая позиция в дереве
7.4.1.1. 6392
7.5. Depth
7.5.1. число уровень вложенности
7. 5.1.1. 2
7.6. SectorId
7.6.1. число id специализации
7.6.1.1. 69
7.7. DiagnosticId
7.7.1. число id диагностики, связанной с этой услугой
7.7.1.1. Нигде не отмечено!
7.8. Price
7.8.1. Есть только в клинике
7.8.1.1. 650
7.9. SpecialPrice
7.9.1. Есть только в клинике
7.9.1.1. 500
8. Запись на прием
8.1. Подбор врача
8.1.1. Обязательные поля
8.1.1.1. city
8.1.1.2. name
8.1.1.3. phone
8.2. Запись к врачу
8.2.1. Обязательные поля
8.2.1.1. name
8.2.1.2. phone
8.2.1.3. doctor
8.2.1.4. clinic
8.3. Запись в клинику
8.3.1. Обязательные поля
8.3.1.1. name
8.3.1.2. phone
8.3.1.3. clinic
9. Время работы по врачам/диагностикам в клинике
9.1. Id
9.1.1. число Уникальный идентификатор Слота
9.1.1.1. 1
9.2. StartTime
9.2.1. строка Время начала
9.2.1.1. 2014-01-01 00:00:00
9.
3. FinishTime9.3.1. строка Время окончания
9.3.1.1. 2014-01-01 01:10:10
10. Geo
10.1. Список станций метро/районов
10.1.1. Id
10.1.1.1. число Уникальный идентификатор станции метро
10.1.2. Alias
10.1.2.1. строка Наименование станции для ЧПУ
10.1.3. Name
10.1.3.1. строка Наименование станции
10.1.4. LineName
10.1.4.1. строка Имя линии станций метро
10.1.5. LineColor
10.1.5.1. строка Цвет линии станций метро
10.1.6. CityId
10.1.6.1. Число Уникальный идентификатор города
10.1.7. DistrictIds
10.1.7.1. массив Идентификаторы районов
10.2. Cписок улиц
10.2.1. Id
10.2.1.1. число Уникальный идентификатор станции метро
10.2.2. CityId
10.2.2.1. Число Уникальный идентификатор города
10.2.3. Title
10.2.3.1. строка Название улицы
10.2.4. RewriteName
10.2.4.1. строка Название улицы для ЧПУ
Что такое REST API? — Российская Федерация
REST API обеспечивают гибкую, упрощенную интеграцию приложений, а также являются самым популярным методом связывания компонентов в микросервисных архитектурах.
Что такое REST API?
API или программный интерфейс приложения представляет собой набор правил, определяющих способ взаимодействия между приложениями или устройствами. REST API — это API, соответствующий принципам архитектурного стиля REST (от англ. Representational State Transfer — «передача состояния представления»). По этой причине REST API иногда называют RESTful API.
REST (сам термин был введен Роем Филдингом в его докторской диссертации в 2000 году) обеспечивает относительно высокий уровень гибкости и свободы для разработчиков. Но гибкость — лишь одна из причин, объясняющих популярность REST API как способа взаимодействия между компонентами и приложениями в микросервисной архитектуре.
Принципы проектирования REST
На самом базовом уровне API можно представить как механизм, с помощью которого одно приложение или сервис может получить доступ к ресурсу другого приложения или сервиса. Приложение или сервис, запрашивающий доступ, называется клиентом, а приложение или сервис, обладающий необходимым ресурсом, называется сервером.
Некоторые API, например SOAP или XML-RPC, устанавливают строгие ограничения для разработчиков. Однако для разработки REST API можно использовать практически любой язык программирования и разнообразные форматы данных. Единственное требование заключается в соблюдении шести принципов проектирования REST, известных также как архитектурные ограничения:
- Единый интерфейс. Все запросы API к одному и тому же ресурсу должны выглядеть одинаково, независимо от отправителя. В REST API один и тот же элемент данных, например имя или адрес электронной почты пользователя, должен принадлежать одному универсальному коду ресурса (URI). Размер ресурсов не должен быть слишком большим, однако ресурсы должны содержать всю информацию, которая может потребоваться клиенту.
- Разделение клиента и сервера. В соответствии с требованиями REST API клиент и сервер должны работать полностью независимо друг от друга. Клиентскому приложению достаточно знать URI запрашиваемого ресурса; иначе взаимодействие с серверным приложением будет невозможно. Аналогичным образом, серверное приложение не должно вносить никаких изменений в клиентское приложение, а только передавать запрошенные данные через HTTP.
- Отсутствие сохранения состояния. REST API функционируют без сохранения состояния, т. е. каждый запрос должен содержать всю информацию, необходимую для его обработки. Другими словами, для REST API не требуется установление постоянных сеансов с сервером. Серверным приложениям запрещено хранить какие-либо данные, связанные с запросом клиента.
- Поддержка кэширования. По возможности ресурсы должны поддерживать кэширование на стороне клиента или сервера. Ответы сервера также должны хранить информацию о том, разрешено ли кэширование для предоставленного ресурса. Это позволяет увеличить производительность на стороне клиента, одновременно повысив масштабируемость на стороне сервера.
- Многоуровневая архитектура системы. В REST API вызовы и ответы передаются через разные уровни. Предполагается, что клиентское и серверное приложения не взаимодействуют между собой напрямую. Цепочка передачи данных может включать несколько промежуточных узлов. REST API должны проектироваться таким образом, чтобы ни клиент, ни сервер не могли знать, взаимодействуют они с конечным приложением или промежуточным узлом.
- Код по требованию (необязательное требование). REST API обычно отправляют статические ресурсы, однако в некоторых случаях ответ может содержать исполняемый код (например, Java-апплеты). В таких случаях код должен выполняться только по требованию.
Принцип работы REST API
REST API используют запросы HTTP для выполнения стандартных функций базы данных, таких как создание, чтение, обновление и удаление записей (так называемые функции CRUD). Например, REST API может использовать запрос GET для получения записи, запрос POST для создания записи, запрос PUT для обновления записи и запрос DELETE для удаления записи. В вызовах API поддерживаются все методы HTTP. Хорошо продуманный REST API можно сравнить с веб-сайтом, который работает в веб-браузере со встроенной поддержкой HTTP.
Состояние ресурса в любой момент времени («отметка времени») называется представлением ресурса. Эта информация может быть предоставлена клиенту практически в любом формате, включая JavaScript Object Notation (JSON), HTML, XLT, Python, PHP или текстовом формате. Популярность JSON обусловлена тем, что данный формат не зависит от языка программирования и понятен как человеку, так и компьютеру.
Важную роль в вызовах REST API также играют заголовки и параметры запросов, поскольку они содержат такую важную информацию, как метаданные, разрешения, универсальные коды ресурсов (URI), сведения о кэшировании, файлы cookie и многое другое. Заголовки запросов и ответов применяются в хорошо продуманных REST API вместе с обычными кодами состояния HTTP.
Рекомендации по использованию REST API
С одной стороны, гибкость является огромным преимуществом при проектировании REST API; с другой стороны, гибкость может стать причиной дефективного или неэффективного API. По этой причине профессиональные разработчики делятся передовыми практиками в спецификациях REST API.
Спецификация OpenAPI (OAS) определяет интерфейс для описания API, чтобы обеспечить разработчикам и приложениям полное понимание всех параметров и возможностей API, включая доступные конечные точки, разрешенные операции для каждой конечной точки, параметры операций, методы аутентификации и прочую информацию. Последняя версия, OAS3 (внешняя ссылка), содержит полезные инструменты, например OpenAPI Generator, для создания клиентов API и серверных заглушек на разных языках программирования.
Для обеспечения безопасности REST API также следует опираться на передовой отраслевой опыт, в частности использование алгоритмов хэширования для защиты паролей и HTTPS для безопасной передачи данных. Для ограничения прав доступа сторонних приложений можно использовать инфраструктуру авторизации, например OAuth 2.0 (внешняя ссылка). Кроме того, API может отклонять любые запросы, поступающие по истечении определенного периода времени, используя отметку времени в заголовке HTTP. Существуют и другие способы контроля доступа к API: проверка параметров и веб-маркеры JSON.
REST API и IBM Cloud
Перечисленные выше преимущества означают, что REST API остается неотъемлемой составляющей процесса разработки программного обеспечения, особенно с ростом спроса на более эффективные интерфейсы взаимодействия с клиентами и приложения для бизнеса и ИТ-операций.
Хорошим способом удовлетворить эти растущие требования является автоматизация. Прежде чем внедрять обширную автоматизацию, начните с небольших проектов, успешность которых можно измерить. Достигнутые результаты можно будет оптимизировать и распространить на новые процессы в других подразделениях организации. Работая с IBM, вы получите доступ к средствам автоматизации на основе ИИ, в том числе и к готовым процессам, которые помогут ускорить внедрение инноваций за счет интеллектуальной составляющей.
Воспользуйтесь инструментами и услугами IBM для решения проблем, связанных с API, включая проблемы безопасности, управления и автоматизации, в ходе модернизации приложений.
Сделайте следующий шаг:
- Узнайте больше о предложении IBM Cloud Pak for Integration, в основе которого лежат базовые функции IBM API Connect, обеспечивающие архитекторам и администраторам полный контроль над жизненным циклом API.
- Посетите раздел Документация API для IBM Cloud с подробной информацией об API, поддерживаемых IBM Cloud.
- Заполните анкету для оценки зрелости интеграции по важнейшим параметрам и получите рекомендации в отношении дальнейших действий.
- Загрузите Руководство по гибкой интеграции, в котором рассматриваются преимущества контейнерного, децентрализованного подхода к интеграции решений на основе микросервисов.
Начните работать с учетной записью IBM Cloud уже сегодня.
tokenDecrypt — расшифровка токена ApplePay/GooglePay
Выполняется с помощью команды tokenDecrypt. Этот запрос позволяет выполнить расшифровку ApplePay/GooglePay токена для получения данных карты и последующих безакцептных списаний.
Использование этого метода возможно только для Продавцов с сертификатом соответствия PCI DSS.
Название | Описание | Формат | Обязательный |
---|---|---|---|
merchant_name | Идентификатор Продавца. Выдается продавцу с параметрами тестового/боевого доступа | Строка | |
type | Тип передаваемого токена (applepay /googlepay ) | Строка | |
token | ApplePay/GooglePay токен в кодировке base64 | Строка | |
signature 1 | Подпись запроса в кодировке base64 | Строка |
1 Подпись формируется следующим образом:
- Составляется строка формата merchant_name+type, пример: TestMerchantapplepay
- Результат подписывается с помощью
Private Key
методом SHA-256 + RSA PKCS#1 v1. 5 - Полученная строка кодируется в base64
2 Генерируется 2 пары ключей RSA — 2048 bit в PEM формате, мерчант передает свой Public Key
theMAP, theMAP в свою очередь передает свой Public Key
мерчанту
Пример запроса POST:
Content-Type: application/json
https:{domain}/tokenDecrypt
{
"type": "googlepay",
"merchant_name": "AMerchant",
"token": "eyJzaWduYXR1cmUiOiJNRVVDSUQzZDdzUFA1RVF...",
"signature": "nZS00Ke2Okj6ccTqwj+Yf5iHfLq3XKYzJtb8AO33jsBrEbIp..."
}
Пример реализации запроса в программном коде:
curl -X POST \
https:{domain}/tokenDecrypt \
-H 'Content-Type: application/json' \
-d '{"type": "googlepay","merchant_name": "AMerchant","token": "eyJzaWduYXR1cmUiOiJNRVVDSUQzZDdzUFA1RVF...","signature": "nZS00Ke2Okj6ccTqwj+Yf5iHfLq3XKYzJtb8AO33jsBrEbIp..."}'
Название | Описание | Фромат |
---|---|---|
Success | Флаг успешности операции | true/false |
Data 1 | Зашифрованные, с помощью Public Key , карточные данные | Строка в кодировке base64 |
Signature 2 | Подпись ответа | Строка в кодировке base64 |
MerchantName | Наименование продавца | Строка |
1 Для расшифровки данных требуется:
Декодировать строку из base64
Результат расшифровать методом PKCS#1 v1. 5, с помощью Private Key
Результат расшифровки:
{"pan":"4111111111111111","emonth":12,"eyear":21}
2 Для проверки подписи требуется:
Декодировать строку из base64
Произвести проверку методом PKCS#1 v1.5 строки, полученной из MerchantName
+Type
+Success
+ErrCode
Пример успеха:
TestMerchantapplepaytrue
Пример неуспеха:
TestMerchantapplepayfalseWRONG_PARAMS
Пример ответа на успешный запрос:
{
"Success": true,
"Data": "NUq05+myUdUQAMBwBsd4ESaulXsrAdTSYub9woNt4cESWcTPl5rxbp3HW1KCcUM5MJGS3WqWERM/CokZu9I7K+JSTXtmOaYInFyT3qPl5RAVWgSYoZUlIE5WOFp+sNHn5KEKWtVY18hjj6utYgfGMqBcGMd9uDOJGydIWS9y3yizE3sygGGtOdL1CUE0aPUbw2o096p4+q6sQXYh4fb6HolWURKRSHmTnbJnWd4UkVS52joSkHdv7nS743bjCRBgzHDqQINLix2XGJ/VEoxNRWVUvrU88NpPiHyWtX2XDPEokMXaXtdRbevPJ0hj2kyNFxy1HbLf6DBb81B1esoTlg==",
"Signature": "pu7YK2loiUTGeWr+Bb8MvVRVEd7en20EPjvHUUZnfo6leOP5zoSR762IJGRQn6DPMdxy7/JhsB65sASevCRKgRYB+X80WTUIxHTLzYRUs7HMgIJvRkGCiMm0lHA+eKN1pryIH6SsewMKyXPFlDl/+w3V+IDjgD7C6Yhx4NEDT9RVY8vDVObyh8VaTjMGnRZx2haF+7RwGFuTLrYzRleoR2fasGjnkYgCLn6/tzPF9cqA7VLpO5IiYwy3s1l+jWRg6Q5AV2J6E7ttgJm5Wu3f6Tqv64V49i4SmnAIEfPOJppJbKZ+30aKTYEHRpaMy53B4akAd+JhbYy76dtd6JaQ==",
"MerchantName": "AMerchant"
}
Пример ответа на не успешный запрос:
{
"Success": false,
"ErrCode": "WRONG_PARAMS",
"ErrMessage": "operation not allowed",
"Signature": "yXkao+MyG9K9LY5bL2ohKGECox1HD8CRYWyax4t5V7vN2QmkoYnk18aM9eU9fN8b3cAbhTphoZ5Z5ps2szVdDozHBONZov6WDmmkpvB5+IonCVxDG3AIAeBEB+KlTyBTF3Xt43QdCE8YtzmUmdRuTnYhGF1eyG661A4a6S9V+SC6Yej6WIJcAVFAtFrr4wZI/z3m1PJFhA0WoKpan0Vp1GWJ7OCT7p7pBedyJP5AEi+4lphXAeXYqteMA4/wVPWCdmXv02illmrwYguNIcnCvkmJig+VOMxT9UTKma2sf3iwLrwy/omKgrDWrBhDzx12rahI6OqQscBgEt8PNwGc8Q=="
}
Шифрование и дешифрование данных
В этом руководстве описывается, как работают шифрование и дешифрование с помощью Google API шифрования на стороне клиента рабочей области.
Примечание: Вы должны разрешить список любых услуг поставщика удостоверений (IdP), используемых пользователями. обмен зашифрованными файлами. Обычно вы можете найти необходимые данные IdP в их общедоступный хорошо известный файл; в противном случае обратитесь в Администратор Google Workspace за подробные сведения об их IdP.Шифровать данные
Когда пользователь Google Workspace запрашивает сохранение или хранение в зашифрованном виде на стороне клиента.
(CSE), Google Workspace отправляет обертку
запрос на URL-адрес вашей конечной точки KACLS для шифрования.В дополнение к необязательному
проверки безопасности, такие как проверки периметра и проверки JWT на основе утверждений, ваш KACLS должен
выполните следующие действия:
Подтвердите запрашивающего пользователя.
- Проверить оба токена аутентификации и токен авторизации.
- Убедитесь, что токены авторизации и аутентификации принадлежат одному и тому же пользователю, поиск без учета регистра в заявках по электронной почте.
- Убедитесь, что утверждение роли
- Убедитесь, что утверждение
kacls_url
в токене авторизации соответствует текущий URL-адрес KACLS. Эта проверка позволяет выявить потенциальные серверы посредника, настроенные инсайдерами или мошенническим доменом администраторы. - Выполнить проверку периметра с использованием аутентификации и авторизации претензии.
Зашифруйте следующие части, используя аутентифицированный алгоритм шифрования:
- Ключ шифрования данных (DEK)
- Значения
resource_name
иperimeter_id
из токена авторизации - Любые дополнительные конфиденциальные данные
Зарегистрируйте операцию, включая пользователя, ее инициировавшего,
имя_ресурса
и причина передана в запросе.Вернуть непрозрачный двоичный объект, который будет храниться в Google Workspace вместе с зашифрованный объект и отправляется как есть при любой последующей распаковке ключа операция. Или отправьте структурированный ответ об ошибке.
- Бинарный объект должен содержать единственную копию зашифрованного DEK, в нем могут храниться данные, специфичные для реализации.
wrapped_key
, чтобы предотвратить расхождения в течение срока службы
файл.Google не отправляет запросы на удаление в KACLS, когда объекты
удалено.Расшифровать данные
Когда пользователь Google Workspace запрашивает открытие зашифрованных на стороне клиента данных (CSE),
Google Workspace отправляет запрос развертки
на URL-адрес конечной точки KACLS для дешифрования. В дополнение к дополнительной безопасности
проверки, такие как периметр и проверки на основе утверждений JWT, ваш KACLS должен выполнять
следующие шаги:
Подтвердите запрашивающего пользователя.
- Проверить оба токена аутентификации и токен авторизации.
- Убедитесь, что токены авторизации и аутентификации принадлежат одному и тому же пользователю, поиск без учета регистра в заявках по электронной почте.
- Убедитесь, что утверждение роли
- Убедитесь, что утверждение
kacls_url
в токене авторизации соответствует текущий URL-адрес KACLS. Это позволяет обнаружить потенциального посредника. серверы, настроенные инсайдерами или мошенническими администраторами домена.
Расшифруйте следующие части, используя аутентифицированный алгоритм шифрования:
- Ключ шифрования данных (DEK)
- Значения
resource_name
иperimeter_id
из токена авторизации - Любые дополнительные конфиденциальные данные
Убедитесь, что
имя_ресурса
в токене авторизации и расшифрованном большом двоичном объекте соответствие.Выполните проверку периметра с использованием утверждений аутентификации и авторизации.
Зарегистрируйте операцию, включая пользователя, ее инициировавшего,
имя_ресурса
и причина передана в запросе.Вернуть развернутый DEK или структурированный ответ об ошибке.
takeout_unwrap
.Расшифровка SSL / TLS
Способ расшифровки SSL-трафика зависит от набора шифров и вашего сервера реализация.
Если ваш трафик SSL зашифрован с помощью наборов шифров PFS, вы можете установить Программное обеспечение пересылки ключей сеанса ExtraHop на каждом сервере, имеющем трафик SSL, который вы хочу расшифровать. Ключ сеанса перенаправляется в систему ExtraHop, и трафик может расшифровать. Обратите внимание, что ваши серверы должны поддерживать программное обеспечение пересылки ключей сеанса.
Если у вас есть балансировщик нагрузки F5, вы можете поделиться ключами сеанса через балансировщик и избегайте установки программного обеспечения переадресации ключей сеанса на каждом сервере.
Если ваш SSL-трафик зашифрован с помощью наборов шифров RSA, вы все равно можете установить программное обеспечение пересылки ключей сеанса на ваших серверах (рекомендуется). В качестве альтернативы вы можете загрузить сертификат и закрытый ключ в систему ExtraHop
Мы рекомендуем расшифровывать только тот трафик, который вам нужен. Вы можете настроить система ExtraHop для расшифровки только определенных протоколов и сопоставления трафика протокола с нестандартные порты.
Расшифровка пакетов для судебных аудитов
Если у вас настроено устройство Trace или другое хранилище пакетов, вы можете хранить ключи сеанса на устройстве Trace, и вы можете загрузить ключи сеанса с помощью захваты пакетов, чтобы вы могли расшифровать пакеты с помощью инструмента анализа пакетов, такого как Wireshark. Эти параметры позволяют безопасно расшифровывать трафик без совместного использования. долгосрочные приватные ключи с аналитиками.
Система хранит ключи сеанса только для пакетов на диске — поскольку пакеты перезаписываются, соответствующие сохраненные ключи сеанса удаляются. Только сеансовые ключи для дешифрованного трафика отправляются на устройство Trace для хранения. Система ExtraHop отправляет сеанс ключ со связанной информацией о потоке к устройству Trace. Если у пользователя есть пакетов и привилегий сеансового ключа, сеансовый ключ предоставляется, когда есть соответствующий поток в запрошенном временном диапазоне.Посторонние сеансовые ключи не сохраняются, и нет ограничений на количество ключей сеанса, которые система ExtraHop может Получать.
Рекомендуем соблюдать осторожность при предоставлении привилегий системе ExtraHop. пользователей. Вы можете указать привилегии, которые позволяют пользователям просматривать и загружать пакеты или просматривать и загружать пакеты и сохраненные ключи сеанса. Сохраненные ключи сеанса должны быть только доступен для пользователей, которые должны иметь доступ к конфиденциальному расшифрованному трафику.В то время как Система ExtraHop не записывает расшифрованные данные полезной нагрузки на диск, доступ к сеансу keys позволяет расшифровать связанный трафик. Для обеспечения непрерывной безопасности ключи сеанса шифруются при перемещении между устройствами, а также когда ключи хранятся на диске.
Расшифровка | Cribl Docs
Расшифровка данных
В настоящее время Cribl LogStream поддерживает расшифровку только в том случае, если конечной системой является Splunk.В Splunk дешифрование доступно пользователям любой роли с разрешениями на запуск команды decrypt
, которая поставляется с приложением Cribl для Splunk. Дополнительные ограничения могут применяться с возможностями Splunk . На этой странице представлены подробности.
Расшифровка в Splunk
Расшифровка в Splunk осуществляется с помощью специальной команды под названием decrypt
. Чтобы использовать команду, пользователи должны принадлежать к роли Splunk, у которой есть разрешения на ее выполнение. Возможности, которые согласованы с классами ключей Cribl, могут быть связаны с конкретной ролью для дальнейшего управления областью дешифрования
.
Команда дешифрования — ТОЛЬКО поисковая головка
Чтобы ключи не распределялись между всеми поисковыми узлами, включая одноранговые узлы, которые ваша поисковая голова может выполнять поиск, но у вас нет полного контроля над ними — decrypt
предназначен для запуска локально на установленной поисковой головке.
Ограничение доступа с помощью возможностей Splunk
В Splunk имена возможностей должны соответствовать формату cribl_keyclass_N
, где N
— это класс ключа Cribl. Например, роль с возможностью cribl_keyclass_1
имеет доступ ко всем идентификаторам ключей, связанным с классом ключей 1
.
Имя возможности | Соответствующий класс ключа Cribl |
---|---|
cribl_keyclass_1 cribl_keyclass_2 … N _keyclass |
Настройка Splunk Search Head для расшифровки данных
Вы настроили расшифровку в Splunk в соответствии со следующей схемой:
- Загрузите приложение Cribl / LogStream для Splunk со страницы Cribl Download LogStream: в On Prem раздел, выберите приложение Splunk из раскрывающегося списка, как показано.При нажатии оранжевой кнопки загружается файл с именем:
cribl-splunk-app- <версия - #> - <хеш - #> - linux-x64.tgz
.
Чтобы установить приложение Cribl / LogStream для Splunk в поисковой головке, распакуйте пакет в каталог
$ SPLUNK_HOME / etc / apps
.
Начиная с LogStream v1.7, приложение по умолчанию будет работать в режиме заголовка поиска. Если приложение было ранее установлено и позже изменено, вы можете преобразовать его в режим поисковой головки с помощью команды:$ CRIBL_HOME / bin / cribld mode-searchhead
.(При установке в качестве приложения Splunk$ CRIBL_HOME
будет$ SPLUNK_HOME / etc / apps / cribl
.)Назначьте разрешения команде
decrypt
в соответствии с вашими требованиями.Назначьте возможности вашим ролям в соответствии с вашими требованиями. Если вы хотите создать больше возможностей, убедитесь, что они соответствуют соглашению об именах, определенному выше.
Синхронизация
auth / (cribl.secret | keys.json)
. Для успешного дешифрования данных командеdecrypt
потребуется доступ к тем же ключам, которые использовались для шифрования, в экземпляре Cribl, где произошло шифрование .
При развертывании с одним экземпляром файлы
cribl.secret
иkeys.json
находятся в:$ CRIBL_HOME / local / cribl / auth /
.В распределенном развертывании эти файлы находятся на ведущем узле в:
$ CRIBL_HOME / groups /
./ local / cribl / auth / При использовании пользовательского интерфейса LogStream эти файлы можно загрузить, нажав кнопку Get Key Bundle .
Синхронизируйте / копируйте эти файлы в их копии в поисковой головке (сторона дешифрования). В интеграции без Splunk вы должны скопировать эти активы туда, где будет происходить дешифрование.
При обновлении ключей путем редактирования файла keys.json
необходимо добавить их обратно в указанные выше каталоги (соответственно, на одном экземпляре или на ведущем узле распределенного развертывания).
Расшифровка — Справочник по API | Центр документации Alibaba Cloud
Расшифровывает зашифрованный текст, указанный параметром CiphertextBlob.
Отладка
OpenAPI Explorer автоматически вычисляет значение подписи. Для вашего удобства мы рекомендуем вызывать эту операцию в OpenAPI Explorer. OpenAPI Explorer динамически генерирует пример кода операции для разных SDK.
Параметры запроса
Параметр | Тип | Обязательно | Пример | Описание |
---|---|---|---|---|
Действие | Строка | Есть | Расшифровать | Операция, которую вы хотите выполнить. Установите значение «Расшифровать». |
Блок зашифрованного текста | Строка | Есть | DZhOWVmZDktM2QxNi00ODk0LWJkNGYtMWZjNDNmM2YyYWJmaaSl + TztSIMe43nbTH / Z1Wr4XfLftKhAciUmDQXuMRl4WTvKhxjMThjK | Зашифрованный текст, который вы хотите расшифровать. Вы можете сгенерировать зашифрованный текст, вызвав следующие операции: |
EncryptionContext | Json | № | {«Пример»: «Пример»} | Строка JSON, состоящая из пар «ключ-значение». |
Параметры ответа
Параметр | Тип | Пример | Описание |
---|---|---|---|
KeyId | Строка | 202b9877-5a25-46e3-a763-e20791b5 **** | Идентификатор главного ключа клиента (CMK), который используется для дешифрования зашифрованного текста. Это GUID CMK. |
KeyVersionId | Строка | 2ab1a983-7072-4bbc-a582-584b5bd8 **** | Идентификатор версии CMK, которая используется для дешифрования зашифрованного текста. |
Обычный текст | Строка | tRYXuCwgja12xxO1N / gZERDDCLw9doZEQiPDk / Bv **** | Открытый текст, который создается после дешифрования. |
RequestId | Строка | 207596a2-36d3-4840-b1bd-f87044699bd7 | Идентификатор запроса. |
Примеры
Образцы запросов
https: // [Конечная точка] /? Action = Расшифровать
& CiphertextBlob = DZhOWVmZDktM2QxNi00ODk0LWJkNGYtMWZjNDNmM2YyYWJmaaSl + TztSIMe43nbTH / Z1Wr4XfLftKhAciUmDQXuMRl4WTvKhxjM
& <Общие параметры запроса>
Пример успешных ответов
Формат XML
202b9877-5a25-46e3-a763-e20791b5 ****
2ab1a983-7072-4bbc-a582-584b5bd8 ****
tRYXuCwgja12xxO1N / gZERDDCLw9doZEQiPDk / Bv ****
4bd560a1-729e-45f1-a3d9-b2a33d61046b
Формат JSON
{
"KeyId": "202b9877-5a25-46e3-a763-e20791b5 ****",
"KeyVersionId": "2ab1a983-7072-4bbc-a582-584b5bd8 ****",
"Открытый текст": "tRYXuCwgja12xxO1N / gZERDDCLw9doZEQiPDk / Bv ****",
"RequestId": "207596a2-36d3-4840-b1bd-f87044699bd7"
}
Коды ошибок
Для получения списка кодов ошибок посетите Центр ошибок API.
Расшифровка набора данных| Глубокое погружение платформы FusionCreator
Шифрование с нулевым доверием
Некоторые наборы данных, доступные на FusionFabric.cloud, содержат зашифрованные данные. Вы должны расшифровать данные, прежде чем сможете использовать их в своем бизнес-сценарии.
Данные зашифрованы с помощью комбинации асимметричных и симметричных алгоритмов, благодаря чему процесс работает как сквозная стратегия нулевого доверия. С одной стороны — финансовое учреждение, предоставляющее зашифрованные данные.На другом конце вы — финтех, потребляющий данные.
FusionFabric.cloud действует как посредник для обмена контекстом дешифрования. Он не имеет доступа к зашифрованным данным и не может их расшифровать. Следовательно, именно вы можете расшифровать данные, на которые вы подписались.
Данные зашифрованы на уровне поля. Каждое поле зашифровано AES256-GCM с симметричным ключом — ключом шифрования данных ( DEK
). Результирующая строка представляет собой конкатенацию вектора инициализации в кодировке Base64 ( IV
) и зашифрованного текста в кодировке Base64 — зашифрованных данных.
Процесс расшифровки набора данных
Процесс дешифрования изображен на следующей диаграмме.
Расшифровка набора данных
Процесс дешифрования начинается с регистрации вашего открытого ключа в FusionFabric.cloud. Вы делаете это, отправляя веб-ключ JSON в приложение, которое вы зарегистрировали с зашифрованным набором данных. Процесс отправки, включая создание веб-ключа JSON, описан в разделе «Веб-ключ JSON».
Затем вы получите зашифрованный набор данных, выполнив действия, описанные в разделе «Подписка на набор данных».
Через API поддержки потребления набора данных вы запрашиваете контекст дешифрования на основе вашего клиента, идентификатора набора данных и имени файла. Вы получаете ключ шифрования ( KEK
) для каждого зашифрованного поля вашего набора данных вместе с идентификационным ключом с именем $ tenant $ _secret_version
в зависимости от клиента, к которому применяется набор данных.
API поддержки потребления набора данных автоматически добавляется в ваше приложение, которое содержит зашифрованный набор данных.
Ключ $ tenant $ _secret_version
используется для идентификации секрета с именем E_dataset_ $ tenant $ _secret
, который был зашифрован финансовым учреждением с помощью открытого ключа, который вы отправили через свое приложение.
Каждый
KEK
вычисляется FusionFabric.cloud, а пара$ tenant $ _secret_version
–E_dataset_ $ tenant $ _secret
предоставляется экземпляром базовой системы, который предоставляет ваш набор данных.
Вы расшифровываете ключ E_dataset_ $ tenant $ _secret
с помощью закрытого ключа, связанного с открытым ключом, который вы отправили через приложение. Этот расшифрованный ключ с именем dataset_ $ tenant $ _secret
был создан финансовым учреждением для того, чтобы позволить вам вычислить симметричный ключ, который вы будете использовать для расшифровки набора данных.
По соображениям производительности рекомендуется кэшировать пару
$ tenant $ _secret_version
—dataset_ $ tenant $ _secret
в свое приложение.
С ключом dataset_ $ tenant $ _secret
вы вычисляете ключ шифрования данных ( DEK
), применяя хэш-преобразование HMAC_SHA256 к каждому полю набора данных KEK
.
В конце вы анализируете каждую строку и значение поля, чтобы извлечь зашифрованный текст, который вы расшифровали с помощью ранее вычисленного DEK
.
— mattchenderson / microsoft-identity-web Wiki
Почему разработчик веб-API хочет, чтобы его веб-API получал зашифрованные токены?
Когда клиентское приложение запрашивает токен доступа от имени пользователя для вызова веб-API, у разработчика клиентского приложения может возникнуть соблазн взломать токен (даже если мы отговорим их сделать это),
и, следовательно, получить доступ к утверждениям о пользователе, о которых мы (или разработчик веб-API) не хотели бы, чтобы клиентское приложение знало. Это вопрос конфиденциальности, например, мы не хотим, чтобы утечки таких заявлений, как ageGroup
, или puid
(MSA), или даже идентификатор оборудования ( HWID
), не происходили.
Следовательно, веб-API могут запрашивать зашифрованные токены. Стандарт зашифрованного веб-токена (JWE) обеспечивает решение этой проблемы.
Сертификаты шифрования токена
При регистрации веб-API вы можете добавить сертификат дешифрования (общий доступ к общему ключу с Azure AD), и ваше приложение будет иметь соответствующий закрытый ключ.Еще находясь в процессе регистрации приложения, вы можете указать в Azure AD зашифровать токены с помощью предоставленного вами сертификата дешифрования.
Когда клиент получает токен доступа, он будет зашифрован (то есть клиент не может его открыть).
Когда веб-API получает зашифрованный токен доступа от клиента, он использует сертификат дешифрования для дешифрования токена доступа и проверки утверждений.
Как это сделать
Сгенерировать сертификат
Используйте Azure Key Vault
См. Документацию Key Vault по созданию сертификатов в Key Vault.
Используйте PowerShell
Вот пример использования PowerShell в Windows для создания сертификата и консоли управления «Управление сертификатом пользователя» для экспорта открытого и закрытого ключей.
- Создайте свой сертификат в хранилище сертификатов
New-SelfSignedCertificate -Subject "CN = TestJWE" -CertStoreLocation "Cert: \ CurrentUser \ My" `
-KeyExportPolicy Exportable -KeySpec Signature
Экспорт открытого ключа (для последующего использования в Azure AD) .Вы можете использовать консоль управления «Управление сертификатами пользователей» в Windows и перейти к Personal \ Certificates. Найдите сертификат «TestJWE» и в разделе «Все задачи» выберите Экспорт .
Выберите Нет, не экспортировать закрытый ключ , оставьте значения по умолчанию (двоичный код в формате DER) и укажите имя файла (например, TestJWE.cer). Этот файл будет использован для регистрации приложения. Токены будут зашифрованы Azure AD с помощью этого открытого ключа.
Экспорт закрытого ключа .По-прежнему в консоли «Управление сертификатами пользователей» снова выберите Экспорт . На этот раз выберите Да, экспортируйте закрытый ключ , оставьте значения по умолчанию (двоичный код в формате DER), укажите пароль и укажите имя файла (например, TestJWE.pfx). Этот файл будет использоваться для развертывания закрытого ключа в веб-API. Только ваш веб-API (который является конфиденциальным клиентским приложением) будет знать закрытый ключ, и поэтому только ваш веб-API сможет декодировать закодированный токен JWE.
На портале Azure AD
При регистрации веб-API в разделе Certificates & Secrets щелкните Загрузить сертификат и загрузите сертификат, созданный на шаге 1 выше (например, TestJWE. cer).
Этот сертификат имеет связанный с ним идентификатор,
Теперь на боковой панели навигации перейдите к манифесту веб-API . В разделе keyCredentials вам нужно будет сделать следующее:
- Создайте новый keyId , вы можете использовать Visual Studio -> инструменты -> создать для этого новый GUID. Скопируйте значение и сохраните его в Блокноте.
- Замените значение keyId на новый GUID, который вы только что создали
- Заменить
«использование»: «Проверить»
на«использование»: «Зашифровать»
.См. Использование сертификата для получения дополнительной информации. - Сохранить манифест
Например:
"keyCredentials": [ { "customKeyIdentifier": "0C8862BF6F .... 32A8B3BFB", "endDate": "2021-12-14T03: 56: 09Z", "keyId": "GUID", "startDate": "2020-12-14T03: 36: 09Z", "type": "AsymmetricX509Cert", "usage": "Зашифровать", "значение": "MIIC / jCCAeagAwI . ...", "displayName": "CN = TestJWE" } ],
Вернуться в ваш веб-API
Следуйте приведенным здесь инструкциям, чтобы подключить сертификат для расшифровки токена к своему веб-API.Здесь мы предполагаем, что вы, кроме того, загрузили свой сертификат дешифрования в KeyVault.
{ "AzureAd": { «Экземпляр»: «https://login.microsoftonline.com/», «Домен»: «msidentitysamplestesting.onmicrosoft.com», "TenantId": "7f58f645-c190-4ce5-9de4-e2b7acd2a6ab", "ClientId": "86699d80-dd21-476a-bcd1-7c1a3d471f75", "TokenDecryptionCertificates": [ { "SourceType": "KeyVault", «KeyVaultUrl»: «https://msidentitywebsamples.vault.azure.net», «KeyVaultCertificateName»: «MicrosoftIdentitySamplesCert» } ] } }
Теперь, когда вы вызываете веб-API, токен доступа будет зашифрован.
Помощь с ротацией сертификатов
Можно указать, следует ли отправлять заявку x5c (открытый ключ сертификата) в Azure AD каждый раз, когда веб-приложение или веб-API вызывает Azure AD. Отправка x5c позволяет разработчикам приложений легко заменять сертификаты в Azure AD. Подробнее см. Помощь в ротации сертификатов путем отправки x5c
.Дополнительные сведения о сертификатах расшифровки токенов с помощью Microsoft Identity Web.
Использование сертификата
Использование:
- verify : закрытый ключ хранится в конфиденциальных клиентских приложениях для подтверждения идентичности приложения.Azure AD проверяет это удостоверение с помощью открытого ключа. verify — это значение по умолчанию сегодня, когда вы загружаете сертификат на страницу Секреты и сертификаты для приложения.
- encrypt : открытый ключ используется Azure AD для шифрования токена (это сценарий, описанный в этом документе), а закрытый ключ используется приложением, которое является аудиторией этого токена, для расшифровки токена
- знак : для этого требуется, чтобы закрытый ключ был передан в Azure AD. Он используется для ключей подписи пользовательских токенов. Двумя основными способами использования являются приложения-галереи и настраиваемые политики сопоставления утверждений. Приложение, которое настроило пользовательский ключ подписи токена, фактически получит токены, подписанные этим ключом, а не глобальный ключ подписи токена ESTS. Приложения-галереи делают это, потому что обновление ключа каждые 6 недель является проблемой, в то время как настраиваемые политики сопоставления утверждений делают это, чтобы нарисовать границу безопасности вокруг пары клиент + приложение.
- дешифровать : также требуется, чтобы закрытый ключ был передан в Azure AD.
Дополнительная информация
См. Сообщение в блоге @damienbod для получения дополнительной информации.
Сквозной зашифрованный чат с Web Crypto API
При передаче или хранении пользовательских данных, особенно частных разговоров, важно рассмотреть возможность использования криптографических методов для обеспечения конфиденциальности.
Прочитав это руководство, вы узнаете, как осуществлять сквозное шифрование данных в веб-приложениях, используя только JavaScript и Web Crypto API, который является встроенным API браузера.
Обратите внимание, что это руководство является очень простым и строго обучающим, может содержать упрощения, и использование собственного протокола шифрования не рекомендуется. Используемые алгоритмы могут содержать определенные ошибки, если не используются должным образом с помощью специалистов по безопасности
Вы также можете найти полный проект в этом репозитории GitHub, если заблудились. И если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне в Twitter :).
Что такое сквозное шифрование?
Сквозное шифрование — это система связи, в которой единственные люди, которые могут читать сообщения, — это люди, которые общаются.Ни один перехватчик не может получить доступ к криптографическим ключам, необходимым для расшифровки разговора, даже компания, которая запускает службу обмена сообщениями.
Что такое API веб-шифрования?
API веб-криптографии определяет низкоуровневый интерфейс для взаимодействия с материалом криптографического ключа, который управляется или раскрывается пользовательскими агентами. Сам API не зависит от базовой реализации хранилища ключей, но предоставляет общий набор интерфейсов, которые позволяют многофункциональным веб-приложениям выполнять такие операции, как генерация и проверка подписи, хеширование и проверка, шифрование и дешифрование, не требуя доступа к необработанному материалу ключей. .
Основы
В следующих шагах мы объявим основные функции, участвующие в сквозном шифровании. Вы можете скопировать каждый из них в специальный файл .js
в папке lib
. Обратите внимание, что все они являются асинхронными функциями
из-за асинхронной природы Web Crypto API.
Примечание. Не все браузеры реализуют алгоритмы, которые мы будем использовать. А именно Internet Explorer и Microsoft Edge. См. Таблицу совместимости в веб-документации MDN: Subtle Crypto — Web APIs.
Создание пары ключей
Пары криптографических ключей необходимы для сквозного шифрования. Пара ключей состоит из открытого ключа и закрытого ключа . Каждый пользователь в вашем приложении должен иметь пару ключей для защиты своих данных, при этом общедоступный компонент доступен другим пользователям, а частный компонент доступен только владельцу пары ключей. Вы поймете, как они применяются в следующем разделе.
Для генерации пары ключей мы будем использовать окно .crypto.subtle.generateKey
и экспортируйте закрытый и открытый ключи, используя window.crypto.subtle.exportKey
в формате JWK. Последний нужен для сохранения или передачи этих ключей. Думайте об этом как о способе сериализации ключей для использования вне JavaScript.
Кроме того, я выбрал алгоритм ECDH с эллиптической кривой P-256, поскольку он хорошо поддерживается и обеспечивает правильный баланс между безопасностью и производительностью. Это предпочтение может измениться со временем по мере появления новых алгоритмов.
Ключ извлечения
Мы будем использовать пару ключей, сгенерированную на последнем этапе, для получения симметричного криптографического ключа, который шифрует и дешифрует данные и является уникальным для любых двух взаимодействующих пользователей. Например, пользователь A получает ключ, используя свой закрытый ключ с открытым ключом пользователя B, а пользователь B получает тот же ключ, используя свой закрытый ключ и открытый ключ пользователя A. Никто не может сгенерировать производный ключ без доступа хотя бы к одному из закрытых ключей пользователей, поэтому очень важно обеспечить их безопасность.
На предыдущем шаге мы экспортировали пару ключей в формате JWK. Прежде чем мы сможем получить ключ, нам нужно импортировать их обратно в исходное состояние, используя window.crypto.subtle.importKey
. Чтобы получить ключ, мы будем использовать window. crypto.subtle.deriveKey
.
В данном случае я выбрал алгоритм AES-GCM из-за его известного баланса безопасности / производительности и доступности браузера.
Шифрование текста
Теперь мы можем использовать производный ключ для шифрования текста , чтобы его можно было безопасно передавать.
Перед шифрованием мы кодируем текст в массив Uint8Array
, поскольку именно это и выполняет функция шифрования. Мы шифруем этот массив с помощью window.crypto.subtle.encrypt
, а затем возвращаем его вывод ArrayBuffer
обратно в Uint8Array
, который затем превращаем в строку
и кодируем в Base64. JavaScript немного усложняет его, но это всего лишь способ превратить наши зашифрованные данные в передаваемый текст.
Как видите, параметр алгоритма AES-GCM включает вектор инициализации (iv).Для каждой операции шифрования она должна быть случайной и разной, чтобы обеспечить надежность шифрования. Он включается в сообщение, поэтому его можно использовать в процессе дешифрования, который является следующим шагом.
Расшифровать текст
Теперь мы можем использовать производный ключ для дешифрования любого зашифрованного текста, который мы получаем, делая прямо противоположное шагу шифрования.
Перед расшифровкой мы извлекаем вектор инициализации, конвертируем строку обратно из Base64, превращаем ее в Uint8Array
и расшифровываем с использованием того же определения алгоритма.После этого мы декодируем ArrayBuffer
и возвращаем удобочитаемую строку.
Также возможно, что этот процесс дешифрования завершится неудачно из-за использования неправильного производного ключа или вектора инициализации, что означает, что у пользователя нет правильной пары ключей для дешифрования полученного текста. В таком случае мы возвращаем сообщение об ошибке.
Интеграция в ваше приложение для чата
И это все необходимые криптографические работы! В следующих разделах я объясню, как я использовал методы, которые мы реализовали выше, для сквозного шифрования приложения чата, созданного с помощью мощных компонентов чата React Stream Chat.
Клонировать проект
Клонируйте репозиторий encrypted-web-chat в локальную папку, установите зависимости и запустите его.
После этого должна открыться вкладка браузера. Но сначала нам нужно настроить проект с помощью нашего собственного ключа API Stream Chat.
Настроить панель управления потоковым чатом
Создайте учетную запись на GetStream.io, создайте приложение и выберите разработку вместо производства.
Для упрощения отключим проверки авторизации и разрешений.Обязательно нажмите «Сохранить». Когда ваше приложение находится в рабочей среде, вы должны оставить их включенными и иметь серверную часть для предоставления токенов пользователям.
Для дальнейшего использования см. Документацию по аутентификации и документацию по разрешениям.
Обратите внимание на учетные данные Stream, поскольку мы будем использовать их для инициализации клиента чата в приложении на следующем шаге. Поскольку мы отключили аутентификацию и разрешения, нам пока действительно нужен только ключ. Тем не менее, в будущем вы будете использовать секрет в своем бэкэнде для реализации аутентификации для выдачи пользовательских токенов для потокового чата, чтобы ваше приложение чата могло иметь надлежащий контроль доступа.
Как видите, я отредактировал свои ключи. Было бы лучше, если бы вы сохранили эти учетные данные в безопасности.
Изменить учетные данные
В src / lib / chatClient.js
измените ключ на свой. Мы будем использовать этот объект для выполнения вызовов API и настройки компонентов чата.
После этого вы сможете протестировать приложение. На следующих этапах вы поймете, где подходят определенные нами функции.
Установить пользователя
В src / lib / setUser.js
, мы определяем функцию, которая устанавливает пользователя чат-клиента и обновляет его открытым ключом данной пары ключей. Отправка открытого ключа необходима другим пользователям для получения ключа, необходимого для шифрования и дешифрования связи с нашим пользователем.
В этой функции мы импортируем chatClient
, определенный на предыдущем шаге. Требуется идентификатор пользователя и пара ключей , затем вызывается chatClient.setUser
для установки пользователя. После этого он проверяет, есть ли у этого пользователя открытый ключ и совпадает ли он с открытым ключом в данной паре ключей.Если открытый ключ совпадает или не существует, мы обновляем этого пользователя с помощью данного открытого ключа; если нет — отключаемся и выводим ошибку.
Компонент отправителя
В src / components / Sender.js
мы определяем первый экран, где выбираем наш идентификатор пользователя, и можем сгенерировать пару ключей, используя функцию, описанную в generateKey.js
, или, если это уже существующий user, вставьте пару ключей, сгенерированную во время создания пользователя.
Компонент получателя
В src / components / Recipient.js
, мы определяем второй экран, где выбираем id пользователя, с которым хотим общаться. Компонент получит этого пользователя с chatClient.queryUsers
. Результат этого вызова будет содержать открытый ключ пользователя, который мы будем использовать для получения ключа шифрования / дешифрования.
Компонент KeyDeriver
В src / components / KeyDeriver.js
мы определяем третий экран, где ключ получается с использованием метода, реализованного в deriveKey.js
с закрытым ключом отправителя (нас) и открытым ключом получателя. Этот компонент представляет собой просто пассивный экран загрузки, поскольку необходимая информация была собрана на двух предыдущих экранах. Но он покажет ошибку, если есть проблема с ключами.
Компонент EncryptedMessage
В src / components / EncryptedMessage.js
мы настраиваем компонент сообщения Stream Chat для дешифрования сообщения, используя метод, который мы определили в decrypt.js
вместе с зашифрованными данными и производным ключом.
Без этой настройки компонента «Сообщение» он выглядел бы так:
Настройка выполняется путем обертывания компонента MessageSimple
Stream Chat и использования хука useEffect
для изменения свойства сообщения с помощью метода дешифрования.
Компонент ввода EncryptedMessage
В src / components / EncryptedMessageInput.js
мы настраиваем компонент MessageInput Stream Chat для шифрования написанного сообщения перед его отправкой, используя метод, который мы определили в encrypt.js
рядом с исходным текстом.
Настройка выполняется путем обертывания компонента Stream Chat MessageInputLarge
и настройки свойства overrideSubmitHandler
на функцию, которая шифрует текст перед отправкой в канал.
Компонент чата
И, наконец, в src / components / Chat.js
мы создаем весь экран чата, используя компоненты Stream Chat и наши пользовательские компоненты Message и EncryptedMessageInput.
Компонент MessageList
имеет свойство Message
, настроенное на настраиваемый компонент EncryptedMessage
, а EncryptedMessageInput
можно просто разместить прямо под ним в иерархии.
Следующие шаги с Web Crypto API
Поздравляем! Вы только что узнали, как реализовать базовое сквозное шифрование в своих веб-приложениях. Важно знать, что это самая простая форма сквозного шифрования. В нем отсутствуют некоторые дополнительные настройки, которые могут сделать его более пуленепробиваемым для реального мира, например, рандомизированное заполнение, цифровая подпись и прямая секретность. Кроме того, для реального использования жизненно важно получить помощь профессионалов по безопасности приложений.
.