热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【差分隐私与密码学】密码学入门(一)

Networksecurity-privatecommunicationinapublicworld密码学(一)写在前面的话Introductionto


Network security - private communication in a public world 密码学(一)

  • 写在前面的话
  • Introduction to Cryptography
    • Computational Difficulty
    • To Publish or Not to Publish
    • Secret Codes
  • Breaking an Encryption Scheme
    • Ciphertext Only
    • Known Plaintext
    • Chosen Plaintext
  • Types of Cryptographic Functions
  • Secret Key Cryptography
    • Security Uses of Secret Key Cryptography
    • Transmitting Over an Insecure Channel
    • Secure Storage on Insecure Media
    • Authentication
    • Integrity Check
  • Public Key Cryptography
    • Security Uses of Public Key Cryptography
    • Transmitting Over an Insecure Channel
    • Secure Storage on Insecure Media
    • Authentication
    • Digital Signatures
  • Hash Algorithms
    • Password Hashing
    • Message Integrity
    • Message Fingerprint
    • Downline Load Security
    • Digital Signature Efficiency


写在前面的话

差分隐私与密码学之间存在重要的联系,所以这段时间会涉猎一些密码学相关的知识。这本书是国外网络安全专业必修书籍,一共666页,我在这本书里更关注密码学部分。差分隐私是由密码学的安全语义中诞生的,大家可以去看看这篇博客。
在这里插入图片描述


Introduction to Cryptography

密码学这个词来自于希腊语单词κρυπτο(隐藏的或秘密)和γραφη(书写)。因此,密码学是一门秘密写作的艺术。更普遍地说,人们认为密码学是一种破坏信息的艺术,它允许一种秘密的破坏方法。密码学提供的基本服务是能够在参与者之间发送信息,从而防止其他人阅读信息。

明文:以其原始形式出现的消息

密文:混乱的信息

加密:从明文中生成密文的过程

解密:加密的反面
在这里插入图片描述
密码学家发明了聪明的密码,而密码分析人员却试图破解这些密码。这两个学科不断地试图保持相互领先地位。

密码学的基本本质:如果许多聪明的人没能解决一个问题,那么它可能就无法(很快)得到解决。

密码系统:算法+秘密值。

秘密值:密钥,拥有钥匙的原因是很难继续设计新的算法来允许可逆的信息干扰,而且很难快速向你想开始安全通信的人解释新设计的算法。

有了一个好的密码方案,完全可以让每个人,包括坏人(和密码分析人员)都知道这个算法,因为没有密钥的算法知识不会有助于解开信息。

密钥的概念类似于组合锁的组合。虽然组合锁的概念是众所周知的(你按照正确的顺序拨入密码,锁就会打开),但在不知道组合的情况下,你无法轻松地打开组合锁。


Computational Difficulty

对于密码算法来说,对合理高效的好人进行计算是很重要的。好人是那些知道钥匙的人。没有密钥的加密算法并非不可能破解。一个坏人可以简单地尝试所有可能的钥匙,直到其中一个成功。密码方案的安全性取决于坏人打破它需要多少工作。如果最好的方案需要1000万年才能停止使用世界上所有的计算机,那么它可以被认为是相当安全的。

我们对密码学家用好人,对密码分析家用坏人。这是一个方便的速记,而不是一个道德上在任何给定的情况下的判断,你认为哪一边是好的或坏的取决于你的观点。

回到组合锁的例子,一个典型的组合可能由三个数字组成,每个数字在1到40之间。假设输入一个组合需要10秒钟。这对好人来说相当方便。这对坏人要做多少工作?有403种可能的组合,即64000种。每次尝试10秒,尝试所有的组合需要一周的时间,尽管平均只需要一半的时间(即使正确的数字总是你尝试的最后一个!)。

通常,可以通过延长密钥来使方案更安全。在组合锁的类比中,使钥匙更长,将包括需要拨入四个号码。这将使好人更有作用。现在可能需要13秒才能拨入这个组合。但是坏人有40倍的组合可以尝试,每组13秒,所以这需要一年的时间来尝试所有的组合。(如果花了那么长时间,他可能会想停下来吃饭或睡觉)。

有了密码学,计算机就可以用来详尽地尝试密钥。电脑比人们快得多,而且它们不会累,所以每秒可以尝试成千上万的键。此外,如果你有多台电脑,很多键可以并行尝试,所以花更多的电脑可以节省时间。

有时,一个密码算法有一个可变长度的密钥。通过增加密钥的长度,可以使其更加安全。增加一点钥匙的长度会使好人的工作有点困难,但会使坏人的工作困难到两倍(因为可能的钥匙的数量翻倍)。有些密码算法有固定长度的密钥,但如果有必要,可以设计出具有较长密钥的类似算法。如果计算机的速度快1000倍,使坏人的工作变得相当实际,使关键延长10比特将使坏人的工作像计算机速度提高之前一样困难。然而,这对好人来说要容易得多(因为他们的电脑速度的增加远远超过键长度的增加)。所以电脑得到的速度越快,好人的生活就越好。

请记住,破解密码方案通常只是获得你想要的东西的一种方法。例如,一个螺栓切割器无论在组合中有多少个数字都能工作。


To Publish or Not to Publish

有些人认为,尽可能保密的加密算法会提高其安全性。另一些人则认为,发布该算法,以便使其众所周知,将提高其安全性。一方面,似乎保持算法保密必须更安全。它使更多的工作为密码分析人员试图弄清楚算法是什么。

发布算法的论点是,坏人最终可能会发现它,所以最好告诉很多非恶意的人关于算法,这样万一有弱点,一个好人会发现它们,而不是一个坏人。一个发现弱点的好人会警告人们,这个系统有弱点。出版物提供了大量来自学术界的免费咨询,因为密码分析师正在寻找弱点,以便发表有关这些弱点的论文。一个发现弱点的坏人会利用弱点来做坏人的事情,比如挪用钱或窃取商业秘密。

很难保持算法保密,因为如果一个算法被广泛使用,很可能确定攻击者将设法学习算法通过逆向工程实现分布式,或者仅仅因为更多的人知道东西越有可能的信息泄漏到错误的地方。过去,“好”密码系统在经济上不可行,所以对算法保密需要额外的保护。我们相信(我们希望如此吗?)今天的算法已经足够安全了,因此这是没有必要的。

今天的常见做法是,要发布大多数商业密码系统,并对军事密码系统保密。如果一种商业算法今天还没有公布,它可能是出于商业秘密的原因,或者因为这使得它更容易获得出口批准,而不是提高其安全。我们怀疑军事密码不公开主要是为了防止敌人掌握好的密码方法,而不是让它们不加密分析我们的密码。


Secret Codes

我们使用术语密码和密码可以互换来表示任何加密数据的方法。有些人在这些术语之间做了一个我们觉得没什么用的微妙区别。

最早有记载的密码被认为是凯撒的密码。如果这个信息是用英文写的,凯撒密码的工作方式如下。替换信息中的每个字母,该字母为3字母表中后面的字母(并从Z环绕到A)。因此,A就会变成D,以此类推。例如,12个将成为GRCHQ。一旦你弄清楚发生了什么,就很容易阅读以这种方式加密的信息(当然,除非原始消息是希腊文的)。

20世纪40年代,作为船长午夜秘密解码器戒指。(有时,这可能违反了分发加密硬件的导出控制!)这个变体是在1到25之间选择一个秘密数字n,而不是总是使用3。替换信息的每个字母,字母n更高(当然从Z环绕到A)。因此,如果秘密数字是1,a将变成B,以此类推。例如,HAL将成为IBM。如果秘密号码是25,那么IBM将会变成HAL。不管n的值如何,因为只有26个可能的ns可以尝试,所以如果你知道正在使用这个密码,并且在消息解密后可以识别它,那么仍然很容易破坏这个密码。

所开发的下一种密码系统被称为单字母密码,它由一个字母到另一个字母的任意映射组成。有26!个可能的字母对,大约是4x1026。[记住,n!,读的是“n阶乘”,意思是n(n-1)(n-2)…1.]这可能看起来是安全的,因为尝试所有的可能性,如果每一次尝试需要1微秒,大约需要10万亿年。然而,通过对语言的统计分析(知道某些字母和字母组合比其他字母更常见),结果是相当容易打破的。例如,许多日报都有一个每日密码,这是一个单字母密码,那些在乘地铁上班时喜欢这种东西的人可以破解。一个例子是
Cf lqr’xs xsnyctm n eqxxqgsy iqul qf wdcp eqqh, erl lqrx qgt iqul!

计算机已经使更复杂的密码方案变得更加必要和可能。必要的,因为电脑可以尝试钥匙的速度会耗尽一群职员;而且可能,因为计算机可以快速执行复杂的算法,没有错误。


Breaking an Encryption Scheme

当我们说一个坏人弗雷德破坏了一个加密方案时,我们是什么意思?这三种基本的攻击只被称为密文、已知的明文和已选择的明文。


Ciphertext Only

在一次仅限密文的攻击中,弗雷德看到了(并可能存储了)一些他可以随意分析的密文。通常情况下,一个坏人要获得密文并不难。(如果一个坏人不能访问这些加密的数据,那么从一开始就没有必要加密这些数据了!)

如果弗雷德只能看到明文,他怎么能弄清楚明文呢?一种可能的策略是搜索所有的键。弗雷德依次用每个密钥尝试解密操作。对于这次袭击,弗雷德必须能够认识到他何时成功了。例如,如果消息是英语的文本,那么具有错误密钥的解密操作不太可能产生看起来像可理解文本的东西。因为对弗雷德来说,能够区分明文和胡言乱语是很重要的,所以这种攻击有时被称为可识别的明文攻击。

弗雷德有足够的密文也很重要。例如,使用单字母密码的示例,如果Fred唯一可用的密文是XYZ,那么就没有足够的信息。有许多可能的字母替换会导致一个合法的三个字母的英语单词。弗雷德没有办法知道XYZ对应的明文是CAT还是HAT。事实上,在下面的句子中,任何一个单词都可以是XYZ的明文:

这只热猫很伤心,但你现在可以坐着用她的红色大笔了。
通常没有必要搜索很多键。例如,身份验证方案Kerberos根据一个简单的、发布的算法从Alice的密码分配给用户DES密钥。如果Alice不明智地选择了她的密码(比如字典中的一个单词),那么弗雷德不需要搜索所有256个可能的DES关键的键值,而只需要尝试10000个常见英语单词的派生键。

由于密码分析人员可以访问密码文,因此密码算法必须不受纯密文的攻击。但在很多情况下,密码分析人员可以获得额外的信息,因此设计密码系统来抵御接下来的两次攻击也很重要。


Known Plaintext

有时,攻击者的生活更容易过。假设Fred以某种方式获得了一些<明文,密文>对。他是怎么得到这些的?一种可能性是,秘密数据可能不会永远保密。例如,这些数据可能包括指定下一个要被攻击的城市。一旦攻击发生,前一天的密文的明文现在就知道了。

有了单字母密码,少量已知的明文将是一笔财富。从中,攻击者将学习大量最常见字母的映射(弗雷德获得的明文中使用的每个字母)。一些加密方案可能足够好,只防止密文攻击,但对已知的明文攻击不够好。在这些情况下,设计使用这种加密算法的系统,以减少坏人获得<明文、密文>对的可能性变得很重要。


Chosen Plaintext

在极少数情况下,攻击者的生活可能会更容易一些。在一个被选择的明文攻击中,弗雷德可以选择任何他想要的明文,并让系统告诉他相应的密文是什么。这样的事情怎么可能发生呢?

假设电报公司提供了一项他们为你加密和传输信息的服务。假设弗雷德偷听了爱丽丝的加密信息。现在他想打破电报公司的加密方案,这样他就可以解密爱丽丝的信息了。

他可以通过支付电报公司为他发送加密的信息来获得他选择的任何信息的相应密文。例如,如果弗雷德知道他们使用的是单字母密码,他可能会发送信息

在这里插入图片描述

知道他会因此将字母表中的所有字母进行加密,然后能够确定地解密任何加密的信息。

一个只针对密文和已知明文攻击的密码系统可能仍然容易受到所选择的明文攻击。例如,如果弗雷德知道爱丽丝的信息是投降或战斗,那么无论多么美妙的加密方案电报公司使用,他所要做的就是发送两个消息,看看哪一个看起来像加密数据他看到爱丽丝的消息传输。

一个密码系统应该能够抵抗所有这三种攻击。这样,它的用户就不需要担心攻击者是否有机会知道或选择明文了。就像同时佩戴腰带和吊带器一样,许多使用加密算法的系统也会竭尽全力防止任何被选择的明文攻击的机会。


Types of Cryptographic Functions

加密函数有三种:哈希函数、密钥函数和公钥函数。我们将描述每一种类型是什么,以及它对什么有用。公钥密码学涉及到使用两个密钥。密钥密码学涉及到使用一个密钥。哈希函数涉及到使用零键!试着想象这可能意味着什么,什么使用这样的算法,每个人都知道没有密钥,但它在安全用途。

由于密钥密码学可能是最直观的,所以我们将首先描述它。


Secret Key Cryptography

密钥密码学涉及到使用单一密钥。给定一条消息(称为明文)和密钥,加密会产生难以理解的数据,这和明文的长度差不多。解密是加密的反向加密,并使用与加密相同的密钥。
在这里插入图片描述
密钥密码学有时被称为传统密码学或对称密码学。The Captain Midnight code和单字母密码都是密钥算法的例子,尽管两者都很容易破解。在本章中,我们将描述加密算法的功能,但不描述特定算法的细节。


Security Uses of Secret Key Cryptography

接下来的几个部分将描述人们可能使用密钥密码学所做的事情的类型。


Transmitting Over an Insecure Channel

在传输信息时,往往不可能防止窃听。例如,可以点击电话对话,信件可以被拦截,并且在局域网上传输的消息可以被未经授权的电台接收。

如果你和我同意一个共享的秘密(一个密钥),那么通过使用密钥密码,我们可以通过一个可以点击的媒体上发送信息,而不用担心窃听者。我们所需要做的就是让发送方加密消息,而接收方使用共享的秘密来解密它们。窃听者只会看到难以理解的数据。

这是密码学的经典用法。


Secure Storage on Insecure Media

如果我有我想保存的信息,但我想确保没有其他人可以看,我必须能够存储媒体,我确定没有人能得到它。在聪明的小偷和法庭命令之间,很少有真正安全的地方,这些都不方便。如果我发明了一个密钥并使用密钥加密信息,我可以把它存储在任何地方,只要我能记住密钥,它是安全的。当然,忘记关键字会使数据不可挽回地丢失,所以必须非常小心地使用它。


Authentication

在间谍电影中,当两个不认识的特工必须交换信息时,他们会得到一个密码或密码短语。这就有一个问题,任何人偶然听到他们的对话或错误的开始对话,都可以获得对以后回放有用的信息并模仿他们正在和他们交谈的人。

强身份验证的意思是某人可以证明知道一个秘密而不透露这个秘密。使用密码学可以实现强大的身份验证。当两台计算机试图通过一个不安全的网络进行通信时,强身份验证特别有用(因为很少有人能在他们的头脑中执行加密算法)。假设Alice和Bob共享一个密钥KAB,他们想要验证他们是在互相交谈。他们每个人都选择一个随机数,这被称为挑战。爱丽丝选择了rA。鲍勃选择了rB。使用密钥KAB加密的值x称为对挑战x的响应。图2-1显示了Alice和Bob如何使用挑战和响应来相互验证所示。
在这里插入图片描述

如果有人,说弗雷德,模仿爱丽丝,他可以让鲍勃加密价值(虽然弗雷德不能告诉他说话的人真的鲍勃),但这个信息不会有用的模仿鲍勃真正的爱丽丝,因为真正的爱丽丝会选择一个不同的挑战。如果爱丽丝和鲍勃完成了这个交换,他们已经向对方证明他们知道KAB,而没有向骗子者或窃听者透露。请注意,在这个特殊的协议中,弗雷德有机会获得一些<选择的明文、密文>对,因为他可以声称自己是鲍勃,并要求爱丽丝为他加密一个挑战。因此,必须从一个足够大的空间中选择挑战,比如264个值,这样就不会有明显的机会使用相同的值两次。

这是加密身份验证算法的一般思想,尽管这个特殊的算法有一个微妙的问题,这将阻止它在大多数计算机到计算机的情况下有用。(我们宁愿不提出这个问题,但我们觉得我们有必要这么说,以免提醒那些已经知道这些东西的人,以及那些会意识到该协议不安全的人。)


Integrity Check

密钥方案可用于生成与消息关联的固定长度的密码校验和。这是对密钥技术的一种相当不直观的使用。

什么是支票金额?普通(非加密)校验和可以防止消息的意外损坏。术语校验和的原始推导来自于将消息分解成固定长度的块(例如,32位单词)并将它们相加的操作。该总和与消息一起发送。接收方类似地分解消息,重复加法,并检查总和。如果消息在途中被打乱,该总和将与发送的总和不匹配,并且消息被拒绝,当然,除非传输中有两个或两个以上的错误相互取消。事实证明,这并不是不太可能,因为如果不稳定的硬件在某个地方有点关闭,它很可能会在其他地方打开相应的一点。为了防止硬件上的这种“常规”缺陷,我们设计了更复杂的校验和。但这些仍然只能防止有故障的硬件,而不是智能攻击者。由于CRC算法被发布,一个攻击者是谁想要更改一个消息,可以这样做,计算新消息上的CRC,并继续发送它。

为了防止对消息进行恶意更改,需要一个秘密校验和算法,这样不知道该算法的攻击者就无法计算出将该消息作为真实消息而被接受的正确校验和。与加密算法一样,最好有一个通用的(已知)算法和一个密钥。这就是密码校验和所做的事情。给定一个密钥和一个消息,该算法生成一个固定长度的消息认证码(MAC),可以与消息一起发送。MAC通常被称为MIC(消息完整性代码)。我们更喜欢MIC这个术语,MIC用于PEM等标准,但MAC这个术语似乎已经变得更加流行了。

如果有人要修改消息,但他们不知道密钥,他们将不得不猜测一个MAC,而正确的机会取决于长度。一个典型的MAC至少48位长,所以摆脱伪造的消息只有一个280万亿(或大约的机会去拉斯维加斯的一角钱,让它骑在红色的轮盘赌表,直到你有足够的偿还美国国债)。

这种信息完整性代码一直被用来保护大型银行间电子资金转移的完整性。这些消息不对窃听者保密,但它们的完整性得到了保证。


Public Key Cryptography

公钥密码学有时也被称为非对称密码学。公钥密码学是一个相对较新的领域,发明于1975年DIFF76b(至少这是第一个发表的报告,据传美国国家安全局或类似组织可能更早地发现了这项技术)。与密钥密码学不同,密钥是不共享的。相反,每个人都有两个密钥:一个是不需要向任何人透露的私钥,另一个是全世界最好都知道的公钥。

请注意,我们称私钥为私钥,而不是密钥。本约定试图在任何情况下清楚是否使用公钥密码学或密钥密码学。有些人在公钥密码中使用密钥表示密钥,在密钥技术中使用密钥。我们希望说服人们只使用密钥一词作为密钥密码学中使用的单一密号。私钥一词应该是指公钥密码学中不得公开的密钥。

不幸的是,公共和私人这两个词都以p开头。我们有时希望一个字母指其中一个键。字母p就不行了。我们将使用字母e来引用公钥,因为公钥是在加密消息时使用的。我们将使用字母d来引用私钥,因为私钥用于解密消息。加密和解密是两个相互逆的数学函数。
在这里插入图片描述

在这里插入图片描述
使用公钥技术还可以做另外一件事,那就是在消息上生成数字签名。数字签名是一个与消息相关联的数字,如一个校验和或2.4.5完整性检查中描述的MAC。然而,与任何人都可以生成的校验和不同的是,数字签名只能由知道私钥的人生成。公钥签名与密钥MAC不同,因为验证MAC需要了解与创建它的方法相同的秘密。因此,任何可以验证MAC的人也可以生成一个MAC,因此能够替换不同的消息和相应的MAC。相比之下,验证签名只需要了解公钥。所以爱丽丝可以通过生成一个她只能生成的签名来签名一个消息,而其他人可以验证这是爱丽丝的签名,但不能伪造她的签名。这被称为签名,因为它与手写签名共享的属性,它可以识别一个签名为真实的,而不能伪造它。


Security Uses of Public Key Cryptography

公钥密码可以做任何密钥密码学,但已知的公钥密码算法比最著名的密钥密码算法慢几个数量级,因此通常与密钥算法一起使用。公钥密码技术非常有用,因为基于公钥技术的网络安全往往更容易配置。公钥密码可以在通信开始时进行身份验证,并建立临时共享密钥,然后使用密钥使用密钥技术对对话的其余部分进行加密。

例如,假设爱丽丝想和鲍勃谈谈。她用他的公钥加密一个密钥,然后用那个密钥加密她想发给他的任何东西。由于密钥比消息小得多,使用慢的公钥加密密钥并不是对性能的影响。只有Bob才能解密该密钥。然后,他可以使用这个密钥与发送该信息的人交流。请注意,考虑到这个协议,Bob不知道是Alice发送了消息。这可以通过让爱丽丝使用她的私钥对加密的密钥进行数字签名来解决。

现在我们将描述人们对公钥密码学可能会做的事情的类型。


Transmitting Over an Insecure Channel

假设Alice的<公钥,私钥>对是A,dA>。假设Bob的密钥对是B,dB>。假设爱丽丝知道鲍勃的公钥,而鲍勃也知道爱丽丝的公钥。实际上,准确学习他人的公钥是使用公钥密码学的最大挑战之一,并将在第15章PKI(公钥基础设施)中详细讨论。但现在,不要担心。
在这里插入图片描述


Secure Storage on Insecure Media

这和人们使用密钥密码学是一样的。你可以用公钥加密数据。那么除了你,没有人能解密它,因为解密需要使用私钥。出于性能原因,您可能不会直接使用公共公钥加密数据,而是随机生成一个密钥,使用该密钥加密数据,并使用公共密钥加密该密钥。与密钥技术一样,如果你丢失了私钥,数据就会不可挽回地丢失。如果你担心这一点,你可以在你信任的人的公钥下加密一个额外的数据加密密钥的副本,比如你的律师。或者您可以与信任的人存储私钥的副本(参见24.9.1密钥托管)

公钥技术比密钥技术的密钥技术具有重要优势。爱丽丝可以在不知道他的解密密钥的情况下为他加密一条消息。


Authentication

对于密钥密码学,如果爱丽丝和鲍勃想要交流,他们必须分享一个秘密。如果鲍勃想能够向许多实体证明他的身份,那么使用密钥技术,他将需要记住很多密钥,每个实体都有一个,他想证明自己的身份。也许他可以使用与爱丽丝和卡罗尔一样共享的秘密,但这样的缺点是,卡罗尔和爱丽丝可以互相模仿鲍勃。

公钥技术更加方便。鲍勃只需要记住一个秘密,那就是他自己的私钥。的确,如果Bob想要能够验证数千个实体的身份,那么他将需要知道(或在必要时能够获得)数千个公钥。在第15章PKI(公钥基础设施)中,我们将讨论如何做到这一点。

下面是一个例子,说明爱丽丝如何使用公钥密码学来验证鲍勃的身份,假设爱丽丝知道鲍勃的公钥。Alice选择一个随机数r,使用Bob的公钥eB进行加密,并将结果发送给Bob。鲍勃通过解密消息并将r发送回爱丽丝来证明他知道dB。

在这里插入图片描述
公钥身份验证的另一个优点是,Alice不需要保存任何秘密信息来验证Bob。例如,Alice可能是一个备份磁带未加密且容易被盗的计算机系统。通过基于密钥的身份验证,如果卡罗尔偷了一盘备份磁带,并读取了爱丽丝与鲍勃分享的密钥,她就可以欺骗鲍勃,以为自己就是爱丽丝(或者骗爱丽丝以为她是鲍勃)。相比之下,对于基于公钥的身份验证,关于Alice备份磁带的唯一信息是公钥信息,并且不能用于模拟Bob。


Digital Signatures

在这里插入图片描述

证明一个消息是由特定的通常是有用的。如果使用公钥技术,这一点很容易实现。Bob的签名只能由知道Bob的私钥的人生成。而签名则取决于m的内容。如果m以任何方式被修改,则签名将不再匹配。因此,数字签名提供了两个重要的功能。他们证明了是谁生成了这些信息,并且他们证明了自生成了消息和匹配的签名以来,任何人都没有以任何方式修改过这些信息。

与基于密钥的加密MACs非否定性相比,数字签名具有一个重要的优势。假设鲍勃卖小部件,而爱丽丝经常买它们。Alice和Bob可能会同意,Alice将向订单小部件发送电子邮件消息,而不是通过邮件和已签名的采购订单来下订单。为了防止有人伪造订单并导致Bob生产的小部件比Alice实际需要的要多,Alice将在她的信息中包含一个消息完整性代码。这可以是基于密钥的MAC签名,也可以是基于公钥的签名。但假设在爱丽丝下了一个大订单后的某个时候,她改变了主意(小部件市场已经触底)。由于取消订单会受到很大的处罚,所以她并不承认她要取消订单,而是否认她曾经下过订单。鲍勃起诉。如果爱丽丝根据她与Bob共享的密钥计算MAC来验证消息,鲍勃知道爱丽丝真的下了订单,因为除了鲍勃和爱丽丝之外没有人知道这个密钥。如果鲍勃知道他没有创造这个信息,他就知道一定是爱丽丝。但他不能向任何人证明它!既然他知道爱丽丝以前签署命令的密钥,他可以自己伪造签名,但他不能向法官证明他没有!如果这是一个公钥签名,他可以显示已签名的信息给法官,法官可以核实它是用爱丽丝的钥匙签名的。爱丽丝仍然可以说有人偷了她的钥匙(甚至可能是真的!),但是爱丽丝和鲍勃之间的合同可以合理地要求她对不当保护钥匙造成的损害负责。与共享密钥的密钥加密不同,您总是可以知道谁负责使用私密钥生成的签名。


Hash Algorithms

哈希算法也被称为消息摘要或单向转换。

加密哈希函数是一种数学转换,它接受任意长度的消息(转换成比特字符串),并从中计算一个固定长度(短)数。

我们将把信息的哈希为m,h(m)。它具有以下属性:
1、对于任何消息m,计算h(m)都相对容易。这只是意味着,为了实现实用性,它不需要大量的处理时间来计算哈希。
2、给定h(m),没有方法找到一个哈希到h(m)的m和计算h(m)要容易得多。
3、尽管很明显,许多不同的m值将被转换为相同的值h(m)(因为m有更多的可能值),但在计算上找到两个散列到同一事物的值是不可行的。

一个可能工作的函数的例子是取消息m,把它当作一个数字,添加一些大的常数,将其平方,并取中间的n个数字作为散列。您可以看到,虽然这不难计算,但如何找到会产生特定哈列的消息,或者如何找到两个具有相同消息哈列。结果是,这不是一个特别好的消息摘要,我们将在第5章哈希和消息摘要中给出安全消息摘要函数的例子。但是消息摘要函数的基本思想是,输入被破坏得如此严重,进程不能逆转。


Password Hashing

当用户键入密码时,系统必须能够确定用户是否正确。如果系统存储未加密的密码,那么任何能够访问系统存储或备份磁带的人都可以窃取密码。幸运的是,系统不需要知道一个密码来验证其正确性。(一个正确的密码就像色情作品一样。你不知道它是什么,但你一看到它就知道了。)

系统可以存储密码的哈希值,而不是存储密码。当提供密码时,它会计算密码的散列,并将其与存储的值进行比较。如果密码匹配,则认为密码正确。如果攻击者获得了散列密码文件,那么它不会立即有用,因为密码不能从散列中导出。历史上,一些系统使密码文件公开可读,这表示了对哈希安全性的信心。即使哈希值中没有密码缺陷,也可以猜测密码并散列它们,看看它们是否匹配。如果用户粗心大意,选择了一个可以猜测的密码(比如,一个出现在5万个单词的字典或通用名中的单词),即使加密可靠,穷尽搜索也会“破解”密码。出于这个原因,许多系统隐藏散列密码列表(以及不应该隐藏的列表)。


Message Integrity

加密散列函数可用于生成MAC,以保护通过不安全媒体传输的消息的完整性,这与密钥密码非常相同。

如果我们只是发送消息,并将消息的哈希作为MAC使用,这将是不安全的,因为哈希函数是众所周知的。坏人可以修改消息,并为新消息计算一个新的哈希值,并传输它。

但是,如果Alice和Bob就一个秘密达成了协议,那么Alice可以使用哈希,通过获取消息、连接秘密和计算消息|秘密的哈希,来为发送给Bob的消息生成一个MAC。这被称为键控散列。然后,Alice将散列和消息(没有秘密)发送给Bob。Bob将秘密连接到接收到的消息中,并计算结果的散列。如果这与接收到的哈希相匹配,Bob可以相信这个消息是由知道这个秘密的人发送的。[注意:使其实际安全有一些密码上的微妙之处;参见5.2.2用哈希值计算一个MAC]。

在这里插入图片描述


Message Fingerprint

如果您想知道一些大型数据结构(例如程序)是否在一天之间被修改,您可以在一些防篡改备份存储中保留数据副本,并定期将其与活动版本进行比较。使用哈希函数,您可以保存存储:只需将数据的消息摘要存储在防篡改备份存储中(因为哈希很小,这可能是文件柜中的一张纸)。如果消息摘要没有更改,那么您可以确信任何数据都没有更改。

注意可能成为使用者,如果你还没有意识到,它已经想到坏人,计算哈希的程序也必须独立保护,以安全。否则,坏人可以改变文件,但也可以改变哈希程序来报告校验和,就好像文件没有改变一样!


Downline Load Security

通常的做法是,将特殊用途的设备连接到网络上,如路由器或打印机,它们没有非易失性存储器来存储它们通常运行的程序。相反,他们保持引导程序足够智能,从网络获取一个程序并运行它。该方案称为下行负载。

假设您要下载加载程序并确保它没有损坏(无论是否故意)。如果您知道程序的正确哈希,那么您可以计算已加载程序的哈希,并确保它在运行程序之前具有正确的值。


Digital Signature Efficiency

最著名的公钥算法具有足够的处理器密集型能力,因此需要计算消息的消息摘要并对其进行签名,而不是直接对消息进行签名。消息摘要算法的处理器密集型要少得多,而且消息摘要也比消息摘要要短得多。


推荐阅读
author-avatar
迪迪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有