Android SELinux:保护您的移动设备安全的关键

Android SELinux:保护您的移动设备安全的关键
1 引言
移动设备在我们的生活中扮演着越来越重要的角色,我们几乎把所有重要的信息都存储在这些设备上。然而,随着移动应用程序的数量不断增加,安全性也变得越来越关键。这就是为什么安卓系统引入了SELinux(Security-Enhanced Linux)的原因。
1.1 SELinux的概念和作用
SELinux是一个强制访问控制(MAC)机制,最初由美国国家安全局(NSA)开发。它被设计用于增强Linux操作系统的安全性,并防止恶意攻击者利用各种漏洞进行未授权访问或提升权限。
SELinux通过实施最小特权原则(Principle of Least Privilege)来限制进程和应用程序的权限。它基于标签和域的概念,为每个进程、文件和对象分配唯一的安全上下文。这样,SELinux可以在运行时强制执行策略,限制进程只能访问其所需的资源和功能。
1.2 移动设备安全的重要性
移动设备存储了大量的敏感信息,包括个人身份、财务数据和机密业务文件等。如果这些信息遭到未经授权的访问或泄露,将会给个人和组织带来巨大的损失。此外,移动设备还面临恶意软件、网络攻击和数据泄漏等威胁。
为了保护我们的移动设备和数据安全,需要采取有效的安全措施。SELinux作为Android系统的一部分,在提供强大的安全保护方面发挥着关键作用。通过实施最小特权原则和强制访问控制,SELinux可以限制应用程序的权限,并防止恶意软件的传播和攻击。
2 SELinux的基本原理
2.1 安全策略和强制访问控制(MAC)模型
在SELinux中,安全策略是指定义了系统如何处理和保护资源的规则集合。这些规则决定了哪些进程可以访问哪些资源,并规定了访问权限的级别。
强制访问控制(MAC)模型是SELinux的核心概念之一。与传统的自由选择访问控制(DAC)模型不同,MAC模型通过强制执行安全策略来确保进程和应用程序只能访问其所需的资源。这种限制是通过使用标签和域的概念来实现的。
2.2 标签和域的概念
SELinux使用标签和域来标识和隔离不同的对象和资源。每个进程、文件和设备都被分配了一个唯一的安全上下文,该上下文包含了标签和域的信息。
标签是一个由多个组成部分组成的字符串,用于描述对象的类型、角色和级别。例如,可以为一个文件分配以下标签:type=app_data,role=user,level=low。这些标签定义了文件的类型、用户角色和安全级别。
域是一组具有相似安全要求和访问权限的对象的集合。它们帮助隔离和保护系统中的不同组件。例如,可以为一个应用程序分配一个独立的域,使其与其他应用程序相互隔离。
2.3 具体的SELinux实现方式
在Android系统中,SELinux使用了一种名为"sepolicy"的安全策略文件来定义安全规则和访问权限。这个文件包含了大量的规则,用于控制进程、应用程序和资源之间的交互。
通过修改sepolicy文件,可以定义哪些进程可以执行哪些操作,以及对哪些资源具有读写权限。这样,即使应用程序被恶意攻击,它也只能在其允许的范围内进行操作,无法越权访问其他资源。
示例代码:
# 修改sepolicy文件以定义安全规则
allow app_data app_file:file { read write };
allow app_process app_data:dir { search };
以上是对SELinux基本原理的介绍。接下来,我们将探讨在Android系统中如何配置和管理SELinux,并进一步了解其在移动设备安全方面的重要性。
3 SELinux在Android中的应用
3.1 Android的安全架构
Android操作系统采用了多层次的安全架构,旨在保护用户数据和系统的完整性。其中关键的一层是SELinux,它通过强制访问控制模型提供了额外的保护层。
Android的安全架构还包括应用沙盒、权限模型和数字签名等机制,以确保应用程序只能访问其所需的资源,并且防止未经授权的访问。
3.2 SELinux在Android中的角色
SELinux在Android系统中扮演着重要的角色,它为每个应用程序和系统组件分配了一个独特的安全上下文。这些上下文包含了标签和域的信息,限制了应用程序能够访问的资源和权限。
SELinux通过强制执行安全策略来保证系统的安全性。它限制了应用程序的行为,防止恶意应用程序获取敏感数据或对系统进行操控。同时,SELinux还可以阻止应用程序之间的相互干扰,提高整个系统的稳定性。
3.3 SELinux在应用程序隔离中的作用
一个关键的安全挑战是确保不同的应用程序之间相互隔离,以防止恶意应用程序获取敏感数据或攻击其他应用程序。SELinux在应用程序隔离方面发挥着重要作用。
通过为每个应用程序分配独立的安全上下文,SELinux确保了应用程序之间的资源隔离和访问控制。这意味着即使一个应用程序被入侵或受到恶意代码的攻击,它也只能在其所允许的范围内进行操作,无法越权访问其他应用程序或系统资源。
示例代码:
// 通过SELinux限制应用程序的访问权限
public void restrictAccess() {SecurityManager securityManager = System.getSecurityManager();if (securityManager != null) {securityManager.checkPermission(new SELinuxPermission("allow_app_access"));}
}
以上是对SELinux在Android中应用的介绍。接下来,我们将讨论如何配置和管理SELinux以提高移动设备的安全性,并总结其在移动应用程序开发中的最佳实践。
4 SELinux策略生成和管理
4.1 策略生成工具和过程
为了生成SELinux策略,Android使用了一个名为"sepolicy"的安全策略文件。这个文件包含了大量的规则,用于定义进程、应用程序和资源之间的访问权限。
在Android中,策略生成工具主要有两个:audit2allow和checkmodule。audit2allow用于将安全审计日志转换为策略规则,checkmodule用于验证和编译策略模块。
策略生成的过程通常包括以下步骤:
- 收集安全审计日志:通过监视系统的安全审计日志,记录应用程序和系统组件的访问请求。
- 分析安全审计日志:使用audit2allow工具分析安全审计日志,提取出访问请求和相应的安全规则。
- 生成策略规则:根据分析结果,生成具体的策略规则并添加到sepolicy文件中。
- 验证和编译策略模块:使用checkmodule工具验证策略规则的语法和正确性,并将其编译成可加载的模块。
4.2 SELinux上下文和标签管理
在Android中,每个进程、文件和设备都被分配了一个唯一的安全上下文,其中包含了标签和域的信息。上下文的管理是通过SELinux上下文和标签管理器来实现的。
SELinux上下文和标签管理器提供了一组命令和API,用于查看、修改和管理对象的安全上下文。开发人员可以使用这些工具来为应用程序分配相应的标签,控制其访问权限,并确保应用程序与其他组件的正确隔离。
示例代码:
# 查看文件的安全上下文
ls -Z /data/app/com.example.app# 修改文件的安全上下文
chcon u:object_r:app_data_file:s0 /data/app/com.example.app# 查询应用程序的安全上下文
adb shell ps -Z | grep com.example.app
4.3 OEM定制策略的添加和维护
Android设备制造商通常需要根据其特定的需求和硬件配置对SELinux策略进行定制。为了支持OEM定制策略的添加和维护,Android提供了相应的工具和机制。
OEM可以通过修改sepolicy文件或添加自定义的策略模块来定制SELinux策略。这些定制内容可以包括特定设备的访问规则、硬件驱动程序的权限要求等。
为了确保策略的正确性和完整性,OEM需要进行验证和测试,并遵循Android的最佳实践和安全指南。
以上是对SELinux策略生成和管理的介绍。接下来,我们将讨论如何配置SELinux以提高移动设备的安全性,并总结在Android开发中使用SELinux的一些最佳实践。
5 SELinux的优势和挑战
SELinux作为一种强制访问控制(MAC)机制,在Android系统中提供了强大的安全保护。然而,它也面临着一些挑战。本节将介绍SELinux的优势和挑战,并提供相应的解决方案。
5.1 提供强大的安全保护
SELinux通过强制访问控制策略,限制了应用程序和系统组件之间的访问权限,从而有效地保护了移动设备免受恶意应用程序和攻击的威胁。
- 细粒度的访问控制:SELinux可以对每个应用程序、文件和设备进行细粒度的访问控制,通过定义安全上下文和标签来限制其访问权限。这样可以确保应用程序只能访问其所需的资源,防止应用程序跨越边界进行非法操作。
示例代码:
# 为应用程序分配安全标签
chcon u:object_r:app_data_file:s0 /data/app/com.example.app# 通过SELinux规则限制应用程序的访问权限
allow app_data_file:file { read write };
deny app_data_file:file { getattr open };
- 隔离和沙盒化:SELinux还可以将应用程序隔离在各自的安全域中,防止恶意应用程序对其他应用程序和系统进行干扰。这种沙盒化的机制可以有效地限制应用程序的权限和行为,提高整体系统的安全性。
5.2 防止恶意应用程序的扩散
SELinux在Android系统中起到了重要的角色,防止恶意应用程序的扩散和攻击的传播。
-
强制执行安全策略:SELinux强制执行安全策略,禁止恶意应用程序进行未授权的访问和操作。即使应用程序本身存在漏洞或被攻击,SELinux仍然可以限制其权限,减少潜在的风险。
-
安全审计和监控:SELinux还提供了安全审计功能,可以记录应用程序和系统组件的访问请求和操作。这些审计日志可以用于分析和检测恶意行为,及时采取相应的措施。
5.3 对系统性能的影响和解决方案
尽管SELinux提供了强大的安全保护,但它也可能对系统性能产生一定的影响。这主要体现在策略生成和管理、资源消耗等方面。
-
策略生成和管理:策略生成工具和过程可能会占用一定的系统资源和时间。为了减少影响,可以优化策略生成工具的算法和流程,并定期清理无用的策略规则。
-
资源消耗:SELinux需要使用一定的内存和处理能力来执行安全策略。在资源受限的移动设备上,这可能会对系统性能产生一定的压力。为了缓解影响,可以调整策略的严格程度,选择更合适的策略模式。
总结:
SELinux作为一种强制访问控制(MAC)机制,在Android系统中提供了强大的安全保护。它通过细粒度的访问控制、隔离和沙盒化等功能,有效地防止恶意应用程序的扩散和攻击的传播。然而,它也面临着一些挑战,如策略生成和管理、资源消耗等方面的影响。通过优化策略生成工具和流程、调整策略的严格程度等解决方案,可以最大程度地发挥SELinux的优势同时降低其对系统性能的影响。
6 SELinux的未来发展
SELinux作为一种强制访问控制(MAC)机制,在保护移动设备和系统安全方面发挥着重要的作用。未来,SELinux将继续发展和改进,以应对不断增长的安全威胁。本节将讨论SELinux未来发展的三个方面:安全性的提升、与其他安全技术的整合以及开源社区的贡献和反馈。
6.1 安全性的不断提升
随着安全威胁的不断演变和增长,SELinux将不断提升其安全性能力,以应对新的攻击和漏洞。以下是一些SELinux未来可能采取的措施:
-
改进策略规则:SELinux可以通过加强策略规则和验证机制,提升安全性能力。这包括改进标签定义、访问规则和安全上下文等方面,以减少潜在的漏洞和权限滥用。
-
持续的安全审计和监控:SELinux可以加强安全审计和监控功能,持续记录应用程序和系统组件的访问请求和操作。通过分析和检测异常行为,SELinux可以及时采取相应的措施,提升系统的安全性。
示例代码:
# 开启SELinux的审计功能
setenforce 1# 查看SELinux审计日志
cat /var/log/audit/audit.log
6.2 与其他安全技术的整合
为了更好地应对复杂的安全威胁,SELinux将与其他安全技术进行整合,共同构建多层次的安全防护体系。以下是一些可能的整合方式:
-
与容器技术的整合:SELinux可以与容器技术(如Docker、Kubernetes)进行整合,提供更强大的容器隔离和沙盒化能力。通过结合SELinux的细粒度访问控制和容器技术的隔离机制,可以更好地保护容器环境和应用程序的安全。
-
与人工智能和机器学习的整合:SELinux可以与人工智能和机器学习技术进行整合,实现自动化的安全策略生成和管理。通过分析大量的安全数据和行为模式,SELinux可以自动学习和适应不断变化的安全威胁,提供更智能化的安全防护能力。
6.3 开源社区的贡献和反馈
作为开源项目,SELinux的发展离不开广大开源社区的贡献和反馈。开源社区可以通过以下方式参与SELinux的发展:
-
提交问题和反馈:开源社区成员可以积极提交问题和反馈,包括安全漏洞、性能问题和用户体验等方面。这些反馈将有助于SELinux团队及时发现和修复问题,提高系统的稳定性和安全性。
-
参与代码贡献:开源社区成员可以积极参与SELinux的代码开发和改进。他们可以提交新功能、修复漏洞、改进文档等,共同推动SELinux的发展。
-
分享经验和最佳实践:开源社区成员可以分享使用SELinux的经验和最佳实践,帮助其他人更好地理解和应用SELinux。这有助于扩大SELinux的影响力和应用范围。
总之,SELinux作为一种强制访问控制(MAC)机制,在移动设备和系统安全方面发挥着重要的作用。未来,SELinux将继续提升其安全性能力,通过改进策略规则和加强安全审计等措施应对安全威胁。同时,SELinux还将与其他安全技术进行整合,构建多层次的安全防护体系,如与容器技术和人工智能的整合。开源社区的贡献和反馈对SELinux的发展至关重要,包括提交问题和反馈、参与代码贡献以及分享经验和最佳实践等。通过共同努力,SELinux将不断发展和完善,提供更强大的安全保护能力。
7. Android SEPolicy
AOSP的sepolicy目录位于system/sepolicy, 包含 Android SELinux 策略配置的核心内容。
它定义了适用于所有设备的 AOSP 服务和应用程序的域和类型。设备特定的策略应该放在一个单独的 device/<vendor>/<board>/sepolicy 子目录下,并链接到策略构建中,如下所述。
7.1 策略生成
每个设备都可以添加额外的策略文件到策略构建中。这些文件中的每一行,包括最后一行,都应该以换行符 (0x0A) 结尾。这将允许文件在构建过程中调用 m4(1) 宏处理器时连接和处理。添加换行符也会使中间文本文件更容易在调试构建失败时进行阅读。文件、服务和属性上下文文件集将自动在每个文件之间插入换行符,因为这些是常见的失败点。
这些设备策略文件可以通过使用 BOARD_VENDOR_SEPOLICY_DIRS 变量进行配置。该变量应该在设备或供应商目录下的 BoardConfig.mk 文件中设置。
BOARD_VENDOR_SEPOLICY_DIRS 包含一个目录列表,用于搜索额外的策略文件。顺序在列表中很重要。例如,如果您在 BOARD_VENDOR_SEPOLICY_DIRS 搜索路径中有 2 个 widget.te 文件实例,则找到的第一个文件(在包含文件的第一个搜索目录中)将首先连接起来。查看 out/target/product/<device>/obj/ETC/vendor_sepolicy.conf_intermediates/vendor_sepolicy.conf 将有助于解决排序问题。
示例 BoardConfig.mk 用法:
从 Tuna 设备的 BoardConfig.mk,device/samsung/tuna/BoardConfig.mk
BOARD_VENDOR_SEPOLICY_DIRS += device/samsung/tuna/sepolicy
除了供应商 sepolicy 目录之外,OEM 还可以修改 product 和 system_ext 分区的公共和私有策略:
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS += device/acme/roadrunner-sepolicy/systemext/public
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS += device/acme/roadrunner-sepolicy/systemext/private
PRODUCT_PUBLIC_SEPOLICY_DIRS += device/acme/roadrunner-sepolicy/product/public
PRODUCT_PRIVATE_SEPOLICY_DIRS += device/acme/roadrunner-sepolicy/product/private
旧的 BOARD_PLAT_PUBLIC_SEPOLICY_DIR 和 BOARD_PLAT_PRIVATE_SEPOLICY_DIR 变量已被弃用,改为使用 SYSTEM_EXT_*。
此外,OEM 还可以指定 BOARD_SEPOLICY_M4DEFS,以在构建过程中传递任意的 m4 定义。定义由形如 macro-name=value 的字符串组成。不能包含空格。这对于构建模块化策略、策略生成、条件文件路径等非常有用。它支持以下文件类型:
- 所有传递给
checkpolicy的*.te和 SELinux 策略文件 file_contextsservice_contextsproperty_contextskeys.conf
示例 BoardConfig.mk 用法:
BOARD_SEPOLICY_M4DEFS += btmodule=foomatic \btdevice=/dev/gps
特定策略文件信息
mac_permissions.xml
mac_permissions.xml 文件用于控制 mmac 解决方案,并将公共的十六进制签名密钥映射到任意 seinfo 字符串。该文件的内容细节可以在文件顶部的注释中找到。前面提到的 seinfo 字符串是在 seapp_contexts 中引用的相同字符串。
值得注意的是,最终处理的版本将剥离注释和空格。这是为了在 system.img 上保留空间。如果想以更人性化的格式查看它,可以使用 tidy 或 xmllint 命令。
insertkeys.py
是一个辅助脚本,用于将 mac_permissions.xml 签名标记中的任意标签映射到 pem 文件中找到的公钥。此脚本需要一组 mac_permissions.xml 文件和配置文件才能运行。有关配置文件 (keys.conf) 的详细信息可以在 keys.conf 子部分中找到。该工具还负责在处理过程中剥离注释和空格。
keys.conf
keys.conf 文件用于控制在 mac_permissions.xml 签名标记中找到的“标签”与在 pem 文件中找到的实际公钥之间的映射。该配置文件通过 m4 处理。
该脚本允许将任何包含在 TARGET_BUILD_VARIANT 中的字符串与特定路径映射到 pem 文件。通常,TARGET_BUILD_VARIANT 是用户、开发或用户调试。此外,可以指定“ALL”以将路径映射到 TARGET_BUILD_VARIANT 中指定的任何字符串。所有标签都会逐字匹配,所有选项都会匹配小写字母。选项会自动转换为小写字母,它们应该以大写字母表示标签和选项,并以 @ 开头。选项参数还可以使用环境变量,例如 $VARIABLE 语法。这通常对于设置位置到发布密钥非常有用。
通常,您需要集成由另一个组织签名的应用程序,并可能需要提取 pem 文件以供 insertkeys/keys.conf 工具使用。可以通过 openssl 提取 pem 格式的公钥。首先需要解压 apk,一旦解压完成,进入 META_INF 目录,然后执行以下命令:
openssl pkcs7 -inform DER -in CERT.RSA -out CERT.pem -outform PEM -print_certs
在某些情况下,CERT.RSA 可能具有不同的名称,您需要进行调整。提取 pem 后,您可以重命名它,并配置 keys.conf 和 mac_permissions.xml 以获取更改。您必须在文本编辑器中打开生成的 pem 文件并删除剪切线之外的任何内容。否则,会导致 insertkeys.py 抛出编译时问题。
**注意:**pem 文件是 base64 编码的,PackageManagerService、mac_permissions.xml 和 setool 都使用 base16 编码。
8. 结论
8.1 SELinux的重要性和优势
在本文中,我们详细讨论了SELinux的重要性和优势。作为一种强制访问控制(MAC)机制,SELinux为移动设备和系统提供了强大的安全保护能力。通过细粒度的访问控制和策略规则,SELinux可以限制应用程序和用户的权限,并防止未经授权的访问和操作。这可以有效减少恶意软件和攻击者对移动设备的威胁。
SELinux的优势还体现在以下几个方面:
-
阻止特权升级:SELinux的强制访问控制机制可以阻止特权升级攻击。即使攻击者成功获取了某个应用程序的权限,他们仍然无法越过SELinux的限制,进而对系统进行更深层次的攻击。
-
限制应用程序权限:SELinux可以限制每个应用程序的权限范围,避免应用程序滥用权限。这有助于提高系统的整体安全性,减少潜在的漏洞和攻击面。
-
支持多用户环境:SELinux可以在多用户环境中提供更强大的安全隔离和保护。不同用户之间的应用程序和数据可以被有效隔离,避免信息泄露和跨用户攻击。
# 查看SELinux状态
sestatus# 修改指定应用程序的访问策略
semanage permissive -a <application_name># 查看应用程序的安全上下文
ls -Z <file_path>
8.2 移动设备安全的前景进行展望
随着移动设备的普及和依赖程度的增加,对移动设备安全的需求也在不断提升。SELinux作为一种强制访问控制机制,将在移动设备安全中发挥更重要的作用。未来,我们可以期待以下几个方面的发展:
-
更细粒度的访问控制:随着移动设备应用程序的复杂性增加,对访问控制的要求也会变得更加细粒度。未来的SELinux将提供更多的策略规则和定制选项,以满足不同应用程序和用户的安全需求。
-
强化容器化安全:移动设备上的容器化技术(如Docker、Kubernetes)正在快速发展,未来的SELinux将与这些技术进行更紧密的整合,提供更强大的容器隔离和安全保护能力。
-
自适应的安全策略:随着人工智能和机器学习技术的发展,未来的SELinux将能够自动学习和适应不断变化的安全威胁。它可以通过分析大量的安全数据和行为模式,自动生成和调整安全策略,提供更智能化的安全防护能力。
总之,SELinux作为强制访问控制机制在移动设备安全中发挥着重要作用。它可以阻止特权升级攻击、限制应用程序权限,并提供多用户环境下的安全隔离。在未来,我们可以期待SELinux提供更细粒度的访问控制、强化容器化安全以及自适应的安全策略。随着移动设备的普及和安全需求的增加,SELinux将在移动设备安全中扮演更重要的角色。
相关文章:
Android SELinux:保护您的移动设备安全的关键
Android SELinux:保护您的移动设备安全的关键 1 引言 移动设备在我们的生活中扮演着越来越重要的角色,我们几乎把所有重要的信息都存储在这些设备上。然而,随着移动应用程序的数量不断增加,安全性也变得越来越关键。这就是为什么…...
第十三章认识Ajax(四)
认识FormData对象 FormData对象用于创建一个表示HTML表单数据的键值对集合。 它可以用于发送AJAX请求或通过XMLHttpRequest发送表单数据。 以下是FormData对象的一些作用: 收集表单数据:通过将FormData对象与表单元素关联,可以方便地收集表单中的数据。使用FormData对象,…...
使用 Node.js 和 Cheerio 爬取网站图片
写一个关于图片爬取的小案例 爬取效果 使用插件如下: {"dependencies": {"axios": "^1.6.0","cheerio": "^1.0.0-rc.12","request": "^2.88.2"} }新建一个config.js配置文件 // 爬取图片…...
2024美赛数学建模E题思路源码
赛题目的 可以将其拆解为以下主要问题,并为每个问题提出解决方案: 如何在极端天气事件越来越多的地区部署财产保险? 保险公司应在何时何地承保保单? 业主如何影响保险公司的承保决定? 如何建立能够评估未来房地产决…...
解决Docker AList本地挂载失效的问题。
解决Docker AList本地挂载失效的问题。 AList Docker version: 3.3 services:alist:image: xhofe/alist:latestcontainer_name: alistvolumes:- ./etc/alist:/opt/alist/data# 比如我要挂载/home,如果在docker里先挂载,是没法办法映射到linux系统下的/home的- /ho…...
Emmet常用语法总结
Emmet常用语法总结 子元素:>兄弟元素:上级元素:^倍数:*分组:()属性:[]id和类:# .迭代数字:$文本内容:{}注意事项 Emmet是许多流行文本编辑器的…...
Android 12系统源码_页面管理(四)获取系统当前最上层的Activity信息
前言 很多应用开发人员,在日常开发过程中,经常会遇到一些需求,例如需要知道当前最上层的Activity是哪个,并结合这个Activity的名称来完成一些特定场景的需求。最简单的方法,是在创建Activity的时候将该Actvity存储到一…...
RK3588开发板Ubuntu与开发板使用U盘互传
1 将 U 盘(U 盘的格式必须为 FAT32 格式,大小在 32G 以下)插到开发板的 usb 接口,串口打印信息如下所示,U 盘的设备节点是/dev/sdb4。U 盘的设备节点不是固定的,根据实际情况来查看设备节点。 2 输入以下命令挂载 U 盘,…...
【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“
帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达,1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…...
TCP/IP网络模型
大家好我是苏麟 , 今天聊聊TCP/IP四层网络模型 . 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 应用层 最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都…...
github连不上
github连不上 错误提示解决方案steam 采用Hosts加速 错误提示 fatal: unable to access ‘https://github.com/Ada-design/qianduan.git/’: Failed to connect to github.com port 443 after 21073 ms: Couldn’t connect to server 解决方案 下载steam https://steampp.ne…...
Excel计算表达式的值
Excel如何求解表达式 其中第三种方法最简单,通过剪贴板实现 如,单元格A1中输入了 12345 然后在A2输入 “”&A1 然后复制A2,打开剪贴板,点击刚才复制的内容,就会在A2显示计算结果...
26元/月起!腾讯云一键自动搭建4核16G幻兽帕鲁服务器
腾讯云无需任何配置自动搭建幻兽帕鲁游戏联机服务器,游戏24小时在线,4核16G游戏联机服务器低至26元/月起,新手小白也能一键搭建属于自己的幻兽帕鲁游戏联机服务器! 第一步:购买游戏联机服务器 购买入口:htt…...
【C++游戏开发-01】推箱子
C游戏开发 文章目录 C游戏开发[TOC](文章目录) 前言一、逻辑分析1.1地图实现1.2人物的移动1.2.1小人移动1.2.2其他移动 1.3墙壁的碰撞1.4箱子的推动1.4.1什么时候推箱子1.4.2什么情况可以推箱子 1.5胜利的判断1.6卡关的处理1.7关卡的切换 二、DEMO代码2.1游戏框架2.2各功能函数…...
【lesson26】学习MySQL事务前的基础知识
文章目录 CURD不加控制,会有什么问题?CURD满足什么属性,能解决上述问题?什么是事务?为什么会出现事务事务的版本支持 CURD不加控制,会有什么问题? CURD满足什么属性,能解决上述问题&…...
持续积累分享金融知识
持续积累分享金融知识 一、什么是两融余额?二、什么是量化?三、散户可以进行量化投资么? 一、什么是两融余额? 两融余额是指投资者在融资买入和融券卖出交易中,通过向券商借入资金或证券进行交易,并且在交…...
网络协议 UDP协议
网络协议 UDP协议 在之前的文章中有对UDP协议套接字的使用进行讲解,本文主要对UDP协议进行一些理论补充。 文章目录 网络协议 UDP协议1. 概念2. UDP协议格式2.1 数据报长度2.2 校验和/检验和2.2.1 CRC校验2.2.2 MD5算法 1. 概念 UDP,即User Datagram P…...
爬虫笔记(三):实战qq登录
咳咳,再这样下去会进橘子叭hhhhhh 以及,这个我觉得大概率是成功的,因为测试了太多次,登录并且验证之后,qq提醒我要我修改密码才可以登录捏QAQ 1. selenium 有关selenium具体是啥,这里就不再赘述了&#x…...
又涨又跌 近期现货黄金价格波动怎么看?
踏入2024年一月的下旬,现货黄金价格可以说没了之前火热的状态,盘面上是又涨又跌。面对这样的行情,很多投资者不知道如何看了。下面我们就来讨论一下怎么把握近期的行情。 先区分走势类型。在现货黄金市场中有两种主要的走势类型,一…...
软件压力测试:探究其目的与重要性
随着软件应用在各行各业中的广泛应用,确保软件在高负载和极端条件下的稳定性变得至关重要。软件压力测试是一种验证系统在不同负载条件下的性能和稳定性的方法。本文将介绍软件压力测试的目的以及为什么它对软件开发和部署过程至关重要。 验证系统性能的极限&#x…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
