密码学(一)
文章目录
- 前言
- 一、Cryptographic Primitives
- 二、Cryptographic Keys
- 2.1 Symmetric key cryptography
- 2.2 asymmetric key cryptography
- 三、Confidentiality
- 3.1 Symmetric key encryption algorithms
- 3.2 asymmetric key block ciphers
- 3.3 其他
- 四、Integrity
- 4.1 secure hashing functions
- 4.2 symmetric key setting
- 4.3 Asymmetric key primitives
- 4.3 其他
- 五、Freshness
- 参考资料
前言
本文来自 Intel SGX Explained
主要介绍了密码学中的密钥,加密(对称机密和非对称加密),签名。
加密 --> 机密性
签名 --> 完整性
(1)
密码学中的机密性是指确保信息在传输或存储过程中不被未授权的人访问或获取到。它是信息安全的一个基本要求,确保敏感数据只能被授权的实体读取。
机密性的实现通常依赖于加密算法和密钥管理。加密是将明文转换为密文的过程,通过使用加密算法和密钥来对信息进行转换,使得未经授权的人无法理解密文。只有拥有正确的密钥才能解密密文并还原为明文。
加密算法可以分为对称加密和非对称加密两种类型。对称加密使用相同的密钥进行加密和解密,因此在密钥的管理上相对简单,但需要确保发送方和接收方能够安全地共享密钥。非对称加密使用一对密钥,即公钥和私钥,公钥用于加密,私钥用于解密。公钥可以公开分享给任何人,而私钥必须保密。非对称加密提供了更好的密钥管理和安全性,但加密和解密的计算开销较大。
(2)
密码学中的完整性是指确保数据在传输或存储过程中不被篡改或损坏的特性。它是信息安全的另一个基本要求,确保数据的完整性和可信性。
数据的完整性保护有助于防止未经授权的修改、插入或删除操作。它确保接收方能够验证接收到的数据与发送方发送的数据完全一致,没有被篡改过。
一、Cryptographic Primitives
这一部分概述了安全架构中使用的加密系统。我们关注确保机密性(confidentiality)、完整性(integrity)和新鲜性(freshness)的加密原语,并将这些原语视为黑盒,着重讨论它们在更大系统中的使用。
Guarantee | Primitive |
---|---|
Confidentiality | Encryption |
Integrity | MAC(Message Authentication Code) / Signatures |
Freshness | Nonces + integrity |
上述表格表明了所需的安全保证和提供这些保证的基元。
Guarantee | Symmetric Keys | Asymmetric Keys |
---|---|---|
Confidentiality | AES-GCM,AES-CTR | RSA with PKCS #1 v2.0 |
Integrity | HMAC-SHA-2 AES-GCM | DSS-RSA,DSS-ECC |
上述表格表明了流行的加密原语被认为是安全的,可以抵御当今的对手。
当保护机密性的消息在不安全的传输媒介上传输时,无论是否存在对手,都无法获取消息中的信息。
当使用完整性保护时,接收者可以确保收到的消息要么是发送者传输的消息,要么会注意到攻击者篡改了消息的内容。
当多个消息通过不可信的媒介进行传输时,新鲜性保证确保接收者可以获取来自发送者的最新消息,或者能够察觉到攻击。新鲜性保证要比等效的完整性保证更强,因为后者无法防止重放攻击,即攻击者用来自同一发送者的旧消息替换较新的消息。
下面的例子进一步说明了这些概念。假设Alice是一位富有的投资者,每天都希望进行购买或出售某个物品。Alice无法直接交易,必须通过网络连接将她的订单传达给经纪人Bob,而该网络连接由Eve拥有。
(1)confidentiality guarantees
具有机密性保证的通信系统将防止Eve区分买入和卖出订单,如下图所示。如果没有机密性保证,Eve将在Bob下单之前就知道Alice的订单,因此Eve可能会以牺牲Alice利益为代价获得经济上的优势。
上图表明了在机密性攻击中,Eve可以看到Alice发送给Bob的消息,并能够理解其中的信息。在这种情况下,Eve可以确定消息是一个买入订单,而不是卖出订单。
(2) integrity guarantees
具有完整性保证的系统将防止Eve替换Alice的消息并发送一个虚假订单,如下图所示。在这个例子中,如果没有完整性保证,Eve可以将Alice的消息替换为一个"卖出全部"的订单,并以非常低的价格购买Alice的资产。
上图表明了在完整性攻击中,Eve替换了Alice的消息并发送了自己的消息。在这种情况下,Eve发送给Bob的是一个"卖出全部"的订单。与机密性攻击不同,这里的问题实际上涉及到了消息的完整性保证。
(3)freshness guarantees
最后,一个能够保证消息新鲜性的通信系统将确保Eve无法执行下图中所示的重放攻击,即替换Alice的消息为旧消息。没有新鲜性保证,Eve可以进行以下攻击,绕过机密性和完整性保证。在几天的时间里,Eve会从网络中复制并存储Alice的消息。当一个订单到达Bob时,Eve会观察市场并确定订单是买入还是卖出。在建立了一个标有买入或卖出的消息数据库之后,Eve将替换Alice的消息为她选择的旧消息。
上图表明了在一个新鲜性攻击中,Eve替换Alice的消息为之前她发送过的消息。在这个例子中,Eve随着时间的推移建立了一个标记过的消息数据库,并能够向Bob发送她选择的买入或卖出订单。
这种攻击绕过了机密性和完整性保证。Eve通过分析市场和替换消息,可以获得对Alice的交易行为的敏感信息,并利用旧消息来操纵交易结果。
二、Cryptographic Keys
在我们描述的所有密码学原语中,都依赖于密钥,密钥是一小段信息,必须根据特定规则进行披露。系统安全性分析的很大一部分工作集中在确保底层密码学原语使用的密钥是根据原语的假设生成和处理的。
密钥在密码学中起着至关重要的作用,它们用于加密和解密数据、生成和验证数字签名、执行身份认证等关键操作。因此,密钥的安全性和正确的处理方式对于确保系统的安全性至关重要。
每个密码学原语都有一个相关的密钥生成算法,该算法使用随机数据生成唯一的密钥。随机数据是由一个密码学强度的伪随机数生成器(CSPRNG)产生的,它将少量的随机种子数据扩展成大量的数据,这些数据在计算上无法与真随机数据区分开来。随机种子必须来自一个真正的随机性源,其输出不能被对手预测,例如来自硬件传感器的温度读数的最低有效位。
2.1 Symmetric key cryptography
对称密钥密码学要求系统中的所有参与方建立一个共享的秘密密钥,通常称为"密钥"。通常,一方执行密钥生成算法,并将生成的密钥安全地传输给其他参与方,如下图所示。用于分发密钥的通道必须提供机密性和完整性的保证,这是一个非常复杂的后勤负担。这里提到的对称密钥原语对密钥本身不做任何假设,因此密钥生成算法只是从CSPRNG中获取一定数量的比特位。
在对称密钥密码学中,希望进行安全通信的各方共享一个秘密密钥。
以下是对称密钥密码学中建立共享秘密密钥的过程:
(1)密钥生成:其中一方使用安全的密钥生成算法生成一个随机的秘密密钥。这个密钥通常是一串具有特定长度的比特。
(2)密钥分发:生成的秘密密钥通过安全的渠道分发给参与通信的各方。确保通过安全的通道传输密钥,以确保其机密性和完整性。
(3)密钥存储:每个参与方都安全地存储共享的秘密密钥,以确保其不被泄露或未经授权的人访问。采取适当的密钥管理措施,如使用安全的存储机制和访问控制,来保护密钥。
2.2 asymmetric key cryptography
非对称密钥密码学的显著特点是它不需要私密渠道进行密钥分发。每个参与方执行密钥生成算法,生成一对相关的私钥和公钥。每个参与方的公钥通过具有完整性保证的渠道分发给其他参与方,如下图所示。非对称密钥原语比对称密钥原语更加灵活,但也更加复杂并消耗更多的计算资源。
非对称密钥密码学的过程如下:
(1)密钥生成:每个参与方执行密钥生成算法,生成一对密钥:私钥和公钥。这对密钥是通过数学关系相互关联的。
(2)公钥分发:每个参与方将其公钥分发给其他参与方。分发过程需要通过具有完整性保证的渠道进行,以确保公钥在传输过程中的完整性和安全性。
(3)加密和解密:要发送加密的消息,发送方使用接收方的公钥来加密消息。接收方使用其私钥来解密收到的消息。这样,即使公钥被泄露,只有对应的私钥才能进行解密,确保了通信的机密性。
三、Confidentiality
许多提供完整性保证的加密系统是建立在对固定大小的消息块进行操作的分组密码之上的。发送方使用加密算法对块进行转换,而接收方使用解密算法反转此转换过程。分组密码中的加密算法将消息块的内容混淆在输出中,以便没有解密密钥的对手无法从加密输出中获取原始消息块。
3.1 Symmetric key encryption algorithms
对称密钥加密算法使用相同的密钥进行加密和解密,如下图所示:
上图表明了在对称密钥的安全置换(分组密码)中,相同的秘密密钥必须同时提供给加密算法和解密算法。
在对称密钥加密中,发送方和接收方使用相同的密钥对数据进行加密和解密。这个共享的密钥需要事先在通信双方之间安全地共享。发送方使用密钥对数据进行加密,生成加密后的数据,然后接收方使用相同的密钥对加密的数据进行解密,还原出原始的数据。
目前,基于对称密钥的最受欢迎的分组密码是美国加密标准(AES – Advanced Encryption Standard),它有两个变体,分别使用128位密钥或256位密钥来操作128位的数据块。AES是一个安全的置换函数,因为它可以将任何128位的数据块转换为另一个128位的数据块。最近,美国国家安全局(NSA)要求使用256位AES密钥来保护敏感信息。
关于对称加密算法请参考:https://zhuanlan.zhihu.com/p/441159181
3.2 asymmetric key block ciphers
而非对称密钥分组密码使用公钥进行加密,使用相应的私钥进行解密,如下图所示:
上图表明了在非对称密钥分组密码中,加密算法使用公钥进行操作,而解密算法则使用相应的私钥。
在这种情况下,每个参与者都拥有一对数学相关的密钥:公钥和私钥。公钥可以自由分发并为所有人所知,而私钥必须保密,并且只有密钥的拥有者知道。
这里公钥的分发存在一个问题:发送方通信开始前,需要从可信赖的证书机构手中拿到通信方的公钥证书,以安全的方式获取公钥。增加这个环节,是为了确保发送方拿到的公钥真的是通信人的公钥。
引入证书是为了解决公钥密钥的信任问题。
详细请参考:https://zhuanlan.zhihu.com/p/550974452
当发送方想要使用非对称密钥分组密码加密消息时,他们使用接收方的公钥来执行加密算法。该算法将消息按照固定大小的块进行处理,并将其转换为加密后的密文。只有使用相应的私钥才能解密该密文,而私钥只有预期的接收方独占拥有。
接收方在掌握自己的私钥后,使用私钥执行解密算法来反转加密过程。通过将私钥应用于加密的密文,他们可以恢复原始消息的未加密形式。
因此,在非对称密钥分组密码中,加密算法使用公钥进行操作,允许任何人加密专为特定接收方设计的消息。而相应的私钥则由预期的接收方用于解密密文并恢复原始消息。
最广泛部署的非对称密钥分组密码是Rivest-Shamir-Adelman(RSA)算法。RSA是一种被广泛使用和信任的加密算法,用于安全通信和数字签名。
对于非对称加密算法:https://zhuanlan.zhihu.com/p/436455172
3.3 其他
一个单独使用的分组密码并不能完全保证机密性。一个显著的问题是,在我们之前的例子中,对于Alice的任何购买订单,分组密码会生成相同的加密输出,因为它们都具有相同的内容。此外,每个分组密码都有自己的假设,如果直接使用密码,可能会导致微妙的漏洞。
(1)
对称密钥分组密码与操作模式结合使用,形成对称加密方案。大多数操作模式要求为每个消息使用随机初始化向量(IV – random initialization vector),如下图所示。在分析基于这些加密系统的系统安全性时,了解IV生成过程与确保加密密钥的机密性一样重要。
上图表明了对称密钥分组密码与操作模式结合使用。大多数操作模式要求为每个加密消息生成一个随机的初始化向量(IV)。
对称加密算法通常使用不同的操作模式来处理大于块大小的数据:
CTR(Counter)模式和CBC( Cipher Block Chaining)模式是由美国国家标准与技术研究所(NIST)推荐的操作模式,也是国家安全局(NSA)的要求所依据。
CTR模式和CBC模式都是广泛使用的操作模式,结合分组密码如AES可以实现机密性。
在CTR模式中,分组密码以计数器为基础,为每个明文块加密一个唯一的计数器值。计数器值与一个随机数(称为nonce)结合,生成一系列加密密钥流,然后与明文进行异或运算,产生密文。CTR模式支持并行加密和解密,适用于处理大数据集。
而CBC模式则是将每个明文块与前一个密文块进行异或运算后再进行加密。第一个块会与一个初始化向量(IV)进行异或运算,每个消息的IV都需要是随机且唯一的。CBC模式引入了扩散和链式效应,提高了安全性,但需要按顺序处理数据。
通过将分组密码如AES与适当的操作模式如CTR结合,可以创建AES-CTR等加密方法,提供机密性保证。这些加密方法确保每个消息使用唯一的IV或计数器值进行加密,防止模式出现,增加安全性。
(2)
在非对称密钥设置中,没有与操作模式等价的概念。每个块密码都有自己的假设,并需要针对通用用途设计的专门方案。
RSA算法通常与填充方法结合使用,其中最流行的方法是公钥密码学标准(PKCS)#1版本1.5和2.0中所描述的方法。对使用基于RSA的加密的系统进行安全分析时,必须考虑填充方法。例如,PKCS #1 v1.5中的填充在某些情况下可能泄漏私钥。虽然PKCS #1 v2.0解决了这个问题,但它足够复杂,以至于一些实现存在自己的安全问题。
填充方法的作用是在使用RSA算法进行加密时,对明文进行适当的转换和填充,以满足RSA算法的要求。填充方法可以确保加密的安全性和正确性,并防止一些攻击,如选择明文攻击、填充预测攻击等。
非对称加密算法比对称加密算法具有更高的计算要求。因此,当需要加密大量数据时,发送方会生成一个一次性的秘密密钥,用于加密数据,并使用接收方的公钥对该秘密密钥进行加密,如下图所示:
上图表明了非对称密钥加密通常用于启动对称密钥加密方案。
这种方案被称为"混合加密"(hybrid encryption),它结合了对称密钥加密和非对称密钥加密的优势。对称密钥加密适用于处理大量数据,而非对称密钥加密提供了密钥交换和数字签名等功能。因此,在混合加密中,发送方使用对称密钥加密数据,而对称密钥本身则使用接收方的公钥进行加密,以确保只有接收方能够解密对称密钥并还原明文数据。
这种方式的优势在于避免了使用非对称加密算法来直接加密大量数据所带来的高计算开销。相反,只需要使用非对称加密算法来加密相对较短的对称密钥即可。这样既保证了安全性,又提供了高效的加密和解密性能。
这个过程通常被称为"密钥交换"或"密钥建立"。
使用这种方法的主要原因是,非对称加密算法(如RSA或Diffie-Hellman)与对称加密算法(如AES)相比具有更高的计算要求。非对称加密是计算上更昂贵和较慢的,特别是在处理大量数据时。
为了克服这个限制,通常采用混合加密方案。以下是其工作原理的高级概述:
(1)密钥交换:发送方和接收方通过非对称密钥交换协议(如Diffie-Hellman)建立一个共享的秘密密钥,而不向任何窃听者泄露。
(2)秘密密钥生成:一旦建立了共享的秘密密钥,它将被用作对称密钥,用于后续的加密和解密操作。这个秘密密钥通常是随机生成的,并且对于每个会话都是唯一的。
(3)对称加密:发送方使用共享的秘密密钥,使用快速高效的对称加密算法(如AES)来加密实际数据。这个过程在计算上是高效的,适合加密大量数据。
(4)传输:加密数据随后通过安全通道传输给接收方。
(5)对称解密:接收方使用共享的秘密密钥进行解密,恢复原始明文数据。
四、Integrity
为了保障数据的完整性,密码学采用了一些技术和机制:
(1)散列函数(Hash Functions):散列函数将输入数据转换为固定长度的散列值。通过对接收到的数据应用散列函数并将结果与预期的散列值进行比较,可以验证数据的完整性。即使对输入数据做了微小的修改,其散列值也会发生显著变化。
(2)消息认证码(Message Authentication Codes,MAC):MAC是一种通过密钥生成固定长度的认证标签,用于验证数据的完整性和身份认证。发送方使用密钥对数据进行哈希运算,并将结果与数据一起发送。接收方使用相同的密钥对接收到的数据进行哈希运算,并将结果与发送方发送的认证标签进行比较,以验证数据的完整性和真实性。
(3)数字签名(Digital Signatures):数字签名使用非对称加密算法结合散列函数来验证数据的完整性、真实性和身份认证。发送方使用私钥对数据进行散列运算,并使用私钥对散列结果进行加密,生成数字签名。接收方使用发送方的公钥对数字签名进行解密,并对接收到的数据进行散列运算,然后将结果与解密后的数字签名进行比较,以验证数据的完整性和真实性。
4.1 secure hashing functions
许多提供完整性保证的加密系统都是建立在安全散列函数之上的。这些散列函数可以处理无限量的输入数据,并产生一个固定大小的输出。安全散列函数具有一些保证,例如预像抗性(pre-image resistance),它指的是对手无法根据给定的哈希输出产生对应的输入数据。
预像抗性是指在给定散列值的情况下,找到对应的输入数据是困难的。换句话说,对手无法通过散列值逆推出原始的输入数据。这种性质使得安全散列函数在许多密码学应用中非常有用,例如密码校验、消息认证码(MAC)的生成,以及数字签名等。
目前最流行的安全散列函数是安全散列算法(SHA)。然而,由于SHA-1 [173]存在安全问题,建议新的软件至少使用256位的SHA-2 [21]进行安全散列。
SHA系列是由美国国家安全局(NSA)设计的一组散列函数。SHA-1是该系列中最早被广泛使用的版本,但它已经被证明存在一些安全漏洞。由于这些漏洞,SHA-1在许多安全应用中不再被推荐使用。
为了提高安全性,现在推荐使用SHA-2系列中的256位版本,即SHA-256。SHA-2系列包括了多个散列函数,如SHA-224、SHA-256、SHA-384和SHA-512等。其中,SHA-256是应用最广泛的版本之一,它提供了更高的安全性和较大的散列输出长度。
使用256位SHA-2进行安全散列可以有效地提供更强的数据完整性保护。较长的散列输出长度增加了散列冲突的难度,从而提高了对手找到相同散列值的难度。这使得SHA-256成为当今许多安全协议和应用程序中首选的安全散列函数。
SHA散列函数是一个庞大的区块散列函数家族的成员,它们以固定大小的消息块作为输入,并使用固定大小的内部状态。区块散列函数的使用如下图所示。首先调用INITIALIZE算法将内部状态设置为初始值。对于输入中的每个消息块,执行EXTEND算法。在整个输入被处理完毕后,调用FINALIZE算法从内部状态产生散列输出。
上图表明了一个区块散列函数操作的是固定大小的消息块,并且使用固定大小的内部状态。
具体流程如下:
(1)初始化(INITIALIZE):首先调用初始化算法,将散列函数的内部状态设置为初始值。这是为了准备接收输入数据并开始处理。
(2)扩展(EXTEND):对于输入的每个消息块,执行扩展算法。扩展算法将消息块与内部状态进行处理,从而更新内部状态。
(3)结束(FINALIZE):在整个输入被处理完毕后,调用结束算法。结束算法根据最终的内部状态生成散列输出。
整个过程可以看作是将输入数据拆分成固定大小的消息块,并对每个消息块进行处理,更新内部状态。当所有消息块都被处理后,根据最终的内部状态生成散列输出。
区块散列函数的特点是操作固定大小的消息块,并使用固定大小的内部状态,从而保证了散列输出的一致性和可比较性。
通过这种方式,SHA散列函数可以处理任意长度的输入数据,并生成固定大小的散列输出。这使得它们在密码学和信息安全领域得到广泛应用,用于数据完整性检查、数字签名、密码哈希等场景。
4.2 symmetric key setting
在对称密钥设置中,使用消息认证码(MAC)密码系统可以获得完整性保证,它是一种基于共享密钥的算法,通过将共享密钥与数据进行计算,生成一个固定长度的认证标签(authentication tag)。
如下图所示。在这个过程中,发送方使用一个MAC算法,该算法接收一个对称密钥和一个可变长度的消息作为输入,并生成一个固定长度的短MAC标签。接收方将原始消息、对称密钥和MAC标签提供给MAC验证算法,用于检查消息的真实性。
上图表明了在对称密钥设置中,通过计算消息认证码(MAC)标签来确保完整性,并将其与消息一起通过网络传输。接收方将MAC标签输入到验证算法中,以检查消息的真实性。
MAC的使用依赖于密钥的正确管理。发送方和接收方需要事先建立和共享一个密钥。密钥的安全分发可以通过安全通道、密钥交换协议或预先共享的密钥等方式实现。
MAC(消息认证码)加密系统的关键特性是,在不知道秘密密钥的情况下,对手无法生成一个有效的MAC标签来验证消息。MAC标签是通过应用特定的算法生成的,该算法接受秘密密钥和消息作为输入。在没有秘密密钥的情况下,对手无法计算出一个有效的MAC标签,以通过验证过程。
许多MAC(消息认证码)加密系统并没有单独的MAC验证算法。相反,接收方通过运行与发送方相同的算法来计算接收到的消息的预期MAC标签,并将输出与从网络接收到的MAC标签进行比较来检查MAC标签的真实性。
这适用于散列消息认证码(HMAC)的通用构造方式,其操作如下图所示。HMAC可以使用任何安全散列函数(例如SHA)来构建MAC加密系统。
上图表明了在对称密钥设置中,通过计算基于哈希的消息认证码(HMAC)来确保完整性,并将其与消息一起通过网络传输。接收方重新计算HMAC,并将其与从网络接收到的版本进行比较。
4.3 Asymmetric key primitives
提供完整性保证的非对称密钥原语被称为签名(signatures)。数字签名是一种基于公钥密码学的技术,它结合了哈希函数和非对称加密算法,用于对数据进行签名和验证。
消息发送方使用私钥提供给签名算法,并将输出的签名与消息一起传输,如下图所示。消息接收方使用发送方的公钥和签名,输入到签名验证算法中,如果消息匹配签名,则返回TRUE;如果消息被篡改,则返回FALSE。
上图表明了在非对称密钥设置中,签名方案能够提供完整性保证。签名是使用发送方的私钥创建的,并使用相应的公钥进行验证。通常会使用密码学安全的哈希函数将大型消息缩减为小型哈希值,然后对哈希值进行签名。
发送方的数字签名,不同接收方都可以验证,因为发送方的密钥是公开的。
对于非对称加密解密:
发送方使用接收方的公钥进行加密,接收方使用自己的密钥解密 – 保证信息的机密性。
加密需要对完整的信息加密,因为接收方在时解密需要还原出完整明文,因此开销较大。
加密 --> 完整的明文。
对于数字签名验证:
发送方使用自己的私钥进行签名,接收方使用发送方的公钥进行验证 – 保证信息的完整性。
而签名只需要验证信息的完整性,不需要还原出完整明文,只需要对签名进行解密,比较哈希值即可,开销小。
签名 --> 完整的明文进行哈希运行得到的哈希值。
具体流程如下:
(1)发送方(生成签名):发送方使用自己的私钥作为输入,并使用密码学安全的哈希函数对消息进行哈希运算,生成一个固定长度的哈希值。然后,发送方使用自己的私钥对哈希值进行签名,生成一个签名值。
(2)发送方(传输消息和签名):发送方将消息和生成的签名一起传输到接收方。通常,签名会附加在消息的末尾或者作为单独的字段发送。
(3)接收方(验证签名):接收方使用发送方的公钥和相同的哈希函数对接收到的消息进行哈希运算,生成一个哈希值。然后,接收方使用发送方的公钥对接收到的签名进行验证。验证过程包括对签名进行解密(使用公钥),以及将解密后的结果与哈希值进行比较。如果两者匹配,则认为签名有效,并确认消息的完整性。
通过使用发送方的私钥进行签名和接收方的公钥(这里的公钥是发送方的公钥)进行验证,签名方案提供了一个强大的完整性保护机制。发送方的私钥是私有的,并且只有发送方能够生成正确的签名。接收方的公钥可以被分发给其他人,用于验证签名的有效性。
使用密码学安全的哈希函数对消息进行哈希运算的目的是将大型消息缩减为固定长度的哈希值。这样做有两个主要好处:一是减小了签名的大小,节省了传输带宽;二是提供了对消息的完整性保护,即使消息很大,只需验证哈希值即可。
签名算法在处理大型消息时可能会具有较高的计算成本。因此,在实践中,通常会先将要传输的消息通过一个密码学强度的哈希函数进行处理,然后将哈希值作为输入提供给签名算法。
具体过程如下:
(1)消息哈希:要传输的消息首先通过密码学强度的哈希函数进行处理,例如SHA-256或SHA-3。这个哈希函数将整个消息作为输入,并生成一个固定长度的哈希值作为输出。
(2)签名:签名算法不再直接对整个消息进行签名,而是采用前一步生成的哈希值作为输入。签名算法使用发送方的私钥基于哈希值生成签名。
(3)传输:原始消息与生成的签名一起传输。接收方需要访问与发送方相同的哈希函数,以重新生成用于验证的哈希值。
(4)验证:接收方在接收到消息和签名后,使用相同的哈希函数对接收到的消息进行哈希处理,生成一个哈希值。然后,接收方使用发送方的公钥和接收到的签名来验证消息的完整性。验证算法检查计算得到的哈希值是否与使用公钥从签名中获得的哈希值匹配。如果匹配,则表示签名有效,消息被认为是真实且未被篡改的。
通过在签名之前使用哈希函数,可以减少签名算法的计算开销,因为它只需处理固定长度的哈希值,而不是整个消息。此外,哈希函数具有将任意大小的消息缩减为固定长度值的特性,使得处理和传输更加高效。
这种方法还提供了安全性的好处,因为哈希函数被设计为单向函数,即仅通过哈希值无法计算出原始消息。这确保了原始消息的完整性,因为对消息的任何修改都会导致不同的哈希值。
总之,在签名之前使用密码学强度的哈希函数对消息进行预处理是一种实用的方法,可在处理大型消息时高效地保持签名过程的完整性和安全性。
签名只能保证信息的完整性不能保证信息的机密性。
对于签名请参考:https://zhuanlan.zhihu.com/p/588777811
4.3 其他
(1)
在共享密钥设置中,为了保证完整性,目前最流行的选择是使用HMAC-SHA,这是一种使用SHA进行哈希的HMAC函数。同时,认证加密是一种结合了块密码和提供机密性和完整性保证的操作模式,通常是HMAC的一个有吸引力的替代方案。最常用的认证加密操作模式是Galois/Counter模式(GCM),当与AES结合形成AES-GCM时,该模式已经获得了NIST的推荐。
(2)
最流行的签名方案结合了RSA加密算法和PKCS #1中指定的填充方案,如下图所示。最近,椭圆曲线密码学(ECC)因其较小的密钥大小而变得越来越受欢迎。例如,384位的ECC密钥被认为与3072位的RSA密钥一样安全。美国国家安全局要求使用数字签名标准(DSS),该标准指定了基于RSA和ECC的方案。
使用在RFC 3447中指定的PKCS #1 v1.5填充的RSA签名方案结合了多个组件来生成签名。以下是该过程的详细说明:
(1)消息的安全哈希:首先,对需要签名的消息应用安全哈希函数(如SHA-256)。这将产生一个固定长度的哈希值,代表消息的内容,并确保其完整性。
(2)DER编码的哈希算法规范:接下来,使用Distinguished Encoding Rules(DER)格式指定在步骤1中使用的哈希算法。此规范与签名一起进行编码,以指示用于哈希的算法。
(3)填充字符串:生成一个填充字符串,其中的位都设置为1。填充字符串的长度取决于RSA模数的长度。填充字符串用于确保与RSA加密算法的兼容性。
(4)拼接和编码:将迄今为止获得的组件(DER编码的哈希算法规范、填充字符串和安全哈希输出)连接在一起。然后,使用PKCS #1 v1.5编码规则对此连接进行编码。
(4)RSA签名生成:使用签名者的私钥和RSA算法对步骤4中的编码数据进行加密。这个过程生成RSA签名,它是对签名消息的数学表示。
五、Freshness
Freshness保证通常是在已经提供完整性保证的系统之上构建的,通过向每条消息添加唯一的信息。 freshness方案的主要挑战在于在发送方经济地维护生成唯一信息所需的状态,并在接收方验证其唯一性。
获得 freshness保证的一种常见解决方案依赖于单次使用的随机数,即nonce。Nonce非常有吸引力,因为发送方不需要维护任何状态;然而,接收方必须存储所有接收到的消息的nonce。
通过在每条消息中包含nonce,发送方可以确保每条消息的唯一性。接收方在接收到消息时,需要检查该消息的nonce是否已经在先前接收到的消息中出现过,以验证消息的 freshness。
(1)
Nonce通常与消息的时间戳和过期方案结合使用,如下图所示。过期时间可以大大减少接收方的存储需求,因为过期消息的nonce可以安全地丢弃。然而,该方案依赖于发送方和接收方拥有同步的时钟。消息的过期时间是在降低存储成本的愿望与容忍时钟偏差以及消息传输和处理延迟之间的权衡。
在这种方案中,每条消息都包含一个nonce和时间戳。接收方在接收到消息时,首先检查nonce是否已经被使用过,然后检查时间戳是否在有效范围内。如果nonce已经被使用过或时间戳超过了有效范围,接收方可以安全地丢弃该消息。
为了实现 freshness保证,可以在已经提供完整性保证的系统之上添加带有时间戳的nonce。发送方和接收方使用同步的时钟为每条消息添加时间戳,并丢弃过于陈旧的消息。接收方需要将每条新消息中的nonce与其所见到的所有未过期消息的nonce进行对比。
具体而言,发送方在每条消息中添加一个带有时间戳的nonce,并将其发送给接收方。接收方在接收到消息时,首先检查时间戳是否合理,即消息是否过于陈旧。如果时间戳超过了合理的范围,接收方可以安全地丢弃该消息。然后,接收方将接收到的nonce与其维护的非过期消息的nonce数据库进行比对。如果接收到的nonce已经在数据库中存在,那么这条消息可能是重复的或者存在问题,接收方可以相应地处理。
通过使用时间戳和nonce的组合,发送方和接收方可以在已有的完整性保证之上获得 freshness保证。发送方使用时间戳和nonce确保每条消息具有唯一性和时间戳信息,而接收方利用时间戳和nonce对消息进行验证和去重。
(2)
另一种使用nonce的方法是在挑战-响应协议中使用,以消除存储开销方面的顾虑。挑战者生成一个nonce并将其嵌入到挑战消息中。对挑战的响应包括对嵌入的nonce的确认,这样挑战者可以区分新鲜的响应和重放攻击。nonce只由挑战者存储,并且与验证响应所需的其余状态相比较小。
在这种方案中,挑战者生成一个唯一的nonce,并将其作为挑战的一部分发送给响应者。响应者在回应挑战时包含嵌入的nonce的确认。挑战者接收到响应后,通过检查响应中的nonce和其自身存储的nonce进行比对,从而验证响应的新鲜性。
这种方案的优势在于,nonce只需要由挑战者存储,而不需要响应者存储任何状态。相比于其他用于验证响应的状态,nonce的存储开销较小。
总结而言,通过在挑战-响应协议中使用nonce,可以消除关于存储开销的顾虑。挑战者生成nonce并将其嵌入到挑战消息中,响应者在响应中确认nonce。这种方法使挑战者能够区分新鲜的响应和重放攻击,同时只需要在挑战者一侧存储nonce,而不需要在响应者一侧存储任何状态。
参考资料
https://www.zhihu.com/column/c_1446239480876929024
相关文章:
密码学(一)
文章目录 前言一、Cryptographic Primitives二、Cryptographic Keys2.1 Symmetric key cryptography2.2 asymmetric key cryptography 三、Confidentiality3.1 Symmetric key encryption algorithms3.2 asymmetric key block ciphers3.3 其他 四、Integrity4.1 secure hashing …...
VueRouter
1、用户权限问题 可以在路由全局前置守卫判断当前vuex里是否有token 有token值证明刚才登录过, 无token值证明未登录 router.beforeEach((to, from, next) > {const token store.state.tokenif (token) {// 如果有token, 证明已登录if (!store.state.userInfo.username) {/…...
什么是React.FC | 封装ant design弹框组件之:ant design 修改密码弹框组件
文章目录 一、什么是React.FC组件的 props 是什么意思二、封装ant design弹框组件之:ant design 修改密码弹框组件定义修改密码弹框组件使用修改密码弹框组件:[重要]关于提交时候,不同组件 表单数据共享报错:Button cannot be used as a JSX component.一、什么是React.FC …...
DHCP
一、DHCP 1.1 什么是dhcp DHCP动态主机配置协议,通常被应用在大型的局域网络环境中,主要作用是集中地管理、分配IP地址,使网络环境中的主机动态的获得IP地址、DNS服务器地址等信息,并能够提升地址的使用率。 DHCP作为用应用层协…...
VS code的使用介绍
VS code的使用介绍 简介下载和安装常用的插件使用教程快捷键 集成Git未找到 Git。请安装 Git,或在 "git.path" 设置中配置。操作步骤打开文件夹初始化仓库文件版本控制状态提交文件到git打开git操作栏位 好用的插件ChineseDraw.io Integration实体关系 Gi…...
【蓝桥杯选拔赛真题57】python兔子分胡萝卜 第十四届青少年组蓝桥杯python 选拔赛比赛真题解析
目录 python兔子分胡萝卜 一、题目要求 1、编程实现 2、输入输出...
Spring MVC中JSON数据处理方式!!!
添加json依赖 <!--spring-json依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency> 注解 RequestBody:作…...
学习JavaEE的日子 阶段回顾
标识符 含义:给类、变量、方法、接口取名字的时候使用到的字符序列 组成:大小写字母 、数字、$、_、中文 注意事项: 不能以数字开头 区分大小写字母 不能使用除了$和_以外的特殊符号 不能使用Java的关键字 考虑到编码问题不要使用中文 关…...
深入理解 Flink(一)Flink 架构设计原理
大数据分布式计算引擎设计实现剖析 MapReduce MapReduce 执行引擎解析 MapReduce 的组件设计实现图 Spark 执行引擎解析 Spark 相比于 RM 的真正优势的地方在哪里:(Simple、Fast、Scalable、Unified) DAG 引擎中间计算结果可以进行内存持…...
Python pip 常用指令
前言 Python的pip是一个强大的包管理工具,它可以帮助我们安装、升级和管理Python的第三方库。以下是一些常用的pip指令。 1. 安装第三方库 使用pip安装Python库非常简单,只需要使用pip install命令,后面跟上库的名字即可。 # 安装virtuale…...
Eureka工作原理详解
摘要:本文将详细介绍Eureka的工作原理,包括服务注册、服务发现、心跳检测等关键概念。通过阅读本文,您将了解到Eureka如何实现高可用、可扩展的服务注册中心。 一、引言 在微服务架构中,服务注册与发现是一个重要的环节。为了实…...
开源加解密库之GmSSL
一、简介 GmSSL是由北京大学自主开发的国产商用密码开源库,实现了对国密算法、标准和安全通信协议的全面功能覆盖,支持包括移动端在内的主流操作系统和处理器,支持密码钥匙、密码卡等典型国产密码硬件,提供功能丰富的命令行工具及…...
小程序分销商城,打造高效线上购物体验
小程序商城系统,为您带来前所未有的在线购物体验。它不仅提供线上商城购物、在线下单、支付及配送等功能,还凭借其便捷性成为众多商家的首选。 想象一下,商家可以展示琳琅满目的商品,包括图片、文字描述、价格及库存等详尽信息。而…...
Selenium-java 定位元素时切换iFrame时的方法
具体方法如下图所示,如果iFrame中嵌套多层iFrame需要逐层定位到需要的那一层iFrame,完成操作后,执行该代码:driver.switchTo() .defaultContent() ; 是返回最顶部的frame...
WinForms中的UI卡死
WinForms中的UI卡死 WinForms中的UI卡死通常是由于长时间运行的操作阻塞了UI线程所导致的。在UI线程上执行的操作,例如数据访问、计算、文件读写等,如果耗时较长,会使得UI界面失去响应,甚至出现卡死的情况。 解决方法 为了避免…...
Zookeeper设计理念与源码剖析
Zookeeper 架构理解 整体架构 Follower server 可以直接处理读请求,但不能直接处理写请求。写请求只能转发给 leader server 进行处理。最终所有的写请求在 leader server 端串行执行。(因为分布式环境下永远无法精确地确认不同服务器不同事件发生的先后…...
EasyExcel快速导出 100W 数据
一. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个导出,采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决下载大文件EXCEL卡死页面的问题。 不过一是存…...
SpingBoot的项目实战--模拟电商【5.沙箱支付】
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. 沙箱支付是什么 二.Sp…...
How to collect data
How to collect data 爬虫JavaPythonurllibrequestsBeautifulSoup 反爬虫信息校验型反爬虫动态渲染反爬虫文本混淆反爬虫特征识别反爬虫App反爬虫验证码 自动化测试工具SeleniumAppiumQMetry Automation StudioTestComplete RPA商业化产品艺赛旗影刀UIPath 开源产品Robot Frame…...
二刷Laravel 教程(用户注册)总结Ⅳ
一、显示用户信息 1)resource Route::resource(users, UsersController); 相当于下面这7个路由 我们先用 Artisan 命令查看目前应用的路由: php artisan route:list 2) compact 方法 //我们将用户对象 $user 通过 compact 方法转化为一个关联…...
跨国制造业组网方案解析,如何实现总部-分支稳定互联?
既要控制成本,又要稳定高效,可能吗? 在制造企业积极向“智造”发展、数字化转型的当下,物联网、人工智能、机器人等新型设备加入到生产、管理环节,为企业内部数据传输提出了更高的要求。而当企业规模扩大,数…...
网络的设置
一、网络设置 1.1查看linux基础的网络设置 网关 route -n ip地址ifconfigDNS服务器cat /etc/resolv.conf主机名hostname路由 route -n 网络连接状态ss 或者 netstat域名解析nslookup host 例题:除了ping,什么命令可以测试DNS服务器来解…...
CentOS常用命令
CentOS常用命令 1 背景知识1.1 Centos 简介1.2 centos 和ubuntu的区别1.3 安装centos的时候需要注意什么 2 常用命令集锦2.1 文件目录类:2.2 驱动挂载类:2.3 关机命令:2.4 查看系统信息命令:2.5 文本命令2.6 系统管理命令…...
Linux运维之切换到 root 用户
春花秋月何时了,往事知多少。此付费专栏不要订阅,不要订阅,听人劝。 🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项目实战] 介绍Java…...
【2024系统架构设计】 系统架构设计师第二版-层次式架构设计理论与实践
目录 一 表现层框架设计 二 中间层架构设计 三 数据访问层设计 四 数据架构规划与设计 五 物联网层次架构设计 六 层次式架构案例分析...
SpringSecurity的注解@PreAuthorize的失效问题
问题:测试响应式框架时,测试框架对于权限与角色的拦截问题,对于/delete的访问报错访问拒绝,但是数据里面配置了权限。 配置详情 原因:调用roles方法时源码会重新new一个list将authorities的数据覆盖,导致…...
k8s的集群调度
1、scheduler:负责调度资源,把pod调度到指定的node节点 (1)预算策略 (2)优先策略 2、List-watch (1)在k8s集群中,通过List-watch的机制进行每个组件的协作࿰…...
简单易懂的理解 PyTorch 中 Transformer 组件
目录 torch.nn子模块transformer详解 nn.Transformer Transformer 类描述 Transformer 类的功能和作用 Transformer 类的参数 forward 方法 参数 输出 示例代码 注意事项 nn.TransformerEncoder TransformerEncoder 类描述 TransformerEncoder 类的功能和作用 Tr…...
搭建Eureka服务注册中心
一、前言 我们在别的章节中已经详细讲解过eureka注册中心的作用,本节会简单讲解eureka作用,侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现,注册在上面的服务可以到Eureka上进行服务实例的拉取,主要作用…...
河南省建设工程招标投标协会网站/中国站长之家
对于并发,Lucene.Net 遵循以下规则:1. 允许任意多的读操作并发,即任意数量用户可同时对同一索引做检索操作。2. 即便正在进行索引修改操作(索引优化、添加文档、删除文档),依然允许任意多的检索操作并发执行。3. 不允许并发修改操…...
做网站违法嘛/百度优化怎么做
在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好,下面先看…...
政府网站制作方案/永久免费crm客户管理系统
一因为画图需要今天决定把一块带有集成显卡的技嘉主板装上一块七彩虹独立显卡。咋装上独立显卡之后发现无论显示器接哪一个显卡都无法显示。也就是显示器是黑屏状态,但电脑主机不报警。更换了一块全新显卡还是这个样子。解决办法。1、先拔了独显。2、显示器接集显&a…...
太原手机模板建站/济南网络优化厂家
查看文档,在用page()函数注册页面的时候有这样的两个对象参数用户判断用户在最顶部下拉和到达最底部 在小程序里,用户顶部下拉是默认禁止的,我们需要把他设置为启用,在app.json中的设置对所有页面有效,在单独页面设置…...
网站开发应用短信/aso应用商店优化原因
一、队列1)队列(Queue)是一种先进先出(FIFO)的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头。即…...
外贸优秀网站/网站关键字排名优化
括号匹配 #include<iostream> #include<string> #include<stack>using namespace std; string st; bool isLeft(char c)//判断是否为左括号 {if(c(||c{||c[) return true;else return false; } bool isSame(char c1,char c2) //判断括号是否是同等类型 {if(…...