0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Play Integrity API中nonce功能详解

谷歌开发者 来源:Android 开发者 作者:Android 开发者 2022-07-07 14:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者 / Oscar Rodriguez, Developer Relations Engineer

我们近期发布了 Play Integrity API,希望帮助开发者们保护自己的应用和游戏,使其免受可能存在风险的欺诈性互动 (例如欺骗和未经授权的访问) 的危害,让您能够采取适当措施来防范攻击并减少滥用行为。 除了与应用完整性、设备完整性和许可信息相关的有用信号外,Play Integrity API 还提供了一个简单却非常实用的功能,即 "nonce"。如果使用得当,开发者可以进一步加强 Play Integrity API 的现有保护措施,并降低特定类型攻击的风险,例如中间人 (PITM) 篡改攻击和重放攻击。 在这篇文章中,我们将深入介绍什么是 nonce、它的工作原理,以及如何使用 nonce 字段来进一步保护您的应用和游戏。

什么是 nonce?

在密码学和安全工程学中,nonce (number once) 是一个在安全通信中仅能被使用一次的数字。nonce 用途广泛,如身份验证、数据加密和哈希处理等。

在 Play Integrity API 中,nonce 是您在调用 API 完整性检查前设置的不透明 Base64 编码二进制 blob,并通过被签名的响应中原样返回。根据创建和验证 nonce 的方式,您可以使用它来进一步加强 Play Integrity API 的现有保护措施,并缓解特定类型的攻击,例如中间人 (PITM) 篡改攻击和重放攻击。

除了在被签名的响应中按原样返回 nonce,Play Integrity API 不会对 nonce 实际数据进行任何处理,因此您可以设置任意值,只要它是一个有效的 Base64 值即可。也就是说,为了对响应进行数字签名,nonce 值将被发送到 Google 服务器,因此请勿将 nonce 设置为任何类型的个人身份信息 (PII),例如用户姓名、电话或电子邮件地址。

设置 nonce

将您的应用设置为使用 Play Integrity API 之后,您可以使用 setNonce() 方法,或其适当的变体设置 nonce,这些变体适用于 API 的 Kotlin、Java、Unity 和 Native 版本。

Kotlin:
val nonce: String = ...
// 创建 manager 的实例val integrityManager =    IntegrityManagerFactory.create(applicationContext)
// 通过 nonce 获取完整性令牌val integrityTokenResponse: Task =    integrityManager.requestIntegrityToken(        IntegrityTokenRequest.builder()             .setNonce(nonce) // 设置 nonce.build())

Java:

String nonce = ...
// 创建 manager 的实例IntegrityManager integrityManager =    IntegrityManagerFactory.create(getApplicationContext());
// 通过 nonce 获取完整性令牌Task integrityTokenResponse =    integrityManager        .requestIntegrityToken(            IntegrityTokenRequest.builder()            .setNonce(nonce) // 设置 nonce.build());

Unity:

string nonce = ...
// 创建 manager 的实例var integrityManager = new IntegrityManager();
// 通过 nonce 获取完整性令牌var tokenRequest = new IntegrityTokenRequest(nonce);var requestIntegrityTokenOperation =integrityManager.RequestIntegrityToken(tokenRequest);

Native:

//创建IntegrityTokenRequest对象const char* nonce = ...IntegrityTokenRequest* request;IntegrityTokenRequest_create(&request);IntegrityTokenRequest_setNonce(request, nonce); // 设置 nonceIntegrityTokenResponse* response;IntegrityErrorCode error_code =IntegrityManager_requestIntegrityToken(request,&response);

验证 nonce

Play Integrity API 的响应以 JSON 网络令牌 (JWT) 的形式返回,其负载为纯文本 JSON,格式如下:

{  requestDetails: { ... }  appIntegrity: { ... }  deviceIntegrity: { ... }  accountDetails: { ... }}

您可以在 requestDetails 结构中查看 nonce,其格式如下:

requestDetails: {  requestPackageName: "...",  nonce: "...",  timestampMillis: ...}

nonce 字段的值应与您之前调用 API 传过去的值完全匹配。此外,由于 nonce 值位于 Play Integrity API 的加密签名响应中,收到响应之后是无法改变它的。通过这些属性,您就可以使用 nonce 进一步保护您的应用。

保护重要操作

试想这个场景,一名攻击者正在试图恶意将玩家得分虚报给游戏服务端。这种情况下,设备和应用都是完整的,但攻击者仍可以通过代理服务器或者虚拟专用网络查看并修改与游戏服务器之间的通信数据流,从而达到虚报分数的目的。 在这种情况下,仅调用 Play Integrity API 不足以保护应用: 设备没有被破解、应用也是合法的,因此该操作可以通过 Play Integrity API 的所有检查。 但您可以使用 Play Integrity API 的 nonce 来保护这种报告游戏分数的特定高价值操作,即在 nonce 中编码操作的值。实现方法如下:

用户发起重要操作;

应用准备好要保护的消息,例如 JSON 格式的消息;

应用计算要保护的消息的加密哈希值。例如,使用 SHA-256 或 SHA-3-256 哈希算法;

应用调用 Play Integrity API,并调用 setNonce() 以将 nonce 字段设置为在上一步计算的加密哈希值;

应用将要保护的消息以及 Play Integrity API 的签名结果发送给服务器;

应用服务器验证其收到的消息的加密哈希值是否与签名结果中的 nonce 字段值匹配,并拒绝任何不匹配的结果。

下面的序列图说明了相关步骤:

96dda4e6-fd0f-11ec-ba43-dac502259ad0.png
只要受保护的原始消息与签名结果一起发送,且服务器和客户端都使用完全相同的机制来计算 nonce,通过这样的方式来保证消息不会被篡改。 请注意,在上述场景下,安全模型的有效性仅限攻击行为发生在网络中 (而不是发生在设备或应用),因此验证 Play Integrity API 提供的设备和应用完整性信号也尤为重要。

防范重放攻击

我们再试想另外一种场景,一个应用或游戏使用了 Play Integrity API 来保护自己的 C/S 架构,但攻击者试图通过用已破解的设备与服务端交互,并且不让服务器端监测到。 若要 "达成" 这种攻击目标,攻击者会首先在合法的设备上让应用与 Play Integrity API 进行交互,并获得已经签名的响应内容,然后再在破解设备上运行应用并拦截 Play Integrity API 的调用,使用此前记录的、已获得签名的响应内容进行响应,这样一来就不会执行完整性检查了。 由于已签名的响应并未以任何方式被更改,所以数字签名看似正常,应用服务器就会误以为它正在与合法设备进行通信。我们将此称为重放攻击。 抵御此类攻击的第一道防线是验证签名响应中的 timestampMillis 字段。这个字段包含创建响应时的时间戳,即使在数字签名通过验证的情况下,也能用于服务器端检测是否为可疑的旧响应。

也就是说,应用服务器也可以利用 Play Integrity API 中的 nonce,为每个响应分配一个唯一值,并验证该响应是否与之前设置的唯一值匹配。实现方法如下:

服务器以攻击者无法预测的方式创建全局唯一值。例如,128 位或位数更多的加密安全随机数;

应用调用 Play Integrity API,并将 nonce 字段设置为应用服务器接收的唯一值;

应用将 Play Integrity API 的签名结果发送到服务器;

服务器验证签名结果中的 nonce 字段是否与之前生成的唯一值匹配,并拒绝所有不匹配的结果。

下面的序列图说明了相关步骤:

96fdd374-fd0f-11ec-ba43-dac502259ad0.png

实现上述流程后,每次服务器要求应用调用 Play Integrity API 时,它都会使用不同的全局唯一值,因此只要攻击者无法预测该值,nonce 与预期值不匹配,就无法重用之前的响应。

结合两种保护措施

虽然上述两种机制的工作方式不同,但如果应用同时需要两种保护,则可以将这两种机制组合在一个 Play Integrity API 调用中,例如,将两种保护措施的结果附加到一个更大的 Base64 nonce 中。结合两种保护措施的实现方法如下:

用户发起重要操作;

应用要求服务器提供一个标识请求的唯一值;

应用服务器生成全局唯一值,防止攻击者做出预测。例如,您可以使用加密安全的随机数生成器创建此类值。我们建议创建不小于 128 位的值;

应用服务器向应用发送全局唯一值;

应用准备好要保护的消息,例如 JSON 格式的消息;

应用计算要保护的消息的加密哈希值。例如,使用 SHA-256 或 SHA-3-256 哈希算法;

应用通过附加从应用服务器收到的唯一值以及要保护的消息的哈希值来创建一个字符串;

应用调用 Play Integrity API,并调用 setNonce() 以将 nonce 字段设置为在上一步中创建的字符串;

应用将要保护的消息以及 Play Integrity API 的签名结果发送给服务器;

应用服务器拆分 nonce 字段的值,然后验证消息的加密哈希值以及之前生成的唯一值是否与预期值相匹配,并拒绝任何不匹配的结果。

下面的序列图说明了相关步骤:

971c2360-fd0f-11ec-ba43-dac502259ad0.png

以上是您可以使用 nonce 进一步保护应用免受恶意用户攻击的一些示例。如果您的应用会处理敏感数据,或容易被滥用,我们建议您考虑借助 Play Integrity API,采取相关措施缓解威胁。 如需了解关于使用 Play Integrity API 的更多信息并开始体验,请前往 Play Integrity API 页面。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10094

    浏览量

    90880
  • API
    API
    +关注

    关注

    2

    文章

    2147

    浏览量

    66231
  • Integrity
    +关注

    关注

    0

    文章

    5

    浏览量

    7901

原文标题:通过 Play Integrity API 的 nonce 字段提高应用安全性

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    淘宝平台 API功能及应用场景

    到营销推广、物流跟踪等电商运营的核心环节。下面我们将深入探讨淘宝平台 API 的主要功能模块及其典型的应用场景。 一、 核心功能模块 商品 API
    的头像 发表于 11-24 15:23 194次阅读
    淘宝平台 <b class='flag-5'>API</b> 的<b class='flag-5'>功能</b>及应用场景

    爱回收平台价格查询API接口详解

    ,包括接口描述、参数说明、请求示例、响应格式和错误处理。通过本文,您可以快速上手并集成该API到您的应用。 1. API接口概述 该API是一个RESTful接口,用于查询指定品牌和
    的头像 发表于 11-19 14:57 209次阅读
    爱回收平台价格查询<b class='flag-5'>API</b>接口<b class='flag-5'>详解</b>

    京东平台获取商品SKU信息的API接口详解与使用指南

    Unit)是库存量单位,代表商品的最小库存单位,通常包含价格、库存、规格属性等关键信息。本文将详细介绍京东平台获取商品SKU信息的API接口,包括接口功能、调用方式、参数说明、返回数据格式以及使用的注意事项。 一、 接口
    的头像 发表于 11-13 14:53 534次阅读
    京东平台获取商品SKU信息的<b class='flag-5'>API</b>接口<b class='flag-5'>详解</b>与使用指南

    1688平台获取店铺所有商品列表API接口技术详解

    ​ 在电商开发,集成1688平台的API是获取店铺商品数据的关键。1688是阿里巴巴旗下的B2B批发平台,其API接口允许开发者通过编程方式访问店铺的商品列表,用于数据分析、库存管理或第三方
    的头像 发表于 11-11 14:04 164次阅读
    1688平台获取店铺所有商品列表<b class='flag-5'>API</b>接口技术<b class='flag-5'>详解</b>

    教你如何使用API

    一、了解API API(Application Programming Interface)即应用程序编程接口,是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软
    的头像 发表于 11-09 17:48 1033次阅读

    深入了解API详解应用程序接口的作用和原理

    引言:在现代软件开发领域中, API(Application Programming Interface,应用程序接口)扮演着至关重要的角色。无论是在Web开发、移动应用还是大型软件系统API
    的头像 发表于 11-03 09:37 157次阅读

    教你如何使用API接口获取数据!

    一、了解API API(Application Programming Interface)即应用程序编程接口,是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软
    的头像 发表于 11-03 09:14 332次阅读

    深度解析淘宝API接口:功能、限制与最佳实践

    在当今日益繁荣的电商领域,淘宝作为中国最大的电子商务平台之一,其API接口为开发者提供了丰富的功能和数据资源。本文将深入解析淘宝API接口的功能、限制,并分享一些最佳实践,帮助开发者更
    的头像 发表于 10-20 13:48 270次阅读

    产品列表获取API接口详解

    以及最佳实践。内容基于通用API设计原则,确保真实可靠。 1. 什么是产品列表获取API接口? 产品列表获取API接口是一种基于HTTP协议的接口,用于从数据库或服务查询并返回产品数
    的头像 发表于 07-24 14:29 467次阅读
    产品列表获取<b class='flag-5'>API</b>接口<b class='flag-5'>详解</b>

    API如何加速电商新功能上线

    显著加速新功能上线。本文将逐步解析API如何实现这一目标,并提供实用示例。 1. API的基本概念与作用 API(Application Programming Interface)是
    的头像 发表于 07-18 10:21 324次阅读
    <b class='flag-5'>API</b>如何加速电商新<b class='flag-5'>功能</b>上线

    如何获取 OpenAI API Key?API 获取与代码调用示例 (详解教程)

    OpenAI API Key 获取与使用详解:从入门到精通 OpenAI 正以其 GPT 和 DALL-E 等先进模型引领全球人工智能创新。其 API 为开发者和企业提供了强大的 AI 能力集成途径
    的头像 发表于 05-04 11:42 1.2w次阅读
    如何获取 OpenAI <b class='flag-5'>API</b> Key?<b class='flag-5'>API</b> 获取与代码调用示例 (<b class='flag-5'>详解</b>教程)

    RAGFlow配置MaaS API使用指导

    RAGFlow配置MaaS API使用指导
    的头像 发表于 04-19 13:40 3083次阅读
    RAGFlow<b class='flag-5'>中</b>配置MaaS <b class='flag-5'>API</b>使用指导

    openai api key获取的三种方案(有一种可以白嫖到 api key)

    OpenAI API Key 全攻略:官方获取、费用详解与“白嫖”实战 引言: 想要体验 OpenAI 强大的 GPT 模型,却苦于没有 API Key?别担心,本文将为你提供一份详尽
    的头像 发表于 02-24 22:16 1.4w次阅读
    openai <b class='flag-5'>api</b> key获取的三种方案(有一种可以白嫖到 <b class='flag-5'>api</b> key)

    Google Play如何帮助您的应用变现

    Play Partner Day 活动的应用专题演讲,我们分享了市场、用户、变现等方面的干货,包括 Google Play 的变现工具和不同类型应用的用户特点,如何留住用户、吸引用户回流,以及如何拓展
    的头像 发表于 01-21 11:21 1090次阅读
    Google <b class='flag-5'>Play</b>如何帮助您的应用变现

    详解REST API通信协议

    在构建智能化网络的今天,设备需具备IIoT的关键功能:标准化、可扩展性、与IT及OT系统的兼容性,以及互操作性。这些特性对于实现设备间的无缝连接和数据交换至关重要。当然,通信的安全性也是我们不可忽视
    的头像 发表于 01-17 12:40 1609次阅读
    <b class='flag-5'>详解</b>REST <b class='flag-5'>API</b>通信协议