赞
踩
本文来自 Intel SGX Explained
主要介绍了密码学中的密钥,加密(对称机密和非对称加密),签名。
加密 --> 机密性
签名 --> 完整性
(1)
密码学中的机密性是指确保信息在传输或存储过程中不被未授权的人访问或获取到。它是信息安全的一个基本要求,确保敏感数据只能被授权的实体读取。
机密性的实现通常依赖于加密算法和密钥管理。加密是将明文转换为密文的过程,通过使用加密算法和密钥来对信息进行转换,使得未经授权的人无法理解密文。只有拥有正确的密钥才能解密密文并还原为明文。
加密算法可以分为对称加密和非对称加密两种类型。对称加密使用相同的密钥进行加密和解密,因此在密钥的管理上相对简单,但需要确保发送方和接收方能够安全地共享密钥。非对称加密使用一对密钥,即公钥和私钥,公钥用于加密,私钥用于解密。公钥可以公开分享给任何人,而私钥必须保密。非对称加密提供了更好的密钥管理和安全性,但加密和解密的计算开销较大。
对称加密(Symmetric Encryption)如下图所示:
非对称加密(Asymmetric Encryption)如下图所示:
(2)
密码学中的完整性是指确保数据在传输或存储过程中不被篡改或损坏的特性。它是信息安全的另一个基本要求,确保数据的完整性和可信性。
数据的完整性保护有助于防止未经授权的修改、插入或删除操作。它确保接收方能够验证接收到的数据与发送方发送的数据完全一致,没有被篡改过。
这一部分概述了安全架构中使用的加密系统。我们关注确保机密性(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)机密性保证
具有机密性保证的通信系统将防止Eve区分买入和卖出订单,如下图所示。如果没有机密性保证,Eve将在Bob下单之前就知道Alice的订单,因此Eve可能会以牺牲Alice利益为代价获得经济上的优势。
上图表明了在机密性攻击中,Eve可以看到Alice发送给Bob的消息,并能够理解其中的信息。在这种情况下,Eve可以确定消息是一个买入订单,而不是卖出订单。
(2) 完整性保证
具有完整性保证的系统将防止Eve替换Alice的消息并发送一个虚假订单,如下图所示。在这个例子中,如果没有完整性保证,Eve可以将Alice的消息替换为一个"卖出全部"的订单,并以非常低的价格购买Alice的资产。
上图表明了在完整性攻击中,Eve替换了Alice的消息并发送了自己的消息。在这种情况下,Eve发送给Bob的是一个"卖出全部"的订单。与机密性攻击不同,这里的问题实际上涉及到了消息的完整性保证。
(3)消息新鲜性保证
最后,一个能够保证消息新鲜性的通信系统将确保Eve无法执行下图中所示的重放攻击,即替换Alice的消息为旧消息。没有新鲜性保证,Eve可以进行以下攻击,绕过机密性和完整性保证。在几天的时间里,Eve会从网络中复制并存储Alice的消息。当一个订单到达Bob时,Eve会观察市场并确定订单是买入还是卖出。在建立了一个标有买入或卖出的消息数据库之后,Eve将替换Alice的消息为她选择的旧消息。
上图表明了在一个新鲜性攻击中,Eve替换Alice的消息为之前她发送过的消息。在这个例子中,Eve随着时间的推移建立了一个标记过的消息数据库,并能够向Bob发送她选择的买入或卖出订单。
这种攻击绕过了机密性和完整性保证。Eve通过分析市场和替换消息,可以获得对Alice的交易行为的敏感信息,并利用旧消息来操纵交易结果。
在我们描述的所有密码学原语中,都依赖于密钥,密钥是一小段信息,必须根据特定规则进行披露。系统安全性分析的很大一部分工作集中在确保底层密码学原语使用的密钥是根据原语的假设生成和处理的。
密钥在密码学中起着至关重要的作用,它们用于加密和解密数据、生成和验证数字签名、执行身份认证等关键操作。因此,密钥的安全性和正确的处理方式对于确保系统的安全性至关重要。
每个密码学原语都有一个相关的密钥生成算法,该算法使用随机数据生成唯一的密钥。随机数据是由一个密码学强度的伪随机数生成器(CSPRNG)产生的,它将少量的随机种子数据扩展成大量的数据,这些数据在计算上无法与真随机数据区分开来。随机种子必须来自一个真正的随机性源,其输出不能被对手预测,例如来自硬件传感器的温度读数的最低有效位。
对称密钥密码学要求系统中的所有参与方建立一个共享的秘密密钥,通常称为"密钥"。通常,一方执行密钥生成算法,并将生成的密钥安全地传输给其他参与方,如下图所示。用于分发密钥的通道必须提供机密性和完整性的保证,这是一个非常复杂的后勤负担。这里提到的对称密钥原语对密钥本身不做任何假设,因此密钥生成算法只是从CSPRNG中获取一定数量的比特位。
在对称密钥密码学中,希望进行安全通信的各方共享一个秘密密钥。
以下是对称密钥密码学中建立共享秘密密钥的过程:
(1)密钥生成:其中一方使用安全的密钥生成算法生成一个随机的秘密密钥。这个密钥通常是一串具有特定长度的比特。
(2)密钥分发:生成的秘密密钥通过安全的渠道分发给参与通信的各方。确保通过安全的通道传输密钥,以确保其机密性和完整性。
(3)密钥存储:每个参与方都安全地存储共享的秘密密钥,以确保其不被泄露或未经授权的人访问。采取适当的密钥管理措施,如使用安全的存储机制和访问控制,来保护密钥。
非对称密钥密码学的显著特点是它不需要私密渠道进行密钥分发。每个参与方执行密钥生成算法,生成一对相关的私钥和公钥。每个参与方的公钥通过具有完整性保证的渠道分发给其他参与方,如下图所示。非对称密钥原语比对称密钥原语更加灵活,但也更加复杂并消耗更多的计算资源。
非对称密钥密码学的过程如下:
(1)密钥生成:每个参与方执行密钥生成算法,生成一对密钥:私钥和公钥。这对密钥是通过数学关系相互关联的。
(2)公钥分发:每个参与方将其公钥分发给其他参与方。分发过程需要通过具有完整性保证的渠道进行,以确保公钥在传输过程中的完整性和安全性。
(3)加密和解密:要发送加密的消息,发送方使用接收方的公钥来加密消息。接收方使用其私钥来解密收到的消息。这样,即使公钥被泄露,只有对应的私钥才能进行解密,确保了通信的机密性。
许多提供完整性保证的加密系统是建立在对固定大小的消息块进行操作的分组密码之上的。发送方使用加密算法对块进行转换,而接收方使用解密算法反转此转换过程。分组密码中的加密算法将消息块的内容混淆在输出中,以便没有解密密钥的对手无法从加密输出中获取原始消息块。
对称密钥加密算法使用相同的密钥进行加密和解密,如下图所示:
上图表明了在对称密钥的安全置换(分组密码)中,相同的秘密密钥必须同时提供给加密算法和解密算法。
在对称密钥加密中,发送方和接收方使用相同的密钥对数据进行加密和解密。这个共享的密钥需要事先在通信双方之间安全地共享。发送方使用密钥对数据进行加密,生成加密后的数据,然后接收方使用相同的密钥对加密的数据进行解密,还原出原始的数据。
目前,基于对称密钥的最受欢迎的分组密码是美国加密标准(AES – Advanced Encryption Standard),它有两个变体,分别使用128位密钥或256位密钥来操作128位的数据块。AES是一个安全的置换函数,因为它可以将任何128位的数据块转换为另一个128位的数据块。最近,美国国家安全局(NSA)要求使用256位AES密钥来保护敏感信息。
关于对称加密算法请参考:https://zhuanlan.zhihu.com/p/441159181
而非对称密钥分组密码使用公钥进行加密,使用相应的私钥进行解密,如下图所示:
上图表明了在非对称密钥分组密码中,加密算法使用公钥进行操作,而解密算法则使用相应的私钥。
在这种情况下,每个参与者都拥有一对数学相关的密钥:公钥和私钥。公钥可以自由分发并为所有人所知,而私钥必须保密,并且只有密钥的拥有者知道。
这里公钥的分发存在一个问题:发送方通信开始前,需要从可信赖的证书机构手中拿到通信方的公钥证书,以安全的方式获取公钥。增加这个环节,是为了确保发送方拿到的公钥真的是通信人的公钥。
引入证书是为了解决公钥密钥的信任问题。
详细请参考:https://zhuanlan.zhihu.com/p/550974452
当发送方想要使用非对称密钥分组密码加密消息时,他们使用接收方的公钥来执行加密算法。该算法将消息按照固定大小的块进行处理,并将其转换为加密后的密文。只有使用相应的私钥才能解密该密文,而私钥只有预期的接收方独占拥有。
接收方在掌握自己的私钥后,使用私钥执行解密算法来反转加密过程。通过将私钥应用于加密的密文,他们可以恢复原始消息的未加密形式。
因此,在非对称密钥分组密码中,加密算法使用公钥进行操作,允许任何人加密专为特定接收方设计的消息。而相应的私钥则由预期的接收方用于解密密文并恢复原始消息。
最广泛部署的非对称密钥分组密码是Rivest-Shamir-Adelman(RSA)算法。RSA是一种被广泛使用和信任的加密算法,用于安全通信和数字签名。
对于非对称加密算法:https://zhuanlan.zhihu.com/p/436455172
一个单独使用的分组密码并不能完全保证机密性。一个显著的问题是,在我们之前的例子中,对于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)对称解密:接收方使用共享的秘密密钥进行解密,恢复原始明文数据。
为了保障数据的完整性,密码学采用了一些技术和机制:
(1)散列函数(Hash Functions):散列函数将输入数据转换为固定长度的散列值。通过对接收到的数据应用散列函数并将结果与预期的散列值进行比较,可以验证数据的完整性。即使对输入数据做了微小的修改,其散列值也会发生显著变化。
(2)消息认证码(Message Authentication Codes,MAC):MAC是一种通过密钥生成固定长度的认证标签,用于验证数据的完整性和身份认证。发送方使用密钥对数据进行哈希运算,并将结果与数据一起发送。接收方使用相同的密钥对接收到的数据进行哈希运算,并将结果与发送方发送的认证标签进行比较,以验证数据的完整性和真实性。
(3)数字签名(Digital Signatures):数字签名使用非对称加密算法结合散列函数来验证数据的完整性、真实性和身份认证。发送方使用私钥对数据进行散列运算,并使用私钥对散列结果进行加密,生成数字签名。接收方使用发送方的公钥对数字签名进行解密,并对接收到的数据进行散列运算,然后将结果与解密后的数字签名进行比较,以验证数据的完整性和真实性。
许多提供完整性保证的加密系统都是建立在安全散列函数之上的。这些散列函数可以处理无限量的输入数据,并产生一个固定大小的输出。安全散列函数具有一些保证,例如预像抗性(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散列函数可以处理任意长度的输入数据,并生成固定大小的散列输出。这使得它们在密码学和信息安全领域得到广泛应用,用于数据完整性检查、数字签名、密码哈希等场景。
在对称密钥设置中,使用消息认证码(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,并将其与从网络接收到的版本进行比较。
提供完整性保证的非对称密钥原语被称为签名(signatures)。数字签名是一种基于公钥密码学的技术,它结合了哈希函数和非对称加密算法,用于对数据进行签名和验证。
消息发送方使用私钥提供给签名算法,并将输出的签名与消息一起传输,如下图所示。消息接收方使用发送方的公钥和签名,输入到签名验证算法中,如果消息匹配签名,则返回TRUE;如果消息被篡改,则返回FALSE。
下图更清晰:
上图表明了在非对称密钥设置中,签名方案能够提供完整性保证。签名是使用发送方的私钥创建的,并使用相应的公钥进行验证。通常会使用密码学安全的哈希函数将大型消息缩减为小型哈希值,然后对哈希值进行签名。
发送方的数字签名,不同接收方都可以验证,因为发送方的密钥是公开的。
对于非对称加密解密:
发送方使用接收方的公钥进行加密,接收方使用自己的密钥解密 – 保证信息的机密性。
加密需要对完整的信息加密,因为接收方在时解密需要还原出完整明文,因此开销较大。
加密 --> 完整的明文。
整个非对称加密解密的过程都是使用的接收方的密钥。
对于数字签名验证:
发送方使用自己的私钥进行签名,接收方使用发送方的公钥进行验证 – 保证信息的完整性。
而签名只需要验证信息的完整性,不需要还原出完整明文,只需要对签名进行解密,比较哈希值即可,开销小。
签名 --> 完整的明文进行哈希运行得到的哈希值。
整个数字签名和解密的过程都是使用发送发的密钥。
具体流程如下:
(1)发送方(生成签名):发送方使用自己的私钥作为输入,并使用密码学安全的哈希函数对消息进行哈希运算,生成一个固定长度的哈希值。然后,发送方使用自己的私钥对哈希值进行签名,生成一个签名值。
(2)发送方(传输消息和签名):发送方将消息和生成的签名一起传输到接收方。通常,签名会附加在消息的末尾或者作为单独的字段发送。
(3)接收方(验证签名):接收方使用发送方的公钥和相同的哈希函数对接收到的消息进行哈希运算,生成一个哈希值。然后,接收方使用发送方的公钥对接收到的签名进行验证。验证过程包括对签名进行解密(使用公钥),以及将解密后的结果与哈希值进行比较。如果两者匹配,则认为签名有效,并确认消息的完整性。
通过使用发送方的私钥进行签名和接收方的公钥(这里的公钥是发送方的公钥)进行验证,签名方案提供了一个强大的完整性保护机制。发送方的私钥是私有的,并且只有发送方能够生成正确的签名。接收方的公钥可以被分发给其他人,用于验证签名的有效性。
使用密码学安全的哈希函数对消息进行哈希运算的目的是将大型消息缩减为固定长度的哈希值。这样做有两个主要好处:一是减小了签名的大小,节省了传输带宽;二是提供了对消息的完整性保护,即使消息很大,只需验证哈希值即可。
签名算法在处理大型消息时可能会具有较高的计算成本。因此,在实践中,通常会先将要传输的消息通过一个密码学强度的哈希函数进行处理,然后将哈希值作为输入提供给签名算法。
具体过程如下:
(1)消息哈希:要传输的消息首先通过密码学强度的哈希函数进行处理,例如SHA-256或SHA-3。这个哈希函数将整个消息作为输入,并生成一个固定长度的哈希值作为输出。
(2)签名:签名算法不再直接对整个消息进行签名,而是采用前一步生成的哈希值作为输入。签名算法使用发送方的私钥基于哈希值生成签名。
(3)传输:原始消息与生成的签名一起传输。接收方需要访问与发送方相同的哈希函数,以重新生成用于验证的哈希值。
(4)验证:接收方在接收到消息和签名后,使用相同的哈希函数对接收到的消息进行哈希处理,生成一个哈希值。然后,接收方使用发送方的公钥和接收到的签名来验证消息的完整性。验证算法检查计算得到的哈希值是否与使用公钥从签名中获得的哈希值匹配。如果匹配,则表示签名有效,消息被认为是真实且未被篡改的。
通过在签名之前使用哈希函数,可以减少签名算法的计算开销,因为它只需处理固定长度的哈希值,而不是整个消息。此外,哈希函数具有将任意大小的消息缩减为固定长度值的特性,使得处理和传输更加高效。
这种方法还提供了安全性的好处,因为哈希函数被设计为单向函数,即仅通过哈希值无法计算出原始消息。这确保了原始消息的完整性,因为对消息的任何修改都会导致不同的哈希值。
数字签名并没有对整个文件进行签名,而是对文件的hash值进行了签名。
正确使用数字签名,有一个大前提,那是用于验证签名的公钥必须属于真正的发送者。即便数字签名算法再强大,如果你得到的公钥是伪造的,那么数字签名也会完全失效。
为了能够确认自己得到的公钥是否合法,我们需要使用证书。所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。
为了解决这个问题,证书被引入进来。证书其实就是可信第三方对公钥的签名。
总之,在签名之前使用密码学强度的哈希函数对消息进行预处理是一种实用的方法,可在处理大型消息时高效地保持签名过程的完整性和安全性。
签名只能保证信息的完整性不能保证信息的机密性。
对于签名请参考:https://zhuanlan.zhihu.com/p/588777811
(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保证的一种常见解决方案依赖于单次使用的随机数,即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
https://preyproject.com/blog/types-of-encryption-symmetric-or-asymmetric-rsa-or-aes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。