深入探索Android签名机制:从v1到v3的演进之旅

news2024/11/17 23:25:09

引言

在Android开发的世界中,APK的签名机制是确保应用安全性的关键环节。随着技术的不断进步,Android签名机制也经历了从v1到v3的演进。本文将带你深入了解Android签名机制的演变过程,揭示每个版本背后的技术细节,并探讨它们对开发者和用户的影响。


一、签名机制


1、什么是Android签名?


在Android生态中,APK签名机制是确保应用安全性的重要环节。它不仅保障了应用来源的真实性,还防止了APK文件在传输过程中被篡改。Android系统要求每个应用程序都必须经过数字签名,这是一种使用密钥对(包含公钥和私钥)对应用程序进行加密和验证的方式。


2、签名机制的主要目的

  • 确保应用程序的完整性
    当用户从任何来源(如Google Play商店或第三方网站)下载应用程序时,Android系统会使用应用程序的证书对应的公钥来验证应用程序的签名。如果签名验证通过,则表明应用程序在传输过程中没有被篡改或损坏,确保了应用程序的完整性。


  • 建立应用程序的信任关系
    Android系统使用应用程序的签名来识别应用程序的开发者身份。如果同一个开发者发布了一个新版本的应用程序,Android系统会检查新版本的签名是否与之前版本的签名相同。只有签名相同,Android系统才会允许新版本应用程序访问之前版本应用程序的数据和资源,从而建立了应用程序之间的信任关系。


  • 保护应用程序的权限和数据
    Android系统使用签名来控制应用程序之间的权限和数据访问。例如,如果一个应用程序需要访问另一个应用程序的组件(如Activity、Service或BroadcastReceiver),则两个应用程序必须由同一个开发者签名,否则将无法访问。这种机制可以防止恶意应用程序访问其他应用程序的敏感数据或资源。


举个例子,假设你是Android应用程序开发者,你需要发布一个新的应用程序。

在开发过程中,你需要生成一个密钥对,使用私钥对应用程序进行签名。然后,你可以将公钥嵌入到应用程序的元数据中,并将签名后的应用程序发布到Google Play商店或其他渠道。

当用户下载并安装你的应用程序时,Android系统会使用嵌入在应用程序中的公钥来验证应用程序的签名。如果签名验证通过,则表明应用程序来自可信任的来源,没有被篡改过,系统会允许应用程序安装和运行。

如果你以后需要发布应用程序的新版本,你必须使用相同的私钥对新版本进行签名。这样,Android系统就会识别出新版本和旧版本来自同一个开发者,并允许新版本访问旧版本的数据和资源。


二、签名机制的核心概念


1、消息摘要


消息摘要(Message Digest)是一种通过单向散列算法对任意长度的数据进行计算并产生固定长度的小型摘要信息(又称哈希值或指纹)的技术。


(1)、消息摘要主要特点

  • 压缩性:无论输入的数据有多大,计算出来的消息摘要的长度都是固定的,通常为128位或更长。

  • 易计算:给定需要计算摘要的数据,非常容易计算出消息摘要。

  • 隐行性:相同的输入必定得到相同的输出,但反过来,由输出极其困难推导出输入值。

  • 抗碰撞:理论上不可能找到两个不同的输入计算出相同的消息摘要。

常见的消息摘要算法有:MD5、SHA-1、SHA-256等。以MD5为例,它会对任意长度的输入数据执行一系列复杂的操作,最终生成一个128位(16字节)的散列值。这个散列值就是该输入数据的唯一"指纹"。


(2)、消息摘要应用场景

  • 数据完整性验证

    通过对原始数据计算出摘要,传输时只需传输摘要。接收方重新计算摘要并与传输的摘要进行比对,可验证数据在传输过程中是否遭到篡改。如软件下载的MD5/SHA-1校验。


  • 数字签名

    发送方先对原始数据计算消息摘要,再使用自己的私钥对摘要加密,形成数字签名附加在原始数据后发送。接收方使用发送方的公钥解密签名,并重新计算原始数据的摘要与解密后的摘要进行比对,以验证数据的完整性和发送方身份。


  • 信息认证

    可使用消息摘要作为口令、证书等的内容,再与其他信息结合来认证用户或实体身份。


  • 数据去重

    在处理海量数据时,利用消息摘要可方便地对重复数据进行判断和去重处理。


  • 散列表

    消息摘要常被用来优化存储和查找,作为键值存储结构的关键字段。


2、数字签名


数字签名(Digital Signature)是一种利用加密技术在数字信息上附加一个标记,以实现信息发送者身份的可靠性、数据完整性和防止抵赖性的密码技术。


(1)、数字签名特点

  • 真实性认证
    数字签名使用了发送者的私钥进行签名,只有拥有对应私钥的发送者才能产生有效的数字签名。接收方可使用发送者的公钥对签名进行验证,以确认信息确实来自声称的发送者。


  • 不可抵赖性
    发送者在发送信息前先对信息签名,一旦签名的信息被发送,发送者就无法抵赖曾经发送过这个消息。


  • 完整性
    数字签名是在原始数据上做运算得到的,任何对原始数据的修改都会使签名失效。因此,数字签名能有效防止信息在传输过程中被篡改。


  • 不可伪造
    理论上,由于采用了单向散列函数和发送者私钥的双重保护,数字签名是不可能被伪造的。

(2)、数字签名的生成过程

  • 使用摘要算法(如MD5、SHA-1等)计算原始数据的消息摘要
  • 使用发送者的私钥对消息摘要进行加密,生成数字签名
  • 将原始数据和数字签名一并发送

在这里插入图片描述


(3)、验证数字签名过程

  • 使用同样的摘要算法计算收到原始数据的消息摘要
  • 使用发送者的公钥对数字签名进行解密,获得原始的消息摘要
  • 比较两个消息摘要是否相同,若相同则验证通过

在这里插入图片描述


常见的数字签名算法有RSA、DSA等,它们基于复杂的数论和离散对数问题,具有非常高的计算复杂度,从理论上保证了签名的安全性。

数字签名被广泛应用于电子商务、网上银行、软件分发、电子合同、电子政务等领域,是构建信任机制、保证信息安全的重要手段。


3、数字证书


数字证书(Digital Certificate)是一种用于加密和解密的电子文件,它遵循国际标准X.509,用于确认公钥实际属于某个人或组织。

数字证书最关键的作用是在网络通信中确认对方身份的合法性,建立加密连接的信任基础。

数字证书通过CA机构的数字签名,解决了公钥的安全可信问题,保证了公钥的持有者身份。


(1)、数字证书包含信息

  • 证书版本号:标识证书所使用的X.509标准版本。

  • 证书序列号:证书的唯一标识符号。

  • 签名算法:签发证书时所使用的签名算法,如SHA256withRSA。

  • 签发者:签发此证书的证书颁发机构(CA)的信息。

  • 有效期限:证书的有效期,包括生效日期和失效日期。

  • 主题信息:持有此证书实体的信息,如组织名称、域名等。

  • 公钥信息:证书持有者的公钥数据,用于加密或验证数字签名。

  • 扩展信息:可选的附加信息,如密钥使用范围、证书吊销列表分发点等。

  • 数字签名:由证书颁发机构使用其私钥对整个证书进行签名后的数字签名值。


(2)、数字证书的生成和使用过程

  • 证书申请者向权威的证书颁发机构(CA)提交公钥、个人信息和申请证书材料。
  • CA按照严格的身份审核流程,验证申请者的身份合法有效后。
  • CA使用自身的私钥,对申请者的证书信息进行数字签名,并将证书文件返回给申请者。
  • 申请者收到数字证书后,即可使用其中的公钥进行加密和解密操作。
  • 任何需要验证申请者身份的第三方,只需获取证书对应的CA的公钥,就能验证证书上的数字签名,确认公钥的所有权。

(3)、数字证书应用场景

  • HTTPS网站服务,确保网站身份合法有效
  • 移动应用程序,验证APP签名身份
  • 电子邮件签名,防止邮件伪造
  • 文件签名,确保文件的完整性和发送者身份
  • 无线网络接入,验证无线接入点的合法性
  • 虚拟专网VPN,实现客户端到服务器的加密通信

三、APK签名方案v1


1、APK签名方案v1原理

v1签名使用的是SHA-1算法对整个APK进行摘要计算,然后使用开发者私钥对该摘要进行数字签名。

签名后的数据将被储存在APK的META-INF/CERT.SF和META-INF/CERT.RSA文件中。

在这里插入图片描述


(1)、MANIFEST.MF

该文件中保存的内容其实就是逐一遍历 APK 中的所有条目,如果是目录就跳过,如果是一个文件,就用 SHA1(或者 SHA256)消息摘要算法提取出该文件的摘要然后进行 BASE64 编码后,作为「SHA1-Digest」属性的值写入到 MANIFEST.MF 文件中的一个块中。该块有一个「Name」属性, 其值就是该文件在 APK 包中的路径。

在这里插入图片描述


(2)、CERT.SF

  • SHA1-Digest-Manifest-Main-Attributes:对 MANIFEST.MF 头部的块做 SHA1(或者SHA256)后再用 Base64 编码
  • SHA1-Digest-Manifest:对整个 MANIFEST.MF 文件做 SHA1(或者 SHA256)后再用 Base64 编码
  • SHA1-Digest:对 MANIFEST.MF 的各个条目做 SHA1(或者 SHA256)后再用 Base64 编码

在这里插入图片描述


(3)、CERT.RSA

这里会把之前生成的 CERT.SF 文件,用私钥计算出签名, 然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 中保存。

这里要注意的是,Android APK 中的 CERT.RSA 证书是自签名的,并不需要这个证书是第三方权威机构发布或者认证的,用户可以在本地机器自行生成这个自签名证书。Android 目前不对应用证书进行 CA 认证。

在这里插入图片描述


​ 这里我们看到的都是二进制文件,因为 RSA 文件加密了,需要用 openssl 命令才能查看其内容:

$ openssl pkcs7 -inform DER -in /Sample-release_new/original/META-INF/CERT.RSA -text -noout -print_certs

在这里插入图片描述


签名具体过程:

  • 计算APK的SHA-1摘要值digest
  • 使用开发者私钥对digest进行签名,生成数字签名sig
  • 将sig存储在CERT.RSA文件中
  • 生成包含APK的digest描述及其他元数据的CERT.SF文件
  • 对CERT.SF文件计算SHA-1摘要digest2
  • 使用开发者私钥对digest2签名,存储到CERT.SF中

在这里插入图片描述


签名校验过程:

签名验证是发生在 APK 的安装过程中,一共分为三步:

  • 第一步,检查 APK 中包含的所有文件,对应的摘要值与 MANIFEST.MF 文件中记录的值一致。

  • 第二步,使用证书文件(RSA 文件)检验签名文件(SF 文件)没有被修改过。

  • 第三步,使用签名文件(SF 文件)检验 MF 文件没有被修改过。

在这里插入图片描述


2、使用APK签名v1的完整示例


(1)、生成密钥对

使用keytool工具生成密钥对,别名为mykey,有效期为10000天:

keytool -genkey -v -keystore mykey.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000

(2)、对APK进行对齐

使用zipalign工具对APK进行对齐优化:

复制

zipalign 4 myapp.apk myapp-aligned.apk

(3)、获取待签名APK的摘要值

使用apkutil工具计算待签名APK的摘要值:

apkutil digest myapp-aligned.apk
Digest of myapp-aligned.apk:
  SHA-1: A0:EA:B8:12.....

(4)、使用密钥库签名APK

使用apksigner工具对APK进行签名:

apksigner sign --ks mykey.keystore --ks-key-alias mykey myapp-aligned.apk

输入密钥库密码后,APK将被签名,生成myapp-aligned-signed.apk文件。


(5)、验证签名

使用apksigner工具验证签名:

apksigner verify --verbose myapp-aligned-signed.apk

输出显示APK签名合法,说明签名成功。

这样就完成了使用v1签名方案对APK进行签名的全过程。

需要注意的是,从Android 9.0开始,APK需要同时使用v1和v2签名方案。使用v2签名方案可以提高签名效率和安全性。开发者可以使用Android SDK的apksigner工具同时进行v1和v2签名。


四、APK签名方案v2


Android APK签名方案v2是Google在Android 7.0中引入的新签名方案,旨在提高签名的效率和安全性。它主要解决了v1方案中存在的一些问题,如签名数据过大、校验效率低下等。


1、APK签名方案v2原理

v2签名使用更高强度的SHA-256算法和先进的APK Signature Scheme v2签名方案。

v2 签名模式在原先 APK 块中增加了一个新的块(签名块),新的块存储了签名,摘要,签名算法,证书链,额外属性等信息,这个块有特定的格式。


在这里插入图片描述


为了保护 APK 内容,整个 APK(ZIP 文件格式)被分为以下 4 个区块:

  • ZIP 条目的内容(从偏移量 0 处开始一直到“APK 签名分块”的起始位置)

  • APK 签名分块

  • ZIP 中央目录

  • ZIP 中央目录结尾


在这里插入图片描述


其中,应用签名方案的签名信息会被保存在 区块 2(APK Signing Block)中,而区块 1(Contents of ZIP entries)、区块 3(ZIP Central Directory)、区块 4(ZIP End of Central Directory)是受保护的,在签名后任何对区块 1、3、4 的修改都逃不过新的应用签名方案的检查。


主要特点:

  • 使用更高强度的SHA-256代替SHA-1
  • 只对APK中的代码和资源进行签名,而不是整个APK文件
  • 引入APK Signature Scheme v2,对每个文件单独签名并存储签名数据
  • 支持使用多个签名密钥对APK签名

签名过程:

  • 遍历APK中的所有内容,计算SHA-256摘要值

  • 使用开发者的私钥对每个文件摘要进行签名

  • 将所有文件签名保存在APK的META-INF/hashValue文件中

  • 生成证书列表,存储在APK的META-INF/hashValue.sf文件中

  • 生成APK Signature Block,包含证书链、签名数据,存储在APK的META-INF/hashValue.rsa文件中


在这里插入图片描述


签名校验过程:

我们来看v2签名的校验过程,整体大概流程如下图所示:

在这里插入图片描述


其中 v2 签名机制是在 Android 7.0 以及以上版本才支持。

因此对于 Android 7.0 以及以上版本,在安装过程中,如果发现有 v2 签名块,则必须走 v2 签名机制,不能绕过;否则降级走 v1 签名机制。 v1 和 v2 签名机制是可以同时存在的,其中对于 v1 和 v2 版本同时存在的时候,v1 版本的 META_INF 的 .SF 文件属性当中有一个 X-Android-APK-Signed 属性:

X-Android-APK-Signed: 2

因此如果想绕过 v2 走 v1 校验是不行的。


2、使用APK签名v2的完整示例

(1)、生成密钥对

keytool -genkey -v -keystore mykey.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000

(2)、使用zipalign优化APK文件

zipalign 4 myapp.apk myapp-aligned.apk

(3)、使用apksigner对APK进行v2签名

apksigner sign --ks mykey.keystore --ks-key-alias mykey --v2-signing-enabled true myapp-aligned.apk

输入密钥库密码后,apksigner将会生成已签名的APK文件myapp-aligned-signed.apk。

(4)、验证APK签名(可选)

apksigner verify --verbose myapp-aligned-signed.apk

输出显示APK使用的是v2签名方案,并且签名合法。

这样就完成了v2签名方案对APK的签名操作。我们可以看到相比v1方案,v2签名更加高效和安全,签名数据也更小。

需要注意的是,从Android 9.0开始,Google要求所有上架Google Play的新APK必须同时使用v1和v2签名方案进行签名。

我们可以使用如下:

apksigner sign --ks mykey.keystore --ks-key-alias mykey --v1-signing-enabled true --v2-signing-enabled true myapp-aligned.apk

这将生成一个同时包含v1和v2签名的APK文件,可以在所有Android版本上安装和运行。


五、APK签名方案v3


Android APK签名方案v3是Google在Android 11中引入的最新签名方案,主要目的是提高签名的安全性和可靠性。相比之前的签名方案,v3签名引入了一些重大改变,如引入Android KeyStore系统以增强密钥安全性、支持对签名使用压缩等。下面将详细介绍APK签名v3的原理和使用案例。


1、APK签名方案v3原理

(1)、v3签名的主要特性

  • 使用Android KeyStore系统存储和管理私钥,增强密钥安全性。

  • 支持使用压缩算法(如gzip)对签名数据进行压缩,减小APK大小。

  • 支持签名时向APK添加新的签名方案,但保留之前版本的签名数据。

  • 签名时支持附加描述信息(attribution)。


(2)、签名过程

  • 开发者生成密钥对,并将私钥安全存储在Android KeyStore系统中。
  • 遍历APK内容,计算SHA-256或SHA-512摘要值。
  • 使用私钥对每个文件摘要进行签名。
  • 将签名数据压缩后存储在APK的新增的APK Signature Block文件中。
  • 可选地添加签名者的描述信息(attribution)。

(3)、签名校验过程

在这里插入图片描述

需要注意的是,对于覆盖安装的情况,签名校验只支持升级,而不支持降级。也就是说设备上安装了一个使用 v1 签名的 APK,可以使用 v2 签名的 APK 进行覆盖安装,反之则不允许。


(3)、使用APK签名v3的完整示例

  • 生成密钥对并保存到Android KeyStore
cmd:  keytool --genkeypair --v --keystore ~/.android/debug.keystore --alias androiddebugkey --keyalg RSA --keysize 2048 --validity 10000
  • 使用zipalign优化APK
zipalign 4 myapp.apk myapp-aligned.apk
  • 使用apksigner进行v3签名

从Android 11开始,apksigner工具默认使用v3签名方案

apksigner sign --ks ~/.android/debug.keystore --ks-key-alias androiddebugkey myapp-aligned.apk

输入密钥库密码后,将生成已签名的APK: myapp-aligned-signed.apk

  • 验证APK签名
apksigner verify --verbose myapp-aligned-signed.apk

输出将显示签名使用了v3方案,并且合法有效。

以上就是使用v3签名APK的完整过程。

值得注意的是:

  • 对于Android 11及更高版本,Google Play要求新APK必须使用v3签名方案。
  • 对于Android 9至10版本,新APK需同时使用v2和v3签名。可以使用参数--v2-signing-enabled true启用v2签名。
  • 对于Android 8及以下版本,新APK必须使用v1和v2签名,使用参数--v1-signing-enabled true启用v1签名。

通过并存不同版本的签名数据,Google保证了APK在所有Android版本上的兼容性。总的来说,v3签名进一步增强了签名的安全性和可靠性,为Android系统的应用程序分发提供了更好的保护。


结语

签名机制的演进为Android应用的安全性提供了坚实的基础,但随着技术的发展,未来是否还会出现新的签名方案?现有的机制又将如何适应不断变化的安全需求?让我们拭目以待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业如何通过云服务器实现全球连通运营

如果说互联网是一座桥,连接起了全球各地的信息,那云服务器就如同一座高速公路,帮助企业轻松实现跨国家、跨时区的全球运营。 这个听起来像科幻电影的情节其实已经成为了我们现实生活的一部分。现在就来具体看一下如何做到这一点吧。 其一&…

Django开发实战之定制管理后台界面及知识梳理(中)

上一篇文章末尾讲到如何能够展示更多的字段在界面上,那么针对整个界面数据,如果我想按照某一个条件进行筛选,我该怎么做呢,只需要加上下面一行代码 注意:中途只有代码片段,文末有今天涉及的所有代码 1、增…

RuoYi-Vue-Plus (Logback 和 logback-plus.xml 、p6spy)

项目后本地日志 一、logback依赖 打开最外层的 pom.xml,查看 SpringBoot的依赖配置。 <dependencyManagement><dependencies><!-- SpringBoot的依赖配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…

视频汇聚管理/安防监控系统EasyCVR如何开启和调用验证码登录接口?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

项目实施方案:多点异地机动车典型系统试验状态可视监控系统

目录 一、需求分析 1.1项目背景 1.2项目概述 二、系统优势 2.1兼容性能力强 2.2接入协议多样 2.3并发能力强 2.3.1 单平台参数 2.3.2 多平台性能参数 2.4 系统稳定性 三、建设目标 3.1安全性 3.2可扩展性 3.3易用性 3.4兼容性 3.5 响应能力 四、系统整体解决方…

C#窗体程序设计笔记:如何调出控件工具箱,并设置控件的属性

文章目录 调出控件工具箱设置控件属性 调出控件工具箱 使用Visual Studio打开C#解决方案后&#xff0c;初始界面如下图所示&#xff1a; 接着&#xff0c;在上方的菜单栏依次选择“视图”“工具箱”&#xff0c;即可打开工具箱&#xff0c;如下图所示&#xff1a; 设置控件属…

Service Worker的生命周期和全局对象和API

Service Worker的生命周期和全局对象和API 当我们注册了Service Worker后&#xff0c;它会经历生命周期的各个阶段&#xff0c;同时会触发相应的事件。整个生命周期包括了&#xff1a;installing --> installed --> activating --> activated --> redundant。当Se…

vue2人力资源项目6角色管理

elementUi编写表格样式及分页组件 <template><div class"container"><div class"app-container"><!--角色管理内容--><div class"role-operate"><el-button type"primary">添加角色</el-butt…

高级个人主页

高级个人主页 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, use…

2024年3月 电子学会 青少年等级考试机器人理论真题五级

202403 青少年等级考试机器人理论真题五级 第 1 题 下图程序运行后&#xff0c;串口监视器显示的结果是&#xff1f;&#xff08; &#xff09; A&#xff1a;0 B&#xff1a;1 C&#xff1a;3 D&#xff1a;4 第 2 题 下列选项中&#xff0c;关于74HC595移位寄存器芯片的…

【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 Cortex-M7 Debug eventDebug events Cortex-M7 Debug event 在ARM Cortex-M7架构中&#xff0c;调试事件&#xff08;Debug Event&#xff09;是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生&#xff1a; 进…

2024第16届四川教育后勤装备展6月1日举办 欢迎参观

2024第16届四川教育后勤装备展6月1日举办 欢迎参观 邀请函 主办单位&#xff1a; 中国西部教体融合博览会组委会 承办单位&#xff1a;重庆港华展览有限公司 博览会主题&#xff1a;责任教育 科教兴邦 组委会&#xff1a;交易会159交易会2351交易会9466 展会背景 成都…

matlab使用2-基础绘图

matlab使用2-基础绘图 文章目录 matlab使用2-基础绘图1. 二维平面绘图2. 三维立体绘图3. 图形窗口的分割 1. 二维平面绘图 % 创建一些二维数据 x 0:0.01:10; % x轴的数据点&#xff0c;从0到10&#xff0c;间隔为0.01 y sin(x); % y轴的数据点&#xff0c;是x的正弦…

实时“秒回”,像真人一样语音聊天,GPT-4o模型强到恐怖

今天凌晨OpenAl发布了 GPT-4o&#xff0c;这是一种新的人工智能模式&#xff0c;集合了文本、图片、视频、语音的全能模型。 能实时响应用户的需求&#xff0c;并通过语音来实时回答你&#xff0c;你可以随时打断它。还具有视觉能力&#xff0c;能识别物体并根据视觉做出快速的…

基准电流源电路仿真

1.补全电路 2.更改vpluse属性 3.添加tran仿真&#xff0c;因为加入启动电路主要看的就是tran仿真 4.启动仿真 5.看电路曲线 先点这个main form 不用选择ok&#xff0c;直接点中四条线&#xff0c;中间第2条曲线如果出现那样一个小波动后面没有起伏就说明成功了。

什么是Keycloak?怎么样使用Keycloak实现登录和权限验证?

什么是Keycloak&#xff1f;怎么样使用Keycloak实现登录和权限验证&#xff1f; 文章目录 什么是Keycloak&#xff1f;怎么样使用Keycloak实现登录和权限验证&#xff1f;Open Source Identity and Access Management(开源身份和访问管理)1、支持的协议&#xff1a;2、安装与部…

如何在 Mac 上恢复已删除的文件

点击“删除”后立即后悔&#xff1f;不用担心。我们的教程介绍了如何恢复已删除的 Mac 文件、电子邮件、iTunes 音乐等&#xff0c;即使您没有 Time Machine 备份并且无需支付软件费用。 在 macOS 中丢失文件可能会非常痛苦&#xff0c;如果您是点击删除的人&#xff0c;情况会…

稳定网络的诀窍:静态住宅代理解决方案

在数字化时代&#xff0c;网络稳定性对于个人和企业都至关重要。然而&#xff0c;由于多种因素的影响&#xff0c;如地理位置、网络拥堵或网络安全问题等&#xff0c;网络稳定性常常受到挑战。为了应对这些挑战&#xff0c;静态住宅代理作为一种高效且可靠的网络解决方案&#…

c++ 各版本特性介绍

c C是一种高级编程语言&#xff0c;以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的&#xff0c;作为C语言的一个扩展。C不仅包含了C语言的所有特性&#xff0c;还引入了面向对象编程&#xff08;OOP&#xff09;的概念&…

Poe是什么?怎样订阅Poe?

Poe&#xff08;全称“开放探索平台”&#xff0c;Platform for Open Exploration&#xff09;是一款由Quora开发的移动应用程序&#xff0c;于2022年12月推出。该应用程序内置建基于AI技术的聊天机器人&#xff0c;可供用户向机器人询问专业知识、食谱、日常生活&#xff0c;甚…