Показать/Скрыть содержание

    Аутентификация при использовании mDAG

    Все запросы и ответы API Gateway должны быть аутентифицированы.

    Исключение составляют запросы:

    • регистрация первого устройства
    • добавление другого устройства
    • проверка статуса добавления нового устройства
    • получение настроек сервиса

    Аутентификационные данные передаются в заголовке Authorization HTTP-запроса.

    Формат заголовка:

    Authorization: myDSS kid:Base64(HMAC):Base64(nonce),
    где

    • kid – идентификатор ключа пользователя,
    • Base64(HMAC) – значение HMAC в кодировке BASE64,
    • Base64(nonce) - случайное значение размером 32 байта (см. далее) в кодировке BASE64.

    Значение HMAC вычисляется от конкатенации следующих данных:

    kid | deviceFingerprint | HTTP-Body | nonce | timeDelta,

    где

    • kid – идентификатор ключа пользователя;
    • deviceFingerprint - отпечаток устройства (опциональный параметр);
    • HTTP-Body – тело HTTP запроса в UTF-8 кодировке;
    • nonce - случайное значение размером 32 байта;
    • timeDelta – число временных интервалов между начальным и текущим значением времени; вычисляется по следующей формуле: timeDelta = (T – T0) / myDssTimeStep, где (T – T0) – количество секунд между текущим временем и 1 января 1970 00:00:00 UTC (Unix-time), myDssTimeStep – интервал валидации кода подтверждения, полученный из политики myDSS API Gateway (в секундах).

    Под kid понимается идентификатор набора ключей, состоящего из двух ключей Kauth и Kconf. Какой ключ из набора должен быть использован для вычисления HMAC, указано в описании соответствующего метода API.

    Ошибки аутентификации

    В случае невозможности выполнить процедуру аутентификации пользователя myDSS API Gateway вернет HTTP-ответ со статусом 401, в поле причина (Reason-Phrase) указывается код ошибки.

    Код ошибки Описание
    user_not_found Не удалось найти пользователя по идентификатору набора ключей kid
    user_blocked Учетная запись пользователя заблокирована
    invalid_authentication_scheme Пользователю не назначен способ аутентификации через мобильное приложение
    key_expired_or_not_yet_valid Срок действия ключей аутентификации истек или еще не наступил
    device_blocked Аутентификация на данном наборе ключей запрещена оператором
    invalid_hmac Неправильное значение HMAC
    assertion_replay Повторение запроса с неуникальным nonce
    invalid_license Отсутствует действительная лицензия на способ аутентификации через мобильное приложение
    invalid_grant Не удалось проверить заголовок аутентификации (подробности в журнале сервера)

    Пример вычисления HMAC для аутентификации

    Значение HMAC представляет из себя Base64-значение криптографической операции HMAC от конкатенации значений kid | deviceFingerprint | HTTP-Body | timeDelta каждое из которых представлено в виде массива байт в кодировке UTF-8, то есть:

    hmac = Base64(
        HMACconf(
            Utf8GetBytes(kid)
            | Utf8GetBytes(deviceFingerprint)
            | Utf8GetBytes(HTTP-Body)
            | nonce
            | Utf8GetBytes(timeDelta)
        )
    )
    

    Исходные данные:

    kid - идентификатор ключа аутентификации MyDss, string

    64474817
    

    kconf или kauth (в зависимости от типа операции) - значение ключа Kauth или Kconf. Какой ключ из набора должен быть использован для вычисления HMAC, указано в описании соответствующего метода API. В виде массива из байт, byte[32] (hex)

    000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
    

    Ключевой блоб

    012000001E660000FD514A371E660000A1E6470645C342CB80C5E76969A9882E9382F09CC58052B4F46AC5F973BAAFBA8864CA45D3BAA68223D15FE6300B06092A850307010205010100000000C10179A7
    

    Для импорта ключевого блоба нужно использовать следующие параметры:

    • userId: 79f5c06f-8806-40b0-b4bb-13b82175216d
    • password: 11111111

    deviceFingerprint - идентификатор (отпечаток) устройства, string

    e28ef702-dee5-402f-a32e-981b3132740b
    

    HTTP-Body - тело HTTP-запроса к REST API, string

    { "Id": "708a4546-5045-468e-89e9-6265f7363739", "TimeStamp": 12345 }
    
    // Другие примеры тел HTTP-запросов:
    // { "phone" : "79998887766", "email" : "test@cryptropro.ru" }
    // { "cid": "8330", "friendlyName": "My main certificate" }
    // { "kid" : "63101476" }
    

    nonce - уникальное значение, byte[32] (hex)

    B75E04EE13C0F50C9AEE6D97A28D7212C6D95C0B8D25174AAA0A198597A63E22
    

    timeStamp - штамп Unix-времени, long

    12345
    

    MyDssTimeStep - интервал валидации кода подтверждения, полученный из политики MyDss API Gateway, int

    180
    

    Шаг 1: Определение номера текущего интервала проверки HMAC

    (timeStamp / MyDssTimeStep).ToString() - строковое представление целочисленного деления штампа Unix-времени на интервал валидации кода подтверждения, string

    Входные данные:

    // timeStamp = 
    12345
    // MyDssTimeStep =
    180
    

    Результат:

    // (timeStamp / MyDssTimeStep).ToString() =
    68
    

    Шаг 2: Получение байтового представления исходных данных в кодировке UTF-8

    Utf8GetBytes - функция получения массива байтов из строк в кодировке UTF8

    Входные данные: Строки

    // kid = 
    64474817
    // deviceFingerprint =
    e28ef702-dee5-402f-a32e-981b3132740b
    // HTTP-Body =
    { "Id": "708a4546-5045-468e-89e9-6265f7363739", "TimeStamp": 12345 }
    // (timeStamp / MyDssTimeStep).ToString() =
    68
    

    Выходные данные: Массивы байт (hex)

    // Utf8GetBytes(kid) = 
    3634343734383137
    // Utf8GetBytes(deviceFingerprint) =
    65323865663730322D646565352D343032662D613332652D393831623331333237343062
    // Utf8GetBytes(HTTP-Body) =
    7B20224964223A202237303861343534362D353034352D343638652D383965392D363236356637333633373339222C202254696D655374616D70223A203132333435207D
    // Utf8GetBytes((timeStamp / MyDssTimeStep).ToString()) =
    3638
    
    Примечание

    Если не установлено требование задавать отпечаток устройства (deviceFingerprint), и это значение отсутствует, то результатом функции Utf8GetBytes(deviceFingerprint) должен быть пустой массив байт byte[0], таким образом deviceFingerprint не участвует в вычислении значения HMAC.

    Шаг 3: HMACconf

    HMACconf - функция вычисления HMAC на ключе kconf или kauth (в зависимости от типа операции).

    Входные данные: Конкатенация массивов байт из предыдущего шага в том порядке, в котором они перечислены

    // Utf8GetBytes(kid)
    // | Utf8GetBytes(deviceFingerprint)
    // | Utf8GetBytes(HTTP-Body)
    // | nonce
    // | Utf8GetBytes((timeStamp / MyDssTimeStep).ToString()) =
    363434373438313765323865663730322D646565352D343032662D613332652D3938316233313332373430627B20224964223A202237303861343534362D353034352D343638652D383965392D363236356637333633373339222C202254696D655374616D70223A203132333435207DB75E04EE13C0F50C9AEE6D97A28D7212C6D95C0B8D25174AAA0A198597A63E223638
    

    Выходные данные: Значение hmac в виде массива байт (hex)

    CCF2562E3659F17B368B3F2AB963D5047418DADD783188EEED1E57D4DACD6025
    

    Шаг 4: Base64

    Base64 - функция преобразования массива байтов в строку в кодировке BASE64.

    Входные данные: Значение hmac в виде массива байт из предыдущего шага (hex)

    CCF2562E3659F17B368B3F2AB963D5047418DADD783188EEED1E57D4DACD6025
    

    Выходные данные: Значение hmac в виде строки в формате Base64

    zPJWLjZZ8Xs2iz8quWPVBHQY2t14MYju7R5X1NrNYCU=
    

    Подтверждение операций

    Для подтверждения операции необходимо на конечную точку /mydss/v1/operations/confirm отправить запрос, содержащий объект ApproveRequest, содержащий сведения о подтверждаемой операции (объект ApprovedOperation сериализованный в строку формата JSON), и значение hmac, подсчитанное на основе этих сведений, в формате Base64.

    Значение HMAC вычисляется от конкатенации следующих данных:

    kid | deviceFingerprint | approvedOperationJson,

    где

    • kid – идентификатор ключа пользователя;
    • deviceFingerprint - отпечаток устройства (опциональный параметр);
    • approvedOperationJson – сериализованный в строку формата JSON объект ApprovedOperation, содержащий сведения о подтверждаемой операции.

    Пример вычисления HMAC для подтверждения операции

    Для подтверждения операции значение HMAC вычисляется практически аналогичным аутентификации образом, за исключением отсутствия параметра timeStamp и замены параметра HTTP-Body на параметр approvedOperationJson.

    Значение HMAC представляет из себя Base64 значение криптографической операции HMAC (на ключе Kconf) от конкатенации значений kid | deviceFingerprint | approvedOperationJson каждое из которых представлено в виде массива байт в кодировке UTF-8, то есть:

    hmac = Base64(
        HMACconf(
            Utf8GetBytes(kid)
            | Utf8GetBytes(deviceFingerprint)
            | Utf8GetBytes(approvedOperationJson)
        )
    )
    

    Исходные данные:

    kid - идентификатор ключа аутентификации MyDss, string

    64474817
    

    kconf - значение ключа Kconf в виде массива из байт, byte[32] (hex)

    000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
    

    Ключевой блоб

    012000001E660000FD514A371E660000A1E6470645C342CB80C5E76969A9882E9382F09CC58052B4F46AC5F973BAAFBA8864CA45D3BAA68223D15FE6300B06092A850307010205010100000000C10179A7
    

    Для импорта ключевого блоба нужно использовать следующие параметры:

    • userId: 79f5c06f-8806-40b0-b4bb-13b82175216d
    • password: 11111111

    deviceFingerprint - идентификатор (отпечаток) устройства, string

    e28ef702-dee5-402f-a32e-981b3132740b
    

    approvedOperationJson - Объект ApprovedOperation, сериализованный в строку формата JSON, string

    { "id": "708a4546-5045-468e-89e9-6265f7363739", "timeStamp": 12345 }
    

    Шаг 1: Получение байтового представления исходных данных в кодировке UTF-8

    Utf8GetBytes - функция получения массива байтов из строк в кодировке UTF8

    Входные данные: Строки

    // kid = 
    64474817
    // deviceFingerprint =
    e28ef702-dee5-402f-a32e-981b3132740b
    // approvedOperationJson =
    { "Id": "708a4546-5045-468e-89e9-6265f7363739", "TimeStamp": 12345 }
    

    Выходные данные: Массивы байт (hex)

    // Utf8GetBytes(kid) = 
    3634343734383137
    // Utf8GetBytes(deviceFingerprint) =
    65323865663730322D646565352D343032662D613332652D393831623331333237343062
    // Utf8GetBytes(approvedOperationJson) =
    7B20224964223A202237303861343534362D353034352D343638652D383965392D363236356637333633373339222C202254696D655374616D70223A203132333435207D
    
    Примечание

    Если не установлено требование задавать отпечаток устройства (deviceFingerprint), и это значение отсутствует, то результатом функции Utf8GetBytes(deviceFingerprint) должен быть пустой массив байт byte[0], таким образом deviceFingerprint не участвует в вычислении HMAC.

    Шаг 2: HMACconf

    HMACconf - функция вычисления HMAC на ключе kconf

    Входные данные: Конкатенация массивов байт из предыдущего шага в том порядке, в котором они перечислены

    // Utf8GetBytes(kid) | Utf8GetBytes(deviceFingerprint) | Utf8GetBytes(approvedOperationJson) =
    363434373438313765323865663730322D646565352D343032662D613332652D3938316233313332373430627B20224964223A202237303861343534362D353034352D343638652D383965392D363236356637333633373339222C202254696D655374616D70223A203132333435207D
    

    Выходные данные: Значение hmac в виде массива байт (hex)

    101802BE0B0BB86A6AEE4456043F9F3FC188F83AD941188CCCFAE87B2C77D535
    

    Шаг 3: Base64

    Base64 - функция преобразования массива байтов в строку в кодировке BASE64.

    Входные данные: Значение hmac в виде массива байт из предыдущего шага (hex)

    101802BE0B0BB86A6AEE4456043F9F3FC188F83AD941188CCCFAE87B2C77D535
    

    Выходные данные: Значение hmac в виде строки в формате Base64

    EBgCvgsLuGpq7kRWBD+fP8GI+DrZQRiMzProeyx31TU=
    
    В начало © ООО "КРИПТО-ПРО", 2000–2025