API цифровых учетных данных: безопасная и конфиденциальная идентификация в Интернете

Наталья Маркобородова
Natalia Markoborodova

Опубликовано: 3 октября 2025 г.

Мы рады сообщить, что API цифровых учётных данных теперь включён по умолчанию, начиная с Chrome 141. Кроме того, в iOS 26 добавлена ​​поддержка API цифровых учётных данных в Chrome и других браузерах. Этот API выводит проверку личности в интернете на новый уровень безопасности и конфиденциальности, предоставляя веб-сайтам стандартизированный способ запрашивать и получать проверяемую информацию от пользователей.

После успешного тестирования Origin API цифровых учетных данных теперь поддерживает как представление учетных данных на одном устройстве Android, так и представление на нескольких устройствах в настольном Chrome.

Фон

До сих пор онлайн-подтверждение личности было сложным процессом, часто требующим от пользователей загрузки сканов своих удостоверений личности. Эта практика зачастую подразумевает передачу большего объёма данных, чем необходимо, что создаёт серьёзные проблемы с конфиденциальностью для пользователей. Для разработчиков это также создаёт риски, поскольку им необходимо обеспечить, чтобы их решение могло обрабатывать и хранить зачастую неоднородные конфиденциальные данные безопасным способом, сохраняя при этом конфиденциальность.

В то же время такие нормативные акты, как eIDAS 2.0, обязывают правительства предоставлять населению средства цифровой идентификации. Эти цифровые кошельки должны хранить различные идентификационные данные, включая подтверждение личности и возраста. Поставщики онлайн-услуг могут запрашивать эти данные для подтверждения личности пользователя.

Осознавая потенциал цифровых учётных данных для удовлетворения как требований пользователей к конфиденциальности, так и потребностей разработчиков в проверке пользовательских данных, сообщество веб-стандартов W3C разработало решение: API цифровых учётных данных . API цифровых учётных данных призван решить эту проблему, представляя встроенный интерфейс для проверки информации пользователя, который повышает безопасность, конфиденциальность и удобство использования по сравнению с альтернативными вариантами. Благодаря этому API пользователям больше не нужно загружать конфиденциальные документы, такие как сканы удостоверений личности, на несколько веб-сайтов. Вместо этого веб-сайты могут выстраивать доверительные отношения со своими пользователями, запрашивая только необходимые им криптографически подписанные данные у доверенных эмитентов.

Основные характеристики

API цифровых учетных данных построен на трех основных принципах: конфиденциальность, кроссплатформенная поддержка и стандартизация.

Конфиденциальность

API цифровых учётных данных повышает конфиденциальность и безопасность в интернете. Он позволяет пользователям предъявлять цифровые идентификаторы из своих мобильных кошельков на веб-сайтах для проверки определённых фактов, не раскрывая при этом конфиденциальные данные. Например, API может подтвердить, что пользователю исполнилось 18 лет, не раскрывая его полную дату рождения. Принцип «избирательного раскрытия» гарантирует, что веб-сайты получают только минимально необходимую информацию.

API цифровых учетных данных также совместим с протоколами доказательств с нулевым разглашением (ZKP) , такими как Longfellow ZK от Google, которые обеспечивают конфиденциальность пользователя, возвращая криптографическое доказательство того, что определенное утверждение о личности является истинным, без раскрытия какой-либо другой информации.

Кроссплатформенная поддержка

API цифровых учетных данных призван поддерживать различные платформы, чтобы пользователи могли удобно представлять проверенную информацию на разных устройствах.

На Android: предоставляет встроенный пользовательский интерфейс, позволяющий пользователям выбирать учетные данные из установленного приложения-кошелька.

На компьютере: пользователи могут вводить учётные данные из своего мобильного кошелька на веб-сайт в браузере компьютера. Сканируя QR-код, система устанавливает безопасное, сквозное шифрование и защиту от фишинга между компьютером и мобильным устройством. Это соединение использует протокол CTAP для проверки близости пользователя через BLE, гарантируя его физическое присутствие и управление обоими устройствами.

Стандартизация

Взаимодействие играет ключевую роль. В Chrome API цифровых учётных данных не зависит от платформы и совместим с различными протоколами представления, например, OpenID4VP и Приложением C к стандарту ISO 18013-7 . Apple также внедрила поддержку API цифровых учётных данных в Safari 26.0.

Кроме того, API цифровых учётных данных опирается на встроенную поддержку управления учётными данными в Android и растущую экосистему совместимых кошельков. Google Wallet стал одним из первых пользователей, а поддержка Samsung Wallet и 1Password появится в ближайшее время.

Что нового после пробной версии Origin?

Те, кто участвовал в нашем предыдущем тестировании Origin , заметят, что API цифровых учётных данных был перемещён с navigator.identity.get() на navigator.credentials.get() , что соответствует более широкому подходу к унификации идентификационных данных с помощью API управления учётными данными . Кроме того, параметр providers был переименован в requests , а request — в data .

Выполнение

Интеграция API цифровых учётных данных включает два основных этапа: обнаружение функций и запрос учётных данных. Разработчикам также следует реализовать собственную логику для определения того, может ли их приложение использовать эти учётные данные.

Обнаружение особенностей

Прежде чем отображать кнопку «Подтвердить с помощью цифровых учетных данных», проверьте, доступен ли API цифровых учетных данных в браузере пользователя.

if (typeof DigitalCredential !== "undefined") {
  // Digital Credentials API is supported
} else {
  // Digital Credentials API is not supported
}

Запросить учетные данные

Запрос учётных данных включает вызов navigator.credentials.get() с digital параметром. В тип цифровых учётных данных добавьте массив requests , содержащий DigitalCredentialGetRequest со следующими базовыми параметрами:

  • protocol : укажите протокол обмена строкой. Например, "openid4vp" или "org-iso-mdoc" . Определите, поддерживается ли протокол браузером, следующим образом:

    if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
        // Create a request with this protocol
      } else {
        // Protocol is not supported
    }
    
  • data : объект с параметрами, принимаемыми приложениями цифровых кошельков для указанного протокола. Для "openid4vp" параметры определены в спецификации OpenID for Verifiable Presentation (OID4VP) для API цифровых учётных данных W3C.

    try {
      const digitalCredential = await navigator.credentials.get({
        digital: {
          requests: [{
            protocol: "openid4vp-v1-unsigned",
            data: {
              response_type: "vp_token",
          nonce: "[some-nonce]",
              client_metadata: {...},
          dcql_query: {...}
            }
        }]
        }
      });
    
      // Decrypt payload respons and verify credentials on the backend
      const response = await fetch("/verify", {
        method: "POST",
          body: JSON.stringify(digitalCredential.data),
          headers: {
              'Content-Type': 'application/json'
          }
      });
    } catch (e) {
      // Handle errors, such as the user canceling the request
      console.error(e);
    }
    

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

{
  protocol: 'openid4vp-v1-unsigned',
  data: {
    response_type: 'vp_token',
    nonce: '[some-nonce]',
    // Contains the Verifier metadata values, including supported credential formats and response encryption public key
    client_metadata: {
  // Supported credential formats. Refer to the documentation for specific values
        vp_formats_supported: {...},
   // Public key(s). Refer to the documentation for more detail.
        jwks: {...}
    },
    dcql_query: {
      // A wallet will try to find credentials it holds that match these definitions.
      credentials: [
        {
          // A locally unique identifier for this credential definition within the query.
          id: "cred_vc",
          format: "dc+sd-jwt",
          meta: {
            // 'vct_values' specifies the Verifiable Credential allowed type.
            // In this case, it's a European Digital Identity (EUDI) Personal Identification Data (PID) credential.
            vct_values: [
              "urn:eudi:pid:1"
            ]
          },
          // 'claims' is an array of specific data that's being requested.
          claims: [
            {
              // The path ["age_equal_or_over", "18"] corresponds to accessing `credential.age_equal_or_over['18']`.
              path: [
                "age_equal_or_over",
                "18"
              ]
            }
          ]
        }
      ]
    }
  }
}

В этом примере client_metadata должен быть указан список поддерживаемых форматов. Чтобы узнать, какие значения можно использовать, обратитесь к спецификации . Необязательное значение jwks , заданное в client_metadata должно содержать открытые ключи, используемые для шифрования ответа. Вы также можете ознакомиться с демонстрационным кодом для получения дополнительных примеров.

Вот пример зашифрованной полезной нагрузки ответа объекта DigitalCredential :

{
    // This is an example for a response using an OpenID4VP protocol.
    // The format of the 'data' object will differ for other protocols.
    "protocol": "openid4vp-v1-unsigned",
    "data": {
        // To decrypt this JWE payload, use the private key.
   // The decrypted payload will be a JSON object containing the
       // Verifiable Presentation in the 'vp_token' claim.
        "response": "[jwe-token]"
    }
}

В этом примере система запрашивает учетные данные с протоколом openid4vp-v1-unsigned , а ответ содержит response в свойстве data .

Точный способ анализа ответа зависит от протокола. Обычно необходимо:

  1. Расшифруйте полезную нагрузку ответа . Метод расшифровки зависит от используемого протокола. Узнайте, как расшифровать полезную нагрузку для openid4vp (с использованием JWE) и org-iso-mdoc (с использованием гибридного шифрования с открытым ключом).
  2. Проверьте подписи и эмитента . Подробнее см. документацию по онлайн-приёму цифровых учётных данных .

Чтобы увидеть примеры кода для различных протоколов, ознакомьтесь с кодом демонстрационной или размещенной в реальном времени версии .

Проверить доверие к эмитенту

Криптографическая подпись цифровых учётных данных подтверждает их подлинность. Однако разработчики должны убедиться, что эмитент подходит и надёжен для их конкретного сценария использования. Например, для предоставления скидки студенту университета сайт электронной коммерции потребует учётные данные, выданные аккредитованным университетом, и отклонит учётные данные, подписанные любыми другими организациями. Распространённый способ проверки доверия к эмитенту — это ведение списка одобренных эмитентов и отклонение всех эмитентов, которые не соответствуют требованиям.

Начать

Готовы начать строительство? Вот что вам нужно знать.

  • Доступность: Chrome 141 или более новая версия по умолчанию включает API цифровых учетных данных на разных платформах.
  • Необходимые условия: пользователю необходимо совместимое устройство, например, Android с сервисами Google Play версии 24.0 или выше или устройство iOS версии 26 или выше. На устройстве должно быть установлено приложение цифрового кошелька с поддержкой API цифровых учётных данных, например, Google Wallet или демо-кошелёк .
  • Попробуйте демо-версию: Лучший способ понять пользовательский опыт и протестировать вашу реализацию — опробовать живую демо-версию на сайте https://verifier.multipaz.org с Chrome 141 или более поздней версией.

Ресурсы

Для получения более подробной информации ознакомьтесь со следующими ресурсами:

Поделитесь своим мнением

Теперь, когда API цифровых учётных данных уже запущен, мы хотели бы узнать ваше мнение о его использовании. Сообщите о проблеме , чтобы поделиться своим мнением или сообщить об ошибках.