密码学(二)
文章目录
- 前言
- 一、Certificate Authorities
- 二、Key Agreement Protocols
前言
本文来自 Intel SGX Explained
请参考:密码学(一)
一、Certificate Authorities
非对称密钥密码学中的公钥和私钥假设每个参与方都拥有其他参与方的正确公钥。这个假设非常关键,因为非对称密钥系统的整个安全性依赖于某些操作只能由与公钥对应的私钥的所有者执行。
更具体地说,如果Eve能够让Bob相信她自己的公钥属于Alice,那么Eve可以产生似乎来自Alice的消息签名。
这种情况下,Eve可以中间人攻击的方式,截取Alice和Bob之间的通信,冒充Alice并使用自己的公钥作为Alice的公钥,然后代表Alice签署消息。
如果Bob错误地信任Eve的公钥,他可能会被欺骗,接受被篡改或伪造的消息作为来自Alice的真实通信。这可能导致各种安全风险,包括未经授权的访问、数据篡改或错误信息传播。
为了减轻这种风险,建立安全可信的机制来分发和验证公钥非常重要。这可以涉及使用由受信任的第三方实体(称为证书颁发机构或CA)颁发的数字证书,或者采用去中心化的信任模型,如信任网络,其中个人对彼此的公钥进行数字签名以建立信任。
在密码学中,认证和证书颁发机构(Certification Authority,简称CA)是负责验证身份和颁发数字证书的机构。它们在建立和维护公钥基础设施(Public Key Infrastructure,简称PKI)中起着关键作用。
密码学(一)的介绍性材料假设每个参与方通过具有完整性保证的信道传输他们的公钥。但实际上,这并不是一个合理的假设,安全分发公钥仍然是一个尚未解决的研究问题。
最广泛采用的解决公钥分发问题的方法是证书颁发机构(Certificate Authority,CA)系统,它假设存在一个受信任的机构,该机构的公钥被安全地传输给系统中的其他所有参与方。
在CA系统中,信任的根源是由一个或多个CA机构拥有的根证书。这些根证书的公钥被预先分发给参与方,以确保其可靠性。然后,CA机构可以颁发数字证书,将公钥与实体的身份信息绑定在一起,并用CA机构的私钥对数字证书进行签名。其他参与方可以使用CA机构的公钥验证数字证书的有效性和真实性。
通过使用CA系统,参与方可以相信从CA机构获得的数字证书,因为它们具有信任的根源和可验证性。这种机制解决了公钥分发的问题,确保了公钥的可靠性和身份的验证。
证书颁发机构(CA)负责安全获取每个参与方的公钥,并发行将参与方的身份(例如,“Alice”)与其公钥绑定的证书,如下图所示:
上图表明了证书是由证书颁发机构(发行者)签名的陈述,将一个主体的身份与一个公钥绑定起来。
在这个过程中,参与方需要向CA提交其公钥以进行注册。CA会验证参与方的身份,并确保其公钥的真实性和可信度。一旦验证通过,CA将发行一个数字证书,其中包含参与方的身份信息和对应的公钥。
这个数字证书包含了许多信息,如证书的颁发者(即CA的身份)、证书的持有者(即参与方的身份)、公钥以及其他元数据。为了确保数字证书的完整性和真实性,CA会使用自己的私钥对证书进行签名。其他参与方可以使用CA的公钥来验证证书的签名,从而确认证书的有效性和真实性。
一旦参与方获得了数字证书,它们可以使用证书中的公钥来进行安全通信。在加密通信中,发送方可以使用接收方的公钥加密消息,而接收方则使用自己的私钥解密消息。在数字签名中,发送方可以使用自己的私钥对消息进行签名,接收方可以使用发送方的公钥验证签名的真实性。
通过CA系统的运作,参与方可以信任其他参与方的公钥,因为它们通过由受信任的CA颁发的数字证书进行验证和确认。
总结而言,证书颁发机构(CA)负责安全地获取每个参与方的公钥,并发行将参与方的身份与其公钥绑定的数字证书。这确保了公钥的真实性和可信度,为参与方之间的安全通信提供了基础。
证书实质上是由证书发行者(通常是CA)的私钥生成的加密签名。由发行者签名的消息声明了一个公钥属于一个主体。证书消息通常包含标识符,说明证书的预期用途,例如“此证书中的密钥只能用于签署电子邮件消息”。证书消息通常还包括发行者认证策略的标识符,该策略总结了发行者采取的措施,以确保主体的公钥的真实性。
在CA系统中的一个主要问题是没有明显的方法来撤销证书。撤销机制对于处理私钥意外暴露的情况非常重要,以避免攻击者使用证书冒充被损害的主体。虽然已经开发了先进的证书撤销系统,但防止密钥被泄露的首要措施是为证书添加过期日期。
在一个CA系统中,每个参与方都会提供自己的证书和公钥。任何信任CA并已安全获取CA的公钥的参与方都可以使用下图所示的过程来验证任何证书。
上图表明了由CA颁发的证书可以被任何已安全获取CA公钥的参与方验证。如果证书有效,其中包含的主体公钥可以被信任为属于证书所标识的主体。
一个主要的缺点是CA系统中,CA的私钥成为攻击的目标。通过尽量减少对CA私钥的使用,可以在一定程度上减少其被攻击的机会。上述描述的机构成为根CA,他们的私钥仅用于生成中间CA的证书,而中间CA则负责为系统中的其他参与方生成证书,如下图所示:
上图表明了一个层次化的CA结构旨在减少根CA私钥的使用,降低其被攻击的风险。在这种结构中,根CA的私钥仅用于签署中间CA的证书。
中间CA位于根CA和最终用户之间,负责为系统中的各方(包括最终用户)发放和签署证书。中间CA拥有自己的私钥,用于签署最终用户的证书。
通过将证书签署的责任分布在多个层级的CA之间,层次化结构减少了对根CA私钥的依赖。这有助于减轻根CA私钥被攻击的风险。即使中间CA的私钥遭到攻击,也只会影响到由该中间CA签署的证书,而不会危及整个系统的安全。
在层次化的CA系统中,唯一安全分发给所有参与方的公钥是根CA的公钥。因此,当两个参与方希望进行交互时,每个参与方都必须提供自己的证书,以及颁发CA的证书。例如,给定上图中的层次结构,Alice可以通过提供她的证书以及Intermediate CA 1的证书来向Bob证明她的公钥的真实性。Bob首先使用上上图中的步骤,通过根CA的公钥验证Intermediate CA 1的证书,从而确保Intermediate CA 1的公钥的真实性。然后,Bob使用Intermediate CA 1的公钥验证Alice的证书,因为他现在信任Intermediate CA 1的公钥。
通过这个过程,Bob可以验证Alice的证书,并相信其中包含的公钥确实属于Alice。这种逐级验证的方法确保了证书链的完整性和真实性。每个参与方都需要验证对方的证书,并建立起信任关系,以确保安全通信和身份验证。
总结而言,在层次化的CA系统中,只有根CA的公钥安全地分发给所有参与方。因此,当两个参与方希望进行交互时,每个参与方都必须提供自己的证书和颁发CA的证书。通过逐级验证证书链,可以建立起信任关系,并确保通信双方的公钥的真实性和可信性。
在大多数国家,政府为其公民发放身份证,因此充当了证书颁发机构的角色。身份证是一种证书,将主体的身份(完整的法定姓名)与主体的外貌(用作公钥)绑定在一起,如下图所示:
上图表明了身份证是一种证书,将一个主体的完整法定姓名(身份)与主体的外貌特征绑定在一起,而外貌特征则充当了公钥的作用。
每个政府的身份证发放操作都受到法律的监管,因此身份证的发行日期可以用来追踪构成其认证政策的法律。此外,身份证的安全性(尚)不依赖于密码学原语。相反,身份证包括物理安全措施,旨在防止篡改和防伪。
身份证发放的过程受到法律的规范和监管。政府制定了相关法律和政策来管理身份证的发放和使用。发行日期可以反映出身份证所遵循的具体法律和政策。
此外,身份证的安全性主要依赖于物理安全措施,而非密码学原语。身份证通常包括多种物理特征和安全措施,旨在防止篡改和防伪。这些措施可能包括防伪特殊材料、水印、芯片技术、防伪标记等。物理安全措施的设计目的是使身份证更难以伪造和篡改,以保护个人身份的安全性。
二、Key Agreement Protocols
在 密码学(一)中介绍的对称密钥原语的初始设计假设,当两个参与方希望进行交互时,一方生成一个秘密密钥,并使用具有机密性和完整性保证的通信渠道与另一方共享。然而,在实际应用中,很少有预先存在的安全通信渠道可用。
密钥协商协议用于两个参与方建立共享的秘密密钥,只需要一个具有完整性保证的通信渠道。下图概述了Diffie-Hellman密钥交换(DKE)协议,该协议可以帮助读者直观地理解密钥协商协议的工作原理。
上图表明了在Diffie-Hellman密钥交换(DKE)协议中,Alice和Bob在一个共享的秘密密钥K = gAB mod p上达成一致。一个观察到gA mod p和gB mod p的对手无法计算出K。
DHE协议的基本思想是,两个通信参与者(通常是Alice和Bob)可以在公开的通信渠道上协商一个共享密钥,而无需事先共享任何秘密信息。DHE协议的安全性基于离散对数问题。
以下是DHE协议的步骤:
(1)参数生成:在协议开始之前,需要选定一组公开的参数。这些参数包括一个大素数p和一个生成元g,它们被所有通信参与者共享。
(2)密钥协商:
Alice和Bob各自选择一个私密的随机数a和b。
Alice计算公钥A = g^a mod p,并将A发送给Bob。
Bob计算公钥B = g^b mod p,并将B发送给Alice。
(3)密钥计算:
Alice收到Bob的公钥B后,计算共享密钥K = B^a mod p。
Bob收到Alice的公钥A后,计算共享密钥K = A^b mod p。
(4)密钥确认:Alice和Bob现在都拥有相同的共享密钥K,可以用于加密和解密通信。双方可以相互确认密钥的正确性,例如通过发送哈希值或其他验证信息。
DHE协议的关键优势在于即使在公开信道上进行通信,也能够协商出一个秘密的共享密钥。然而,DHE协议本身并不提供身份验证和消息完整性保护。因此,在实际应用中,通常会将DHE与数字证书和其他安全机制结合使用,以确保通信的安全性。
本文关注使用密钥协商协议构建更大系统,因此我们不会解释DKE中的数学细节,也不会证明其正确性。我们注意到Alice和Bob都派生出相同的共享秘密密钥K = gAB mod p,而不会传输K。此外,在DKE中传输的消息,即gA mod p和gB mod p,对于窃听者Eve来说是不足以确定K的,因为有效地解决gx mod p中的x是一个被认为非常困难的开放问题。
确实,密钥协商协议需要具有完整性保证的通信渠道。如果主动攻击者Eve可以篡改Alice和Bob传输的消息,她可以执行中间人攻击(MITM攻击),如下图所示:
上图表明了任何密钥协商协议都容易受到中间人攻击,如果通信渠道没有得到适当的保护。在中间人攻击中,主动攻击者可以拦截并操纵两个参与方之间的通信,冒充每个参与方以建立不同的共享密钥。
在密钥协商协议中,攻击者可以拦截Alice和Bob之间的消息,并与他们分别建立不同的共享密钥。然后,攻击者可以在Alice和Bob之间转发消息,使他们相信彼此直接进行通信。这让攻击者能够窃听通信并可能篡改消息。
此外,攻击者还可以在冒充另一个参与方的情况下向Alice或Bob发送自己的消息。这使得攻击者能够注入恶意内容、伪造消息,或者欺骗受害者执行有利于攻击者的操作。
为了降低中间人攻击的风险,必须确保通信渠道的完整性和真实性。可以通过使用数字签名或证书等技术验证通信各方的身份,并采用提供机密性和完整性保证的安全通信协议(如SSL/TLS)来实现。
在中间人攻击中,Eve拦截Alice的第一个密钥交换消息,并向Bob发送自己的消息。然后,Eve拦截Bob的回应并替换为自己的回应,发送给Alice。Eve实际上与Alice和Bob分别执行密钥交换,与他们各自建立共享密钥,而Bob和Alice都不知道Eve的存在。
在与Alice和Bob建立共享密钥之后,Eve可以选择观察Alice和Bob之间的通信,通过转发消息来实现。例如,当Alice发送消息时,Eve可以使用K1(她与Alice之间的共享密钥)对其进行解密,然后使用K2(她与Bob之间建立的密钥)对消息进行加密。虽然Bob仍然接收到Alice的消息,但Eve已经能够查看其内容。
此外,Eve可以冒充通信中的任一方。例如,Eve可以创建一条消息,并使用K2对其进行加密,然后将其发送给Bob。由于Bob认为K2是他与Alice之间建立的共享密钥,他将相信Eve的消息来自Alice。
可以通过对协议中发送最后一条消息的一方(在我们的示例中是Bob)进行身份验证,并让其对密钥协商消息进行签名来防止中间人攻击。当存在CA系统时,Bob使用他的公钥对密钥协商消息进行签名,并向Alice发送他的证书,以及任何中间CA的证书。Alice验证Bob的证书,确保证书所标识的主体是她所期望的(即Bob),并验证与她和Bob之间交换的密钥协商消息与Bob提供的签名匹配。
总之,可以使用密钥协商协议从非对称密钥签名方案中引导对称密钥原语,其中只有一方需要能够对消息进行签名。
相关文章:
密码学(二)
文章目录 前言一、Certificate Authorities二、Key Agreement Protocols 前言 本文来自 Intel SGX Explained 请参考:密码学(一) 一、Certificate Authorities 非对称密钥密码学中的公钥和私钥假设每个参与方都拥有其他参与方的正确公钥。…...
mysql进阶-视图
目录 1. 用途 2. 语法 2.1 创建或替换视图 2.2 修改视图 2.3 查看视图: 2.4 删除视图: 3. 其他 3.1 操作视图 3.2 迁移数据库 1. 用途 视图可以理解为一个复杂查询的简称,它可以帮助我们简化查询,主要用于报表查询:例如…...
力扣-34. 在排序数组中查找元素的第一个和最后一个位置
文章目录 力扣题目代码 力扣题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算…...
Cesium笔记 初始化 使用Vue-Cesium 组件
参考 A Vue 3 based component library of CesiumJS for developers | Vue for CesiumVue for Cesium, a Vue 3.x based component library of CesiumJS for GISerhttps://zouyaoji.top/vue-cesium/#/zh-CN/component/quickstart...
QTday2作业
思维导图: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数; 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断u界面上输入的账号是否为"admin",…...
scVI与MultiVI
scVI:https://docs.scvi-tools.org/en/stable/user_guide/models/scvi.html MultiVI:https://docs.scvi-tools.org/en/stable/user_guide/models/multivi.html 目录 scVI生成推理任务 MultiVI生成推理 scVI single cell variational inference提出了一个…...
java Servlet体育馆运营管理系统myeclipse开发mysql数据库网页mvc模式java编程计算机网页设计
一、源码特点 JSP 体育馆运营管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统采用serlvetdaobean,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。 java Servlet体育馆运营管理系…...
2、UML类图
UML(Unified Modeling Language)统一建模语言,用来进行设计软件的可视化建模语言。 2.1 类图概述 类类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及他们与其他类的关系等。类图是面向对象建模的主要组成部分。 2.…...
2023 年度合辑 | 出海大年的全球化产品洞察和服务动向
2023 年度合辑 年度关键词 出海&全球化 出海 & 全球化通信服务全面升维 出海大年,融云全球互联网通信云作为“全球化最佳基础设施”之一,发挥技术沉淀和实践积累带来的核心优势,结合市场变化对出海 & 全球化通信服务进行了全方位…...
python 基础笔记
基本数据类型 函数 lamda 匿名函数 成员方法 类 类与对象 构造方法 魔术方法 私有成员 私有方法 继承 注解 变量注解 函数注解 Union类型 多态 参考链接:黑马程序员python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilib…...
[原创][R语言]股票分析实战[8]:因子与subset的关系
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...
uniapp使用tcp和udp的区别和例子
在Node.js中,主要有三种socket:TCP,UDP和Unix域套接字。以下分别介绍这TCP/UDP的使用方法和示例: TCP socket TCP socket提供了可靠的、面向连接的通信流,适用于需要可靠传输的应用,例如Web浏览器的HTTP请…...
静态网页设计——个人图书馆(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)
前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1VN4y1q7cz/?vd_source5f425e0074a7f92921f53ab87712357b 源码:https://space.bilibili.co…...
APP出海需知——Admob广告变现竞价策略
越来越多的出海公司更加重视应用的广告变现,Admob因其提供丰富的广告资源,稳定的平台支持,被广泛采用接入。 Admob广告变现策略 1、bidding竞价策略 Bidding目前是Admob广泛推广的较成熟的变现方案,当竞价网络和瀑布流混合时&a…...
微服务实战系列之API加密
前言 随着一阵阵凛冽寒风的呼啸,新的年轮不知不觉滚滚而来。故事随着2023的远去,尘封于案底;希望迎着新年,绽放于枝头。在2024新岁启航,扬帆破浪之时,让烦恼抛洒于九霄,让生机蓬勃于朝朝暮暮。 …...
android apk文件的签名问题
android的APK文件实际上是一个jar文件。jar的意思是瓶、罐,那就意味着jar文件是一个用来存放android应用相关文件的容器。事实上,它也确实如此,它只是一个带或不带压缩的zip文件,当你把.apk后缀改成.zip后,就能对此进行…...
ATTCK视角下的信息收集:主机发现
目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…...
Redis 主从、哨兵和分片集群简单介绍
Redis 主从集群架构 单节点 redis 并发能力有上限,要进一步提高 redis 并发能力,就要搭建主从集群,实现读写分离 主从同步原理 Replicaition id:每台 master 机器都一个 repl_id,是数据集的表示,若 salv…...
群晖NAS+DMS7.0以上版本+无docker机型安装zerotier
测试机型:群晖synology 218play / DSM版本为7.2.1 因218play无法安装docker,且NAS系统已升级为7.0以上版本,按zerotier官网说法无法安装zerotier, 不过还是可以通过ssh终端和命令方式安装zerotier。 1、在DSM新建文件夹 用于存放zerotier脚…...
Pinia持久化存储插件 pinia-plugin-persist
1、pinia-plugin-persist 作用 pinia-plugin-persist是一个Pinia持久化存储插件,用于将Pinia状态存储到本地持久化存储中,例如localStorage或sessionStorage。 2、安装和使用pinia-plugin-persist 有时候需要把pinia中的数据持久化存储(存到…...
链家JAVA笔试题
单选题 1、在Java中下列关于自动类型转换说法正确的是( )。 A. 基本数据类型和String相加结果一定是字符串型 B. char类型和int类型相加结果一定是字符 C. double类型可以自动转换成int D. char int double “ ”结果一定是double 参考答案&am…...
当试图回复传入消息时,消息应用程序会闪烁
问题描述: Actual Results: Unable to reply for incoming message as Messaging app flickers and closes. Expected Results: User should be able to send reply for incoming messages. Reproduction Steps: Stay in home screen. Receive an incoming mes…...
Hubery-个人项目经历记录
研究生期间很有幸的进入到了崔老师的组,从此也就进入到了分析人体生理信号的领域,充满挑战的同时也充满了乐趣。借着CSDN整理一下近几年来参与的项目,这里蕴含着我各种美好的回忆,也作为一个展示自己的平台吧。博客中很多结果只给…...
Ubuntu18.04 安装 qt 5.15.2
一.安装qt 1.下载 在线安装包 使用国内镜像源在线安装QT(2023.3.25更新)_qt国内镜像-CSDN博客 2.安装 (1)QT库安装: 注意:我安装时 勾选 Qt Design studio 会导致报错,直接不勾选。 注意:Qtcreator 无…...
【Linux Shell】6. echo 命令
文章目录 【 1. 显示普通字符串 】【 2. 显示转义字符 】【 3. 显示变量 】【 4. 显示换行 】【 5. 显示不换行 】【 6. 显示命令执行结果 】 Shell 的 echo 指令用于字符串的输出。命令格式: echo string【 1. 显示普通字符串 】 #!/bin/bashecho "It is a …...
Dell 机架式服务器 - 高级定制服务
Dell 机架式服务器 - 高级定制服务 1. Dell Technologies2. 机架式服务器 - 高级定制服务2.1. Servers & Storage (服务器及存储) -> Servers2.2. Rack Servers (机架式服务器)2.3. Shop2.4. PowerEdge Rack Servers (PowerEdge 机架式服务器)2.5. PowerEdge R760 Rack …...
C++ 中关键字 Static
1、什么是static? static 是C中很常用的修饰符,它被用来控制变量的存储方式和可见性。由关键字static修饰类中成员,成为类的静态成员。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。静态…...
系统学习Python——警告信息的控制模块warnings:警告过滤器-[重写默认的过滤器]
分类目录:《系统学习Python》总目录 Python应用程序的开发人员可能希望在默认情况下向用户隐藏所有Python级别的警告,而只在运行测试或其他调试时显示这些警告。用于向解释器传递过滤器配置的sys.warningoptions属性可以作为一个标记,表示是否…...
C++力扣题目-- 二叉树层序遍历
102.二叉树的层序遍历(opens new window)107.二叉树的层次遍历II(opens new window)199.二叉树的右视图(opens new window)637.二叉树的层平均值(opens new window)429.N叉树的层序遍历(opens new window)515.在每个树行中找最大值(opens new window)116.填充每个节点的下一个右…...
前端实现回车键触发搜索
前端实现回车键触发搜索 前言实现方法1. html里可以用 form 来实现2. 非form中的input 前言 搜索框是个常见的功能,除了用现有的ui组件库,有的时候必须要自己封装,所以涉及到点击按钮搜索和回车搜索都要实现 实现方法 1. html里可以用 for…...
wordpress 网站标题图/竞价排名
Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator 2.0中。Cookie其实就是由Web服务器创建的、将信息存储在计算机上的文件。那么为什么Web服务器要在客户机上面创建如此文件?这是因为当客户机发送一个请求到WEB服务器时(譬如准备…...
wordpress api文章列表接口/南通百度seo代理
Github项目地址:https://github.com/feser-xuan/Arithmetic.git1、需求分析软件基本功能要求如下:程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。为了让小学…...
微信网站如何做/网站建设报价
1、磁盘的概念、软盘和硬盘 要记住一点,我们用电脑处理的信息都是保存在磁盘里的。那您知道在磁盘上的什么地方吗?要想搞清楚这个问题,我们得从头说起。计算机的存储器有两类,一类是内部存储器,一断电就会把记住的东…...
淘宝客怎么做网站/山东百搜科技有限公司
ThroughRain第一次冲刺总结 团队名:ThroughRain 项目确定:《餐厅到店点餐系统》 项目背景:本次项目是专门为餐厅开发的一套订餐系统。大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座位&…...
以就业为导向的高职计算机专业网站设计/seo怎么做优化工作
本文转载至http://www.cnblogs.com/mantgh/p/4276440.html 分享功能目前几乎已成为很多app的标配了,其中微信,微博等app的图片分享界面设计的很棒,不仅能够展示缩略图,还可以预览删除。最近我在做一款社交分享app,其中…...
红河个旧网站建设/2019年度最火关键词
本周,Android 11 Beta正式推送,第一时间,Pixel 2系列及以上“亲儿子”机型率先达成升级。不过,紧接着,多款国产安卓手机也宣布开放或即将开放升级,经不完全统计,目前已经有小米10、小米10 Pro、…...