江苏外贸型网站制作/百度一下首页百度
CA与区块链验证本质上都是数字签名,首先,我们看一下什么是数字签名!
数字签名
数字签名是公钥密码学中的一种技术,用于验证信息的完整性和发送者的身份。简而言之,数字签名是一种确认信息来源和信息完整性的手段。它通常与区块链、数字证书、加密邮件等技术结合使用。
基本工作原理
核心要点:信息完整性与身份认证!数字签名的基本工作原理如下:
消息摘要:首先,使用某种哈希函数(如SHA-256)计算原始消息(或文档)的摘要(digest)。
摘要是消息的哈希值,是通过某种哈希函数(如SHA-256)从原始消息中产生的。哈希函数的特点是,哪怕只有一点点的输入变化,输出的哈希值也会发生巨大的变化。因此,哈希值可以作为消息的“指纹”。
加密摘要:然后,使用发送者的私钥加密上一步得到的摘要。这就得到了数字签名。
发送消息及签名:发送者将原始消息和数字签名一起发送给接收者。
验证签名:
- 接收者使用发送者的公钥解密数字签名,得到摘要A。
- 接收者使用相同的哈希函数计算收到的原始消息的摘要,得到摘要B。
- 比较摘要A和摘要B。如果它们匹配,这意味着消息没有被篡改。
为什么接收者能够知道发送者用的哈希函数呢?
标准化协议:在许多安全协议中,哈希函数(如SHA-256、SHA-3等)已经被明确规定。因此,当双方遵循同一协议时,他们都知道应使用哪个哈希函数。
数字证书:在使用数字证书的场景中(如TLS/SSL),证书中通常会包含用于签名的哈希函数的信息。当接收者收到证书时,它就可以知道应使用哪个哈希函数来验证签名。
明确声明:在某些情况下,发送者可以在消息的某个部分明确指定使用的哈希函数。这样,接收者在收到消息时就知道如何进行验证。
总之,为了数字签名的有效性和安全性,双方必须有一个共同的、已知的方式来确定使用哪个哈希函数。在大多数现实世界的应用中,这一点已经得到了很好的处理和规定。
数字签名的关键作用
- 身份验证:数字签名确保了交易的发送者是交易所声称的发送者。
- 不可否认性:一旦发送者签署了交易,他们不能否认进行了该交易。
- 完整性:任何对已签名的交易的修改都会导致签名无效,这确保了交易的完整性。
为什么数字签名是安全的?它的安全性来自于私钥的秘密性和公钥密码学的数学属性。私钥是只有发送者知道的,而公钥是可以公开分享的。没有私钥,就不能生成一个与给定公钥匹配的有效签名,这确保了只有私钥的持有者才能创建有效的签名。
中间人攻击
关于中间人攻击:
中间人攻击者确实可以使用发送者的公钥来解密数字签名得到摘要A。但是,攻击者不能使用公钥来创建一个新的有效签名,因为创建数字签名需要发送者的私钥,这是攻击者不知道的。
如果攻击者修改了消息,那么摘要(哈希值)自然会发生变化。这意味着,即使攻击者能够生成新的摘要,他们还需要使用发送者的私钥加密新摘要以产生一个新的数字签名。由于攻击者没有私钥,他们无法这样做。
因此,接收者在验证过程中会发现摘要A(从数字签名解密得到)与摘要B(从修改后的消息计算得到)不匹配,从而知道消息已被篡改。
即:任何人都可以得到摘要A和摘要B,但是如果没有发送者的私钥,就无法生成正确的数字签名(中间人用自己的私钥生成数字签名有个卵用,接收者又不用中间人的公钥验证)。所以,中间人只能修改信息,但是不能修改数字签名。
转眼中间人又把没法修改的数字签名(没有私钥,中间人是无法完美修改的)和修改后的信息给到了接收方,接收方首先通过发送者的公钥解密数字签名得到摘要A,又使用哈希函数包装中间人修改后的信息,得到摘要B'。
因为哈希函数即使只有一点点的输入变化,输出的哈希值也会发生巨大的变化,所以摘要B'和原本正确的、应该和摘要A的值相等的摘要B差别巨大,而接收方就是看摘要AB是否相同,现在变成了验证摘要AB'是否相同,很明显已经不同了,所以接收方能快速明白:
1. 经过数字签名的验证得到摘要A,该信息能够通过A的公钥解密,生成合理的有意义的摘要。说明该信息确实是来自于发送方,验证了发送方的身份。
2. 两种过程产生的摘要信息不同,说明发送过来的原始数据已经不完整不正确了,有可能受到中间人的干扰。
据此,我们说到数字签名和消息的验证,有两个主要的步骤:
-
验证发送者的身份:这是通过数字签名完成的。只有发送者的私钥能产生一个可以由其公钥解密的数字签名。如果攻击者没有私钥,他们无法为任何消息生成有效的签名。所以,当接收者使用公钥成功解密了数字签名并得到了摘要A,这验证了消息是从拥有私钥的发送者处发出的。
-
验证消息的完整性:这是通过比较两个摘要来完成的。
- 摘要A是从数字签名解密得到的,它是基于发送者发送的原始消息生成的。
- 摘要B是接收者从他们收到的消息计算其哈希得到的。
如果攻击者修改了消息,他们可以很容易地为这个修改后的消息计算出新的摘要B'(使用哈希函数就可以,发送者也是通过哈希函数生成摘要的,只不过数字签名是进一步使用私钥加密)。但问题是,这个摘要B'不会与摘要A匹配(除非攻击者同时拥有发送者的私钥,并且为修改后的消息创建了新的数字签名,这在实际应用中是极不可能的情况)。因此,接收者仍然可以检测到消息被篡改的事实。
只要有发送者的私钥,中间人就可以篡改信息?
理论上,如果攻击者获得了发送者的私钥,那么他们可以对任何消息进行签名,从而伪装成该发送者。这意味着攻击者可以:
- 生成一个篡改后的消息。
- 使用发送者的私钥为这个篡改后的消息创建一个数字签名。
- 将篡改后的消息和新的数字签名发送给接收者。
在这种情况下,当接收者进行验证时:
- 使用发送者的公钥,接收者可以解密数字签名并获得摘要。
- 接收者还会对篡改后的消息生成一个摘要。
- 由于这两个摘要是匹配的,接收者可能会认为这个篡改后的消息确实来自原始发送者。
因此,确实,如果攻击者获得了私钥,他们可以篡改消息并伪造有效的数字签名,从而欺骗接收者。
这就是为什么私钥的安全性非常关键,为什么它必须被严格保护。在实际应用中,私钥往往被存储在安全的环境中,如硬件安全模块(HSM),或使用其他加密手段进行保护,以防止未经授权的访问。
如果私钥被认为是丢失或被盗,应立即撤销相应的公钥证书,并生成一个新的公私钥对。这确保即使私钥落入错误的手中,它也不能被用于伪造签名。
作者思考
作者学到这里的时候,其实认为不需要比较摘要。原因是:如果中间人有私钥,那么数字签名被篡改,摘要AB都可以被轻松修改成新的值,并且相等,比较摘要也比较不出来;如果中间人没有私钥,他就不能生成一个合法的签名,解密后的结果也将是无意义的,也不用通过比较摘要得出结论。
是不是看上去很有道理?!其实作者并没有理清第二种情况,上面的想法是错误的!!
作者搞错了 “中间人没有私钥” 的情况,实际上,没有私钥,中间人未必不能生成正确的签名,他可以完全不修改签名啊!请读者明确一点:发送者传递的是原始信息和数字签名,如果对于数字签名,中间人一点都不改,但他修改了原始信息,这时,倘若没有摘要比较,那么接收者的行为会是什么样呢?下面我们综合比较讲解一下:
-
中间人没有私钥,但尝试篡改消息:
-
传递虚假消息与正确的签名:这种情况下,虽然签名是对原始消息的正确签名,但由于消息已被篡改,所以当接收者对篡改后的消息计算哈希得到新的摘要,并与签名解密得到的摘要进行比较时,会发现它们不匹配。因此,接收者可以确定消息已被篡改。如果不比较摘要,接收者可能会认为这是一个有效的、未被篡改的消息,这是不安全的。
-
如果只依赖数字签名的解密,那么在这种情况下,接收者可能会误以为消息是有效的。因为实际上传递的签名中不包含所有的信息,只有摘要。签名正确,不意味着你额外传递的原始信息正确,除非将原始信息叶转换成摘要,和签名转换的摘要对比,才能验证原始信息正确,所以这种情况下摘要比较是必要的。
-
-
传递虚假消息与错误的签名:这种情况下,由于签名是错误的,当接收者尝试用公钥解密它时,解密后的结果将不是有效的摘要格式。即使解密操作可以完成,得到的结果与任何有效的摘要都不会匹配。此外,当接收者对篡改后的消息计算哈希得到新的摘要,并与签名解密得到的摘要进行比较时,会发现它们不匹配。因此,接收者会知道消息已被篡改。
-
当接收者使用公钥对错误的签名进行解密时,得到的结果确实不会是一个有效的摘要,这时就已经能够确定消息或签名被篡改了。因此,确实没有必要再进行摘要比较。
-
-
-
中间人有私钥:这是一种非常罕见的情况,因为私钥应当被妥善保管,不应落入他人之手。但如果这确实发生了,那么中间人确实可以伪造任何消息,并为其创建有效的签名。这种情况下,数字签名和摘要验证的确都会失效。这也是为什么私钥的安全性是如此重要的原因。
-
“消息正确、签名错误”的情况通常不会发生。
比较摘要的意义(了解)
系统的健壮性:摘要比较提供了一个另外的安全层。这在系统设计中是一个常见的原则,即不完全依赖一个安全机制(数字签名),而是使用多重机制。这可以抵御未知的攻击和缺陷。
误操作或传输错误:在数字签名有效的情况下,消息在传输过程中可能会受到损坏,如因网络问题、存储问题等。通过比较摘要,可以验证消息的完整性。
旧的或延迟的消息:攻击者可能会重放旧的消息。虽然这些消息的数字签名是有效的,但它们可能不再是最新或者相关的。通过比较摘要,可以检查消息是否是最新的。
确认发送者的真实意图:比如,攻击者可能会截获一个有效的、签名过的消息,然后将它发送给另一个不相关的接收者。尽管数字签名是有效的,但消息可能不是发送者打算发送给这个特定接收者的。通过比较摘要,可以确保消息是发送者打算发送的。
未来证明:摘要比较也为未来可能出现的新的攻击或漏洞提供了保护。尽管现有的签名算法可能是安全的,但未来可能会发现它的弱点。摘要的存在和验证提供了一个额外的安全层,使得对消息的完整性和来源的验证更加严格。
现在我们对误操作或传输错误进行学习:
误操作或传输错误
发送过程:
- Alice想向Bob发送一个简单的消息:"Hello"。
- Alice首先对这个消息进行哈希,得到一个摘要,例如(为了简化,假设摘要只是消息的第一个字母):摘要 = "H"。
- Alice使用她的私钥对摘要进行加密,得到数字签名。
- 然后,Alice将消息:"Hello" 和数字签名一起发送给Bob。
传输过程中的错误:
- 在传输过程中,由于网络故障、软件错误或其他原因,消息的某个部分被误改。假设,由于这种错误,Bob收到的消息变成了:"Hellp",而不是原始的"Hello"。
Bob的验证过程:
- Bob首先使用Alice的公钥解密数字签名,得到摘要A,这个摘要是"H"。
- 然后,Bob对他收到的消息"Hellp"进行哈希,得到一个摘要B,这个摘要是"P"(因为我们假设摘要只是消息的最后一个字母)。
- Bob比较摘要A和摘要B,发现它们不匹配("H"不等于"P")。
因此,Bob知道他收到的消息已经在传输过程中被更改或损坏了。
- 如果Bob只解密数字签名,他会得到一个摘要。这个摘要是原始消息的摘要,但由于消息已经被修改,这个摘要不能与当前消息匹配。
- 如果Bob没有使用哈希函数再次对收到的消息进行哈希,他将无法知道消息已经被修改。只有当他使用哈希函数对收到的消息进行哈希并将其与解密的摘要进行比较时,他才会发现摘要不匹配。
此外,也请大家明确一点:
当接收到的消息出现错误或与数字签名不匹配时,这种不匹配可能是由于多种原因引起的:
- 中间人攻击:恶意的第三方可能已经修改了消息内容,试图篡改或伪造消息。
- 消息传输错误:在数据传输过程中,由于网络问题或其他因素,消息可能出现了误差。这可能是由于噪声、数据包丢失或数据包顺序错乱等原因引起的。
- 软件或硬件故障:发送或接收消息的设备可能出现了故障,导致消息被误改。
当数字签名验证失败时,我们只知道消息与原始签名不匹配,但我们不能确定是上述哪种情况导致的不匹配。因此,数字签名机制确实不能单独确定消息的不匹配是由于哪种原因引起的。
这也是为什么在实际的安全通信中,我们不仅依赖数字签名,还会使用其他机制,如错误检测和纠正代码、时间戳、证书、双向认证等,以提高消息的完整性、认证性和非否认性。
总而言之,数字签名只能确认消息与原始签名是否匹配。如果不匹配,数字签名不能告诉我们为什么不匹配,是由于中间人攻击、传输错误、还是其他原因。所以,虽然数字签名提供了数据完整性和身份验证,但在实际应用中,为了增强安全性,通常还需要结合其他安全措施和机制。
如何防止中间人篡改数字签名?
关于防止中间人攻击和消息篡改,以下是一些方法:
使用安全的通信协议:例如,使用TLS/SSL来加密传输中的数据。这确保了数据的机密性和完整性,并验证了双方的身份。
数字证书和CA(证书颁发机构):数字证书包含公钥及其所有者的信息,并由受信任的第三方(即CA)签名。接收者可以验证数字证书的有效性来确定公钥的真实性和合法性,从而避免中间人攻击。
时间戳和过期时间:为消息或签名添加时间戳可以防止重放攻击,确保消息在特定的时间窗口内是有效的。
使用多重签名:在某些情况下,一个操作可能需要多方的批准。通过要求多个数字签名,可以增加系统的安全性。
数字签名在区块链中的应用
数字签名在区块链技术中起到了核心的作用,特别是在确保交易的完整性和不可否认性方面。在区块链中,不是保存上一个区块的公钥,而是保存上一个区块的哈希值。下面将详细解释区块链中的数字签名机制:
-
数字签名的基本原理:
- 当某人想在区块链上发送一个交易时,他们首先创建一个交易的描述,这通常包括发送者的地址、接收者的地址、金额等信息。
- 发送者使用他们的私钥对这个交易描述进行签名,生成数字签名。
- 交易(包括交易描述和数字签名)被发送到网络,并由网络中的其他参与者(例如比特币中的矿工)验证。
-
交易的验证:
- 网络中的验证者使用发送者的公钥来验证数字签名。如果签名验证通过,这意味着交易确实来自声称的发送者并且没有被篡改。
- 另外,验证者还会检查发送者是否拥有足够的资金来完成交易。
-
区块的创建:
- 一旦交易被验证,它会被放入待打包的交易池。
- 矿工或验证者将这些交易打包成一个新的区块。
- 新区块包含了这些交易的信息以及前一个区块的哈希值(而不是公钥)。这种链接方式确保了所有区块的连续性和不可更改性。
-
区块的添加:
- 新创建的区块会被添加到区块链上,成为链的一部分。
- 一旦区块被添加到链上,其中的交易就被认为是已确认的,并且难以更改。因为要更改一个区块中的信息,你不仅需要更改那个区块,还需要更改它之后的所有区块,这在计算上是非常困难的。
数字签名确保了区块链上的每个交易的真实性和完整性。同时,通过将每个新区块链接到前一个区块的哈希值,确保了区块链的不可更改性和安全性。
总之,数字签名和哈希函数都是区块链安全性的基石。数字签名确保交易的真实性,而哈希函数通过连续链接每个区块来确保整个链的不可更改性。
数字签名在信息安全证书中的作用
信息安全的证书,尤其是X.509证书,是在许多安全应用中使用的,包括SSL/TLS、电子邮件加密和身份验证。这些证书为公钥加密提供了一个框架,允许实体证明自己的数字身份,确保数据的完整性和机密性。
以下是关于X.509证书的详细介绍:
X.509证书的结构
- 版本号:表示证书的版本。
- 序列号:证书的唯一标识符。
- 签名算法标识:用于签名证书的算法。
- 颁发者:签发证书的证书颁发机构(CA)的名称。
- 有效期:证书的有效开始日期和结束日期。
- 主题:证书持有者的名称。
- 公钥信息:持有者的公钥及其相关信息。
- 扩展(可选):关于证书的其他信息。
- 数字签名:由CA的私钥生成的签名。
证书的颁发
- 当实体(可以是个人、组织或设备)需要证书时,它会生成一个公钥和私钥对,然后创建一个证书签名请求(Certificate Signing Request, CSR),这个请求通常包括公钥、实体的名称(例如网站的域名)和其他相关信息,这个CSR会发送给CA。
- CA验证实体的身份信息,然后生成一个证书,将实体的公钥和其他信息利用哈希函数(通常是SHA256)计算得到的摘要打包进去,并使用CA的私钥签名。
- 这个数字签名会与原始的公钥和其他信息一起被打包成一个X.509证书,然后返回给请求的实体。实体现在有了一个由CA签发的证书,并可以用它证明自己的身份。
证书的验证
- 当某个实体(例如,一个网站)向另一个实体(例如,一个浏览器)呈现其证书时,接收者可以使用CA的公钥来验证证书的签名。验证过程如下;
- 验证证书的实体(浏览器)会使用CA的公钥解密证书中的数字签名,得到摘要。
- 同时,浏览器会对证书中的公钥和其他信息生成一个新的摘要。
- 如果这两个摘要匹配,证书就被认为是有效的,这意味着它确实是由CA签发的,并且没有被篡改。
- 也就是说,验证证书就是数字签名验证数据完整性的过程。数字签名验证中,对原始信息计算得到摘要;在证书验证中,原始信息包括实体网站的公钥和其他信息。
- 如果签名验证成功,这证明证书是由受信任的CA签发的,因此接收者可以信任证书中的公钥。
证书的有效期和算法更新
- 证书有一个有效期,通常为一年或几年。这是为了安全考虑,确保即使私钥被泄露,它也不会被长时间地滥用。
- 随着时间的推移,加密算法可能会因为数学进展或计算能力的增强而变得不安全。当这发生时,证书需要使用新的、更安全的算法重新颁发。这就是证书需要定期更新,以及为什么证书的内容(如签名算法)可能会改变的原因。
CA层次结构
CA(证书颁发机构)层次结构是一个分层的体系,用于在安全和可信任的方式中管理和颁发数字证书。在这种层次结构中,各级的CA具有不同的角色和责任,它们彼此之间存在信任关系。以下是关于CA层次结构的详细解释:
根CA(Root CA)
- 根CA位于CA层次结构的最顶部。它是最受信任的实体,因为它为整个证书信任链提供基础。
- 根CA自签名其证书,意味着它的证书不是由其他CA签发的。
- 根证书通常具有很长的有效期,例如10年或20年。
- 当浏览器或操作系统预装了一个根证书,意味着它们信任该根CA及其签发的所有下级证书。
中间CA(Intermediate CA)
- 中间CA位于根CA和最终实体(如网站或个人)之间。
- 中间CA的证书是由上一级CA(可能是另一个中间CA或根CA)签发的。
- 使用中间CA可以提供更多的灵活性和安全性。例如,如果中间CA的私钥被泄露,只需要吊销该CA的证书,而不需要吊销整个层次结构的证书。
- 中间CA也可以用于组织内部的分部门或分功能管理,或者用于特定的业务或地理区域。
最终实体CA(End-entity CA)或叶证书(Leaf Certificates)
- 这些是实际被用于服务器、客户端或个人的证书。
- 它们是由中间CA或根CA签发的。
- 这些证书具有相对较短的有效期,例如1年或2年。
在实际应用中,当我们访问一个使用SSL/TLS的网站时,网站不仅会提供自身的证书,而且还会提供一个证书链。这个链从根证书开始,通过一个或多个中间证书,最终到达网站的证书。您的浏览器或操作系统会验证这个证书链,确保每个证书都是由其上级签发的,并且检查证书是否被吊销或过期。CA层次结构提供了一种分层的方法来管理和验证数字证书。这种结构使得数字证书系统既有灵活性又有安全性。
信任链(Trust Chain)
- 当客户端(例如,一个浏览器)接收到证书链时,它会尝试构建一个从受信任的根证书到服务器证书的路径。这就是信任链。
- 为了验证这个链,客户端首先检查第一个证书(服务器证书)是否是由第二个证书(中间CA)签发的,然后检查第二个证书是否是由第三个证书签发的,以此类推,直到达到一个预先知道和信任的根证书。
- 如果客户端可以成功地验证这个链,那么它就会信任服务器证书。
对于客户端来说,它接收到的是一个证书链,但它试图建立的是一个信任链。简而言之,证书链是服务器提供给客户端的,而信任链是客户端基于这个证书链和它本地受信任的根证书存储来建立的。
相关文章:

CA与区块链之数字签名详解
CA与区块链验证本质上都是数字签名,首先,我们看一下什么是数字签名! 数字签名 数字签名是公钥密码学中的一种技术,用于验证信息的完整性和发送者的身份。简而言之,数字签名是一种确认信息来源和信息完整性的手段。它通…...

一文解读如何应用 REST 对资源进行访问?
文章目录 一、REST 简介二、涉及注解2.1 RequestMapping2.2 PathVariable2.3 RestController2.4 GetMapping、PostMapping、PutMapping、DeleteMapping补充:PathVariable、RequestBody、RequestParam 区别与应用 三、REST风格案例 一、REST 简介 REST (Representat…...

使用JAVA发送邮件
这里用java代码编写发送邮件我采用jar包,需要先点击这里下载三个jar包:这三个包分别为:additionnal.jar;activation.jar;mail.jar。这三个包缺一不可,如果少添加或未添加均会报下面这个错误: C…...

【JavaEE】_servlet程序的编写方法
目录 1. 创建项目 2. 引入依赖 3. 创建目录结构 3.1 在main目录下创建一个webapp目录 3.2 在webapp目录下创建一个WEB-INF目录 3.3 在WEB-INF目录下创建一个web.xml文件 3.4 在web.xml中进行代码编写 4. 编写代码 4.1 在java目录下创建类 4.2 打印"hello world&…...

美国市场三星手机超苹果 中国第一属华为
报告显示,截至5月份的三个月,iOS系统在美国、澳大利亚以及日本表现不俗。Android系统份额则在英国、德国以及法国实现增长。在中国城市地区,iOS份额同比基本持平,而Android份额则达到80.5%,同比增长1个百分点。 三星在…...

nodejs+vue+elementui医院挂号预约管理系统4n9w0
前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install Express 框架于Node运行环境的Web框架, 开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具ÿ…...

调试技巧(课件图解)
...

react中获取input输入框内容的两种方法
一.通过event对象信息的方式 <input onChange{(e)>this.inputChange(e)}/> <button onClick{()>this.getInputValue} >获取input的值</button>inputChange(e){alert(e.target.value)this.setState({username:e.target.value}) } getInputValue(){aler…...

Linux基础—1
1、命令行 1) 重要快捷键 按键作用Tab命令补全Ctrl强行终止当前程序Ctrld键盘输入结束或退出终端Ctrls暂停当前程序,暂停后按下任意键恢复运行Ctrlz将当前程序放到后台运行,恢复到前台为命令fgCtrla将光标移至输入行头,相当于Home键Ctrle将…...
十个面试排序算法
一、 前言 最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景…...

技术学习群-第四期内容共享
本期是技术群聊的第四期。还是那句话,《群聊免费进入》。一起来看看本期分享内容。 uiautomator-Error问题 在使用u2的过程中,有时候需要使用到uiautomator这个工具来进行查阅层级。但是博主遇到了这么个问题。 《问题分析》:发生此问题的原因…...

冒泡排序/鸡尾酒排序
冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次交换相邻元素的位置来实现排序。它的基本思想是从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序错误,则交换它们的位置。重复进…...

代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接:309.最佳买卖股票时机含冷冻期 文章链接 状态:有…...

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全
作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖…...

qt qtabwidget获取当前选项卡的所有按键
要获取当前选项卡中的所有按键,可以通过以下步骤进行: 通过currentIndex()函数获取当前选项卡的索引。 使用widget()函数获取当前选项卡的QWidget。 连接QWidget的keyPressEvent事件,并在事件处理函数中获取按下的按键信息。 下面是示例代…...

为什么Excel插入图片不显示,点击能够显示
很久没有Excel了,今天在做Excel表格时,发现上传图片后不能显示,但是点击还是能够出现图片的 点击如下 点击能看到,但是不显示? 最后发现只需鼠标右键点击浮动即可显示...

使用Python创建faker实例生成csv大数据测试文件并导入Hive数仓
文章目录 一、Python生成数据1.1 代码说明1.2 代码参考 二、数据迁移2.1 从本机上传至服务器2.2 检查源数据格式2.3 检查大小并上传至HDFS 三、beeline建表3.1 创建测试表并导入测试数据3.2 建表显示内容 四、csv文件首行列名的处理4.1 创建新的表4.2 将旧表过滤首行插入新表 一…...

qml基础语法
文章目录 基础语法例子 属性例子 核心元素元素item RectangleText例子 Image例子 MouseArea例子Component(组件)例子简单变换例子 定位器ColumnRowGridFlowRepeater 布局InputKeys 基础语法 QML是一种用于描述对象如何相互关联的声明式语言。 QtQuick是…...

数据结构 - 2(顺序表10000字详解)
一:List 1.1 什么是List 在集合框架中,List是一个接口,继承自Collection。 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示: Iterable也是一个接口,Iterabl…...

05在IDEA中配置Maven的基本信息
配置Maven信息 配置Maven家目录 每次创建Project工程后都需要设置Maven家目录位置,否则IDEA将使用内置的Maven核心程序和使用默认的本地仓库位置 一般我们配置了Maven家目录后IDEA就会自动识别到conf/settings.xml配置文件和配置文件指定的本地仓库位置创建新的P…...

基于IDEA 配置Maven环境和JDK版本(全局)
1.首先启动IDEA,进去初始界面 选择 Customize 之后,选择 All settings 2. 选择下图中的列表配置 3. 找到Maven下的Runner, 配置JRE的版本,选择自己下载使用的jdk的版本即可 4.最后配置Compiler 下的 Java Compiler 选择自己的jdk版本号&am…...

mysql数据库 windows迁移至linux
1.打开navicat,选择一个数据库进行操作: 之后文件会保存为一个xxx.sql文件,之后打开xftp,把生成的sql放进一个文件夹中(/home/dell/linuxmysql): 之后登录mysql数据库,并创建一个新的数据库,然后…...

P4491 [HAOI2018] 染色
传送门:洛谷 解题思路: 写本题需要知道一个前置知识: 假设恰好选 k k k个条件的方案数为 f ( k ) f(k) f(k);先钦定选 k k k个条件,其他条件无所谓的方案数为 g ( k ) g(k) g(k) 那么存在这样的一个关系: g ( k ) ∑ i k n C i k f ( i ) g(k)\sum_{ik}^nC_{i}^kf(i) g(k)…...

12096 - The SetStack Computer (UVA)
题目链接如下: Online Judge 这道题我一开始的思路大方向其实是对的,但细节怎么实现set到int的哈希没能想清楚(没想到这都能用map)。用set<string>的做法来做,测试数据小的话答案是对的,但大数据时…...

Pygame中将鼠标形状设置为图片2-1
在Pygame中利用Sprite类的派生类将鼠标形状设置为图片,其原理就是将Sprite类的派生类对应图片的位置设置为鼠标的当前位置即可。其效果如图1所示。 图1 将鼠标设置为图片 从图1可以看出,鼠标的形状变为红色的,该红色的随着鼠标的移动而移动&…...

Vue3 + Nodejs 实战 ,文件上传项目--实现图片上传
目录 技术栈 1. 项目搭建前期工作(不算太详细) 前端 后端 2.配置基本的路由和静态页面 3.完成图片上传的页面(imageUp) 静态页面搭建 上传图片的接口 js逻辑 4.编写上传图片的接口 5.测试效果 结语 博客主页:専心_前端,javascript,mys…...

linux C++ vscode连接mysql
1.linux使用Ubuntu 2.Ubuntu安装vscode 2.1 安装的是snap版本,直接打开命令行执行 sudo snap install --classic code 3.vscode配置C 3.1 直接在扩展中搜索C安装即可 我安装了C, Chinese, code runner, 安装都是同理 4.安装mysql sudo apt update sudo apt install mysql-…...

[资源推荐]langchain、LLM相关
之前很多次逛github或者去B站看东西或者说各种浏览资讯的情况,都会先看两眼然后收藏然后就吃灰的情况,那既然这样,不如多看几眼,看看是否真的能用得上,能用在哪,然后用几句话总结出来,分享出来&…...

hdfs笔记
1.HDFS shell 1.0查看帮助 hadoop fs -help <cmd> 1.1上传 hadoop fs -put <linux上文件> <hdfs上的路径> 1.2查看文件内容 hadoop fs -cat <hdfs上的路径> 1.3查看文件列表 hadoop fs -ls / 1.4…...

java_方法引用和构造器引用
文章目录 一、方法引用1.1、方法引用的理解1.2、格式1.3、举例 二、构造器引用2.1、格式2.2、例子2.3、数组引用 一、方法引用 1.1、方法引用的理解 方法引用,可以看做是基于lambda表达式的进一步刻画当需要提供一个函数式接口的实例时,可以使用lambda…...