0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Play Integrity API中nonce功能詳解

谷歌開(kāi)發(fā)者 ? 來(lái)源:Android 開(kāi)發(fā)者 ? 作者:Android 開(kāi)發(fā)者 ? 2022-07-07 14:35 ? 次閱讀
作者 / Oscar Rodriguez, Developer Relations Engineer

我們近期發(fā)布了 Play Integrity API,希望幫助開(kāi)發(fā)者們保護(hù)自己的應(yīng)用和游戲,使其免受可能存在風(fēng)險(xiǎn)的欺詐性互動(dòng) (例如欺騙和未經(jīng)授權(quán)的訪問(wèn)) 的危害,讓您能夠采取適當(dāng)措施來(lái)防范攻擊并減少濫用行為。 除了與應(yīng)用完整性、設(shè)備完整性和許可信息相關(guān)的有用信號(hào)外,Play Integrity API 還提供了一個(gè)簡(jiǎn)單卻非常實(shí)用的功能,即 "nonce"。如果使用得當(dāng),開(kāi)發(fā)者可以進(jìn)一步加強(qiáng) Play Integrity API 的現(xiàn)有保護(hù)措施,并降低特定類型攻擊的風(fēng)險(xiǎn),例如中間人 (PITM) 篡改攻擊和重放攻擊。 在這篇文章中,我們將深入介紹什么是 nonce、它的工作原理,以及如何使用 nonce 字段來(lái)進(jìn)一步保護(hù)您的應(yīng)用和游戲。

什么是 nonce?

在密碼學(xué)和安全工程學(xué)中,nonce (number once) 是一個(gè)在安全通信中僅能被使用一次的數(shù)字。nonce 用途廣泛,如身份驗(yàn)證、數(shù)據(jù)加密和哈希處理等。

在 Play Integrity API 中,nonce 是您在調(diào)用 API 完整性檢查前設(shè)置的不透明 Base64 編碼二進(jìn)制 blob,并通過(guò)被簽名的響應(yīng)中原樣返回。根據(jù)創(chuàng)建和驗(yàn)證 nonce 的方式,您可以使用它來(lái)進(jìn)一步加強(qiáng) Play Integrity API 的現(xiàn)有保護(hù)措施,并緩解特定類型的攻擊,例如中間人 (PITM) 篡改攻擊和重放攻擊。

除了在被簽名的響應(yīng)中按原樣返回 nonce,Play Integrity API 不會(huì)對(duì) nonce 實(shí)際數(shù)據(jù)進(jìn)行任何處理,因此您可以設(shè)置任意值,只要它是一個(gè)有效的 Base64 值即可。也就是說(shuō),為了對(duì)響應(yīng)進(jìn)行數(shù)字簽名,nonce 值將被發(fā)送到 Google 服務(wù)器,因此請(qǐng)勿將 nonce 設(shè)置為任何類型的個(gè)人身份信息 (PII),例如用戶姓名、電話或電子郵件地址。

設(shè)置 nonce

將您的應(yīng)用設(shè)置為使用 Play Integrity API 之后,您可以使用 setNonce() 方法,或其適當(dāng)?shù)淖凅w設(shè)置 nonce,這些變體適用于 API 的 Kotlin、Java、Unity 和 Native 版本。

Kotlin:
val nonce: String = ...
// 創(chuàng)建 manager 的實(shí)例val integrityManager =    IntegrityManagerFactory.create(applicationContext)
// 通過(guò) nonce 獲取完整性令牌val integrityTokenResponse: Task =    integrityManager.requestIntegrityToken(        IntegrityTokenRequest.builder()             .setNonce(nonce) // 設(shè)置 nonce.build())

Java:

String nonce = ...
// 創(chuàng)建 manager 的實(shí)例IntegrityManager integrityManager =    IntegrityManagerFactory.create(getApplicationContext());
// 通過(guò) nonce 獲取完整性令牌Task integrityTokenResponse =    integrityManager        .requestIntegrityToken(            IntegrityTokenRequest.builder()            .setNonce(nonce) // 設(shè)置 nonce.build());

Unity:

string nonce = ...
// 創(chuàng)建 manager 的實(shí)例var integrityManager = new IntegrityManager();
// 通過(guò) nonce 獲取完整性令牌var tokenRequest = new IntegrityTokenRequest(nonce);var requestIntegrityTokenOperation =integrityManager.RequestIntegrityToken(tokenRequest);

Native:

//創(chuàng)建IntegrityTokenRequest對(duì)象const char* nonce = ...IntegrityTokenRequest* request;IntegrityTokenRequest_create(&request);IntegrityTokenRequest_setNonce(request, nonce); // 設(shè)置 nonceIntegrityTokenResponse* response;IntegrityErrorCode error_code =IntegrityManager_requestIntegrityToken(request,&response);

驗(yàn)證 nonce

Play Integrity API 的響應(yīng)以 JSON 網(wǎng)絡(luò)令牌 (JWT) 的形式返回,其負(fù)載為純文本 JSON,格式如下:

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

您可以在 requestDetails 結(jié)構(gòu)中查看 nonce,其格式如下:

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

nonce 字段的值應(yīng)與您之前調(diào)用 API 傳過(guò)去的值完全匹配。此外,由于 nonce 值位于 Play Integrity API 的加密簽名響應(yīng)中,收到響應(yīng)之后是無(wú)法改變它的。通過(guò)這些屬性,您就可以使用 nonce 進(jìn)一步保護(hù)您的應(yīng)用。

保護(hù)重要操作

試想這個(gè)場(chǎng)景,一名攻擊者正在試圖惡意將玩家得分虛報(bào)給游戲服務(wù)端。這種情況下,設(shè)備和應(yīng)用都是完整的,但攻擊者仍可以通過(guò)代理服務(wù)器或者虛擬專用網(wǎng)絡(luò)查看并修改與游戲服務(wù)器之間的通信數(shù)據(jù)流,從而達(dá)到虛報(bào)分?jǐn)?shù)的目的。 在這種情況下,僅調(diào)用 Play Integrity API 不足以保護(hù)應(yīng)用: 設(shè)備沒(méi)有被破解、應(yīng)用也是合法的,因此該操作可以通過(guò) Play Integrity API 的所有檢查。 但您可以使用 Play Integrity API 的 nonce 來(lái)保護(hù)這種報(bào)告游戲分?jǐn)?shù)的特定高價(jià)值操作,即在 nonce 中編碼操作的值。實(shí)現(xiàn)方法如下:

用戶發(fā)起重要操作;

應(yīng)用準(zhǔn)備好要保護(hù)的消息,例如 JSON 格式的消息;

應(yīng)用計(jì)算要保護(hù)的消息的加密哈希值。例如,使用 SHA-256 或 SHA-3-256 哈希算法;

應(yīng)用調(diào)用 Play Integrity API,并調(diào)用 setNonce() 以將 nonce 字段設(shè)置為在上一步計(jì)算的加密哈希值;

應(yīng)用將要保護(hù)的消息以及 Play Integrity API 的簽名結(jié)果發(fā)送給服務(wù)器;

應(yīng)用服務(wù)器驗(yàn)證其收到的消息的加密哈希值是否與簽名結(jié)果中的 nonce 字段值匹配,并拒絕任何不匹配的結(jié)果。

下面的序列圖說(shuō)明了相關(guān)步驟:

96dda4e6-fd0f-11ec-ba43-dac502259ad0.png
只要受保護(hù)的原始消息與簽名結(jié)果一起發(fā)送,且服務(wù)器和客戶端都使用完全相同的機(jī)制來(lái)計(jì)算 nonce,通過(guò)這樣的方式來(lái)保證消息不會(huì)被篡改。 請(qǐng)注意,在上述場(chǎng)景下,安全模型的有效性僅限攻擊行為發(fā)生在網(wǎng)絡(luò)中 (而不是發(fā)生在設(shè)備或應(yīng)用),因此驗(yàn)證 Play Integrity API 提供的設(shè)備和應(yīng)用完整性信號(hào)也尤為重要。

防范重放攻擊

我們?cè)僭囅肓硗庖环N場(chǎng)景,一個(gè)應(yīng)用或游戲使用了 Play Integrity API 來(lái)保護(hù)自己的 C/S 架構(gòu),但攻擊者試圖通過(guò)用已破解的設(shè)備與服務(wù)端交互,并且不讓服務(wù)器端監(jiān)測(cè)到。 若要 "達(dá)成" 這種攻擊目標(biāo),攻擊者會(huì)首先在合法的設(shè)備上讓應(yīng)用與 Play Integrity API 進(jìn)行交互,并獲得已經(jīng)簽名的響應(yīng)內(nèi)容,然后再在破解設(shè)備上運(yùn)行應(yīng)用并攔截 Play Integrity API 的調(diào)用,使用此前記錄的、已獲得簽名的響應(yīng)內(nèi)容進(jìn)行響應(yīng),這樣一來(lái)就不會(huì)執(zhí)行完整性檢查了。 由于已簽名的響應(yīng)并未以任何方式被更改,所以數(shù)字簽名看似正常,應(yīng)用服務(wù)器就會(huì)誤以為它正在與合法設(shè)備進(jìn)行通信。我們將此稱為重放攻擊。 抵御此類攻擊的第一道防線是驗(yàn)證簽名響應(yīng)中的 timestampMillis 字段。這個(gè)字段包含創(chuàng)建響應(yīng)時(shí)的時(shí)間戳,即使在數(shù)字簽名通過(guò)驗(yàn)證的情況下,也能用于服務(wù)器端檢測(cè)是否為可疑的舊響應(yīng)。

也就是說(shuō),應(yīng)用服務(wù)器也可以利用 Play Integrity API 中的 nonce,為每個(gè)響應(yīng)分配一個(gè)唯一值,并驗(yàn)證該響應(yīng)是否與之前設(shè)置的唯一值匹配。實(shí)現(xiàn)方法如下:

服務(wù)器以攻擊者無(wú)法預(yù)測(cè)的方式創(chuàng)建全局唯一值。例如,128 位或位數(shù)更多的加密安全隨機(jī)數(shù);

應(yīng)用調(diào)用 Play Integrity API,并將 nonce 字段設(shè)置為應(yīng)用服務(wù)器接收的唯一值;

應(yīng)用將 Play Integrity API 的簽名結(jié)果發(fā)送到服務(wù)器;

服務(wù)器驗(yàn)證簽名結(jié)果中的 nonce 字段是否與之前生成的唯一值匹配,并拒絕所有不匹配的結(jié)果。

下面的序列圖說(shuō)明了相關(guān)步驟:

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

實(shí)現(xiàn)上述流程后,每次服務(wù)器要求應(yīng)用調(diào)用 Play Integrity API 時(shí),它都會(huì)使用不同的全局唯一值,因此只要攻擊者無(wú)法預(yù)測(cè)該值,nonce 與預(yù)期值不匹配,就無(wú)法重用之前的響應(yīng)。

結(jié)合兩種保護(hù)措施

雖然上述兩種機(jī)制的工作方式不同,但如果應(yīng)用同時(shí)需要兩種保護(hù),則可以將這兩種機(jī)制組合在一個(gè) Play Integrity API 調(diào)用中,例如,將兩種保護(hù)措施的結(jié)果附加到一個(gè)更大的 Base64 nonce 中。結(jié)合兩種保護(hù)措施的實(shí)現(xiàn)方法如下:

用戶發(fā)起重要操作;

應(yīng)用要求服務(wù)器提供一個(gè)標(biāo)識(shí)請(qǐng)求的唯一值;

應(yīng)用服務(wù)器生成全局唯一值,防止攻擊者做出預(yù)測(cè)。例如,您可以使用加密安全的隨機(jī)數(shù)生成器創(chuàng)建此類值。我們建議創(chuàng)建不小于 128 位的值;

應(yīng)用服務(wù)器向應(yīng)用發(fā)送全局唯一值;

應(yīng)用準(zhǔn)備好要保護(hù)的消息,例如 JSON 格式的消息;

應(yīng)用計(jì)算要保護(hù)的消息的加密哈希值。例如,使用 SHA-256 或 SHA-3-256 哈希算法;

應(yīng)用通過(guò)附加從應(yīng)用服務(wù)器收到的唯一值以及要保護(hù)的消息的哈希值來(lái)創(chuàng)建一個(gè)字符串;

應(yīng)用調(diào)用 Play Integrity API,并調(diào)用 setNonce() 以將 nonce 字段設(shè)置為在上一步中創(chuàng)建的字符串;

應(yīng)用將要保護(hù)的消息以及 Play Integrity API 的簽名結(jié)果發(fā)送給服務(wù)器;

應(yīng)用服務(wù)器拆分 nonce 字段的值,然后驗(yàn)證消息的加密哈希值以及之前生成的唯一值是否與預(yù)期值相匹配,并拒絕任何不匹配的結(jié)果。

下面的序列圖說(shuō)明了相關(guān)步驟:

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

以上是您可以使用 nonce 進(jìn)一步保護(hù)應(yīng)用免受惡意用戶攻擊的一些示例。如果您的應(yīng)用會(huì)處理敏感數(shù)據(jù),或容易被濫用,我們建議您考慮借助 Play Integrity API,采取相關(guān)措施緩解威脅。 如需了解關(guān)于使用 Play Integrity API 的更多信息并開(kāi)始體驗(yàn),請(qǐng)前往 Play Integrity API 頁(yè)面。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8701

    瀏覽量

    84567
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1461

    瀏覽量

    61497
  • Integrity
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7689

原文標(biāo)題:通過(guò) Play Integrity API 的 nonce 字段提高應(yīng)用安全性

文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    esp-adf esp_audio_play()播放https異常的原因?怎么處理?

    Play the given uri * * The esp_audio_play have follow activity, setup inputstream, outputstream
    發(fā)表于 06-28 06:31

    tcpip_adapter_start_api 函數(shù)的功能是什么?

    , msg->mac, msg->ip_info); } 請(qǐng)問(wèn) 1. tcpip_adapter_start_api函數(shù)的功能是什么??或者說(shuō)tcpip_adapter_start調(diào)用
    發(fā)表于 06-26 07:08

    詳解工業(yè)網(wǎng)關(guān)在線探測(cè)功能及用途

    詳解工業(yè)網(wǎng)關(guān)在線探測(cè)功能及用途 工業(yè)網(wǎng)關(guān)作為工業(yè)物聯(lián)網(wǎng)(IIoT)架構(gòu)的關(guān)鍵組件,扮演著橋梁的角色,它連接了現(xiàn)場(chǎng)的各類傳感器、執(zhí)行器以及更高級(jí)別的云平臺(tái)或企業(yè)系統(tǒng)。在線探測(cè)功能是工業(yè)
    的頭像 發(fā)表于 06-20 13:55 ?233次閱讀
    <b class='flag-5'>詳解</b>工業(yè)網(wǎng)關(guān)在線探測(cè)<b class='flag-5'>功能</b>及用途

    RA MCU CANFD在FSP的配置詳解

    RA MCU CANFD在FSP的配置詳解
    的頭像 發(fā)表于 06-19 08:06 ?245次閱讀
    RA MCU CANFD在FSP<b class='flag-5'>中</b>的配置<b class='flag-5'>詳解</b>

    華為云發(fā)布 CodeArts API,為 API 護(hù)航

    ,華為云 CodeArts API 保證了 API 各階段數(shù)據(jù)高度一致,為開(kāi)發(fā)者提供友好易用的 API 全流程端到端解決方案。 API 是連接不同應(yīng)用程序的橋梁,讓軟件能互相溝通和協(xié)作
    的頭像 發(fā)表于 05-09 23:17 ?411次閱讀
    華為云發(fā)布 CodeArts <b class='flag-5'>API</b>,為 <b class='flag-5'>API</b> 護(hù)航

    OpenAI API Key獲取與充值教程:助開(kāi)發(fā)者解鎖GPT-4.0 API

    Key。以下是獲取 API Key 的步驟: 訪問(wèn) OpenAI 官網(wǎng):在瀏覽器打開(kāi) OpenAI 官方網(wǎng)站。 創(chuàng)建賬戶:點(diǎn)擊網(wǎng)站右上角的“Sign Up”注冊(cè)
    的頭像 發(fā)表于 04-28 16:35 ?7889次閱讀
    OpenAI <b class='flag-5'>API</b> Key獲取與充值教程:助開(kāi)發(fā)者解鎖GPT-4.0 <b class='flag-5'>API</b>

    API安全風(fēng)險(xiǎn)顯現(xiàn),F(xiàn)5助API實(shí)現(xiàn)可信訪問(wèn)

    API在現(xiàn)代軟件開(kāi)發(fā)占據(jù)著重要地位,是應(yīng)用和數(shù)據(jù)的網(wǎng)關(guān),實(shí)時(shí)API更是構(gòu)建數(shù)字業(yè)務(wù)的基礎(chǔ)。Salt Labs報(bào)告顯示,過(guò)去6個(gè)月中,API攻擊活動(dòng)數(shù)量快速增長(zhǎng)了400%,可見(jiàn)
    的頭像 發(fā)表于 04-17 16:09 ?320次閱讀
    <b class='flag-5'>API</b>安全風(fēng)險(xiǎn)顯現(xiàn),F(xiàn)5助<b class='flag-5'>API</b>實(shí)現(xiàn)可信訪問(wèn)

    手機(jī)信號(hào)屏蔽器:功能、原理及使用方法詳解

    深圳特信電子|手機(jī)信號(hào)屏蔽器:功能、原理及使用方法詳解
    的頭像 發(fā)表于 04-01 09:09 ?2475次閱讀

    谷歌Play商店推出并行下載功能,支持多應(yīng)用下載

    此非 Google Play 的首次嘗試。早于 2020 年,Google Play 已啟動(dòng)多項(xiàng)安卓應(yīng)用的并行下載測(cè)試,然而后因技術(shù)緣故而被暫停。如今,再度回歸該功能試驗(yàn)。隨著時(shí)間推移,有望逐步推廣至廣大用戶群體。
    的頭像 發(fā)表于 03-08 14:20 ?560次閱讀

    如何在鴻蒙系統(tǒng)上安裝Google Play

    隨著鴻蒙(HarmonyOS)系統(tǒng)的逐漸普及和用戶基數(shù)的增加,一些用戶希望能在鴻蒙系統(tǒng)上使用Google Play商店以獲取更多應(yīng)用。然而,由于鴻蒙系統(tǒng)與Google服務(wù)不兼容,官方并未提供官方支持
    的頭像 發(fā)表于 01-31 17:13 ?1.3w次閱讀

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 剛剛 GA,旨在改進(jìn)將集群服務(wù)暴露給外部的過(guò)程。這其中包括一套更標(biāo)準(zhǔn)、更強(qiáng)大的 API資源,用于管理已暴露的服務(wù)。在這篇文章,我將介紹 Gateway
    的頭像 發(fā)表于 01-12 11:32 ?707次閱讀
    Kubernetes Gateway <b class='flag-5'>API</b>攻略教程

    api網(wǎng)關(guān) kong 教程入門

    統(tǒng)一權(quán)限控制、接口請(qǐng)求訪問(wèn)日志統(tǒng)計(jì) 安全,是保護(hù)內(nèi)部服務(wù)而設(shè)計(jì)的一道屏障 開(kāi)源-最大好處 當(dāng)然也有一個(gè)很大的缺點(diǎn),api-gw很可能成為性能瓶頸,因?yàn)樗械恼?qǐng)求都經(jīng)過(guò)這里,可以通過(guò)橫向擴(kuò)展和限流解決這個(gè)問(wèn)題。 在眾多API GATEWAY框架
    的頭像 發(fā)表于 11-10 11:39 ?570次閱讀
    <b class='flag-5'>api</b>網(wǎng)關(guān) kong 教程入門

    開(kāi)關(guān)電源原理及各功能電路詳解

    電子發(fā)燒友網(wǎng)站提供《開(kāi)關(guān)電源原理及各功能電路詳解.pdf》資料免費(fèi)下載
    發(fā)表于 10-20 11:50 ?33次下載
    開(kāi)關(guān)電源原理及各<b class='flag-5'>功能</b>電路<b class='flag-5'>詳解</b>

    OpenVINO? C# API詳解與演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫(kù)的安裝過(guò)程相比,更加簡(jiǎn)單。如果使用 Visual Studio 開(kāi)發(fā) AI 項(xiàng)目,則可以通過(guò) NuGet 程序包管理功能直接安裝即可
    的頭像 發(fā)表于 10-13 16:39 ?611次閱讀
    OpenVINO?  C# <b class='flag-5'>API</b><b class='flag-5'>詳解</b>與演示

    gpio子系統(tǒng)API詳解

    gpio 子系統(tǒng) API gpio 子系統(tǒng)操作一個(gè) GPIO 需要如下幾步: 1、of_find_compatible_node2、of_get_named_gpio3、gpio_request4
    的頭像 發(fā)表于 09-27 17:17 ?637次閱讀
    gpio子系統(tǒng)<b class='flag-5'>API</b><b class='flag-5'>詳解</b>