Как шифровать MSISDN?

Для обеспечения возможности формирования ENCR_MSISDN сервис предоставляет специфичный для учетной записи публичный ключ.

Чтобы получить публичный ключ в формате JWK, нужно отправить запрос:

POST https://idgw.mobileid.mts.ru/oidc/jwks
Authorization: Basic {base64encoded[client_id:client_secret]}

В ответ придёт JSON-объект, представляющий собой набор JWK-ключей, перечисленных в свойстве keys. В данном случае свойство keys будет содержать только один JWK для шифрования MSISDN, например:

{
  "keys": [
    {
      "kty": "RSA",
      "e": "AQAB",
      "kid": "rsa1",
      "alg": "RS256",
      "n": "4NSQheOOjAcWAfch93B9N1ELaDe4oJa7Ro8l4tRuTLUJs4Q0SDuT1nuAQCqvbJ",
      "use": "enc"
    }
  ]
}

Получив ключ, нужно выполнить операцию шифрования с использованием алгоритма RSA/ECB/PKCS1Padding.

Далее, полученное значение необходимо конвертировать в Base64UrlEncoded.

Пример на PHP

openssl_public_encrypt($loginHintValue, $encryptedMsisdn, $publicKey);
$params['login_hint'] = 'ENCR_MSISDN:' . base64_url_encode($encryptedMsisdn, $noPadding);

Пример ручного формирования ENCR_MSISDN

  1. Получить публичный ключ POST-запросом.
  2. Произвести конвертацию формата ключа JWK → PEM. Можно выполнить с помощью онлайн-сервиса 8gwifi.org.
  3. Зашифровать значение номера телефона с использованием RSA/ECB/PKCS1Padding. Можно выполнить с помощью онлайн-сервиса 8gwifi.org.
  4. Преобразовать полученный на выходе base64 в Base64Url (заменить неподдерживаемые символы в соответствии с rfc3548).