=Start=
缘由:
备考CISSP,学习、整理在看《CISSP官方学习指南(第7版)》时的一些知识点,方便以后快速复习。
正文:
参考解答:
第6章 密码学与对称加密算法
6.1 密码学历史上的里程碑
6.1.1 凯撒密码(凯撒密码是单一字母的替代置换密码,也被称C3密码。)
6.1.2 美国内战
6.1.3 Ultra与Enigma
6.2 密码学基础
6.2.1 密码学的目标
安全从业人员利用密码系统达到下列4个基本目标:机密性、完整性、身份认证和不可否认性。实现每个目标都需要满足很多设计需求,并且不是所有的加密系统都要达到所有4个目标。
1.机密性
机密性确保数据在存储中(例如,存储在磁盘上)或在传输中(例如,在两方或多方之间传递)保持秘密状态。
2.完整性
完整性确保数据在传输的过程中不会被修改。如果采用了适当的完整性机制,那么消息的接收者可以确定接收到的消息与发送出的消息完全相同。
3.身份认证
身份认证对声明的系统用户身份进行验证,并且是密码系统的主要功能。
4.不可否认性
不可否认性为接收者提供了担保,保证消息确实来自发送者而不是来自伪装成发送者的人。不可否认性能够防止发送者宣称原先从未发送过信息(也被称为否认消息)。秘密密钥(或对称密钥)密码系统(如简单的替代密码)并不提供对不可否认性的保证。
6.2.2 密码学概念
所有密码学算法都依赖密钥来维护其安全性。在很大程度上,密钥只不过是一个数字。密钥往往是一个非常大的二进制数,不过仍然是一个数字。
保护密钥的安全是非常重要的。事实上,从密码学获得的所有安全性就只能依赖于保证秘密使用密钥的能力。
Kerchoff原则
大多数算法都遵循Kerchoff原则,这条原则使算法已知和公开,并且九许任何人检查和测试算法。说的明确一些,Kerchoff原则(也被称为Kerchoff假设)就是算法应当公开,但是所有密钥都应当保密。这条原则可归纳为“敌人知道了这个体系”。
6.2.3 密码学的数学原理
1.二进制数学
2.逻辑运算
3.模函数
4.单向函数(单向函数是一种数学运算,它可以通过所有可能的输入值组合得出结果,但是反向得出输入值却是不可能的。公钥密码系统都建立在单向函数的基础上。但实际上,人们从未证明过任何指定的己知函数确实是单向的。密码员依赖于他们认定的单向函数,但是理论上它们可能会被将来的密码分析人员破解。)
5.随机数
6.零知识证明
7.分割知识(如果执行某个操作所需的信息或权限在多个用户之间分配时,任何一个人都没有足够的权限来危害环境的安全性。单个解决方案中包含的这种职责分离和两人控制被称为分割知识。)
8.工作函数
通过使用工作函数或工作因数,从成本和/或时间方面来度量所有努力,就可以度量密码学系统的强度。通常,针对加密系统执行完全穷举攻击所需的时间和努力,就是工作函数所表示的内容。密码系统提供的安全性和保护与工作函因数的值成正比。工作函数的大小应当与受保护资产的相对值匹配。工作函数只需稍大于受保护资产的时间值。
6.2.4 密码
1.编码与密码
人们常常将词汇”编码”和”密码”互换使用,但是从技术上讲,它们是不能互换的。在这两个概念之间,存在很重要的差异。编码是密码学系统中表示词汇或短语的符号,有时是秘密的,但是不一定提供机密性。
另一方面,密码总是意味着隐藏消息的真实含义。密码使用各种技术修改和/或重新排列消息中的字符或比特,从而实现机密性。
提示:
记住编码和密码之间差异的一种简单方法是:编码针对词汇和短语,而密码则针对单独的字符和比特。
2.换位密码
换位密码使用某种加密算法重新排列明文消息中的字母,从而形成密文消息。解密算法只需反演加密转换过程就可以得到原始消息。
3.替代密码(比如:单字母替代密码——凯撒密码;多字母替代密码的一个著名示例是Vigenere密码)
替代密码使用加密算法将明文消息中的每一个字符或比特都替换为不同的宇符。
4.一次性填充(一次性填充也被称为Vemam密码)
一次性填充是一种极为强大的替代密码。一次性填充对明文消息的每个字母都使用一个不同的字母表。
一次性填充一直被用于保护极其敏感的通信,不能被广泛使用的主要障碍是很难生成,以及分发和保护所需的冗长密钥。由于密钥的长度问题,一次性填充在实际中只可用于短消息。
5.滚动密钥密码(也被称为书籍密码)
在这种密码中,加密密钥与消息本身一样长,并且往往从一般的书籍中选取。
6.分组密码
分组密码按消息的”组块”或分组进行操作,并且对整个消息分组同时应用加密算法。换位密码就是分组密码的一个例子。
7.流密码
流密码对消息、(或数据流)中的每个字符或每一位进行操作,每次只处理一个字符/一位。凯撒密码就是流密码的一个例子。一次性填充也是一种流密码,这是因为该算法对明文信息中的每个宇符独立进行操作。流密码也可以作为一种分组密码使用。在此类情况下,某个缓冲区被填满实时数据,随后这些数据作为分组进行加密井传送给接收方。
8.混淆与扩散
密码学算法依靠两种基本的操作来隐藏明文信息:混淆与扩散。混淆出现在明文和密钥的关系十分复杂时,此时攻击者不能通过继续修改明文和分析产生的密文来确定密钥。扩散出现在明文的改变导致多种变化时,这些变化被扩散到整个密文中。
6.3 现代密码学
6.3.1 密钥
现代密码系统并不依赖于其算法的安全性。现代密码系统不依赖于保密的算法,而是依赖于具体的用户或用户组专用的一个或多个密钥。
6.3.2 对称密钥算法
对称密钥算法依赖于一个”共享的秘密”加密密钥,该密钥会被分发给所有参与通信的成员。
对称密钥密码学具有下列几个弱点:
- 密钥分发是一个主要问题。在使用对称密钥协议建立通信之前,通信参与者必须具备一种安全交换密钥的方法。如果没有可用的安全电子通道,那么往往必须使用离线的密钥分发方法(已不属于交换)。
- 对称密钥密码学并未实现不可否认性。由于任意通信方都可以利用共享的密钥对消息进行加密和解密,因此无法分辨指定消息的来源。
- 这种算法不可扩展。对于大的用户组来说,使用对称密钥密码进行通信非常困难。只有在每个可能的用户组合共享私有密钥时,组中个人之间的安全专有通信才能实现。
- 密钥必须经常更新。每当有成员离开用户组时,所有涉及这个成员的密钥都必须被抛弃。
对称密钥密码学的优点在于:对称密钥密码学的主要强度在于能够以极快的速度进行操作。对称密钥算法的速度很快,通常是非对称密钥算法的 1000倍 到 10000倍 之间。
6.3.3 非对称密钥算法
非对称密钥算法也被称为公钥算法,它为对称密钥加密的弱点提供了解决方案。
下面列出了非对称密钥密码学的主要优点:
- 增加新用户只需要生成一对公钥-私钥对。这个新用户与非对称密码系统中的所有用户通信时都使用这对相同的密钥,从而使得算法非常容易扩展。
- 从非对称系统中更容易删除用户。非对称算法提供了一种密钥撤消机制,这个机制准许密钥被取消,从而能够有效地从非对称系统中删除用户。
- 只有在用户的私钥被破坏时,才需要进行密钥重建。如果某位用户离开了公司,那么系统管理员只需要简单地将该用户的密钥作废即可。其他密钥都不会被破坏,因此其他用户都不需要进行密钥重建。
- 非对称密钥加密提供了完整性、身份认证和不可否认性。如果某位用户没有与其他个体共享其私钥,那么具有该用户签名的消息就是正确无误的,并且具有特定的来源,在以后的任何时刻都不能被否认。
- 密钥分发是一个简单的过程。希望加入非对称密码系统的用户,只需要使他们的公钥对于所有与他们进行通信的人来说可用就可以了。目前尚无办法从公钥导出私钥。
- 不需要预先存在通信链接。两个个体可以从通信一开始就进行安全的通信。非对称密码学并不要求预先存在能够提供安全数据交换机制的关系。
公钥密码学的主要弱点是运算速度慢。因此,很多需要安全传输大量数据的应用程序会使用公钥密码学建立连接,然后交换对称密钥。会话任务的剩余部分随后来用对称密码学开始运作。
6.3.4 散列算法
在上一节中,你学习了公钥密码系统在与消息摘要一起使用时可以提供数字签名的能力。消息摘要概述了经过散列算法处理的消息内容(与文件的校验和不同)。如果可能的话,从理想的散列函数中派生出消息是非常困难的,并且两条消息生成相同散列值的可能性几乎是不存在的。
6.4 对称密码
你己经学习了对称密钥密码、非对称密钥密码以及散列函数内在的基本概念。在下面的内容中,我们将深入讨论下列几种常见的对称密码系统:数据加密标准(DES)、三重数据加密算法(3DES)、国际数据加密算法(IDEA)、Blowfish、Skipjack以及高级加密标准(AES)。
6.4.1 数据加密标准(DES)
美国政府在1977年公布了数据加密标准(DES),并且将之作为向所有政府通信而提议的标准密码系统。由于该算法中的缺陷,密码学界和政府不再认为DES是安全的。大家普遍相信情报机构已经能轻易破解DES加密的信息。DES在2001年12月被高级加密标准取代。
DES是一个64位的分组密码,具有5种操作模式:电子代码本(ElectronicCodeBook,ECB)模式、密码分组链接(CipherBlockChaining,CBC)模式、密码回馈(CipherFeedBack,CFB)模式以及输出回馈(OutputFeedBack,OFB)模式和计数(CounTeR,CTR)模式。
1.电子代码本模式
电子代码本(ECB)模式是最容易了解的模式,但安全性最差。这个算法每次处理一个64位分组,它简单地使用所选择的密钥对这个分组进行加密。这意如果算法多次遇到相同的分组,那么将产生完全相同的加密分组。如果敌人正在对通信进行偷听,那么就可以简单地建立起所有可能加密值的代码本。在收集到足够多的分组后,就可以使用密码分析技术对一些分组进行解密并破解加密方式。
除了最短传输之外,这个脆弱性使得通过ECB模式进行传输并不现实。在日常使用中,ECB只被用于交换少量数据,例如,启动其他DES模式的密钥和参数以及数据库中的单元。
2.密码分组链接模式
在密码分组链接(CBC)模式中,未加密文本的每个分组在使用DES算法加密之前,都与前一密文分组进行异或操作。解密过程简单地将密文解密,并且反向执行异或操作。CBC创建了一个IV,并且将这个IV与消息的第一个分组相异或,从而每次操作都生成独特的输出。IV必须被发送给接收方,我们既可以将IV以明文形式置于完整的密文之前,也可以使用与消息所用的相同的密钥通过ECB加密模式保护它。在使用CBC模式时,需要考虑的一个重要问题是错误传播,也就是如果一个分组在传输中被破坏,那么这个分组将无法解密,并且下一个分组也是如此。
3.密码回馈模式
密码回馈(CFB)模式是流密码形式的CBC。换句话说,CFB针对实时生成的数据进行操作。不过,CFB并不将消息分为若干分组,而是使用相同分组大小的内存缓冲区。在缓冲区被填满时,对数据进行加密并发送给接收方。接着,系统等待下一个缓冲区被新生成的数据填满,然后继续进行加密和传输。除了将先前存在的数据变化为实时数据,CFB的操作方式与CBC一样,也使用了IV和链接。
4.输出回馈模式
在输出回馈(OFB)模式中,DES的操作样式几乎与在CFB模式中的操作样式完全相同。不过,DES并不将明文分组与前一个密文分组的加密版本相异或,而是将明文与某个种子值相异或。对于第一个被加密的分组来说,初始向量被用于创建种子值。通过对先前的种子值运行DES算法,就可以派生出之后的种子值。OFB模式的主要优点是不存在链接功能,并且传输错误不会通过传播影响之后分组的解密。
5.计数模式
在计数(CTR)模式中运行的DES使用的流密码,类似于在CFB和OFB模式中使用的流密码。不过,这种模式并不根据前一个种子值的结果为每个加密/解密操作创建种子值,而是使用一个简单的、每次操作后都增加的计数。与OFB模式一样,CTR模式中也不传播错误。提示:CTR模式允许将一个加密或解密操作分解为多个独立的步骤,这使得该模式特别适用于并行计算。
6.4.2 三重数据加密算法(3DES)
3DES具有4种版本。
第1种版本只是使用三个不同的密钥(K1、K2和K3)对明文加密三次。它被称为DES-EEE3模式(三个E表示存在三个加密操作,而数字3表示使用三个不同的密钥)。DES-EEE3具有的密钥的有效长度为168位。
第2种3DES版本DES-EDE3也使用三个密钥,但是将第二个加密操作替换为解密操作。
第3种3DES版本DES-EEE2只使用两个密钥K1和K2。
第4种3DES版本DES-EDE2也使用两个密钥,但是在中间使用一个解密操作。
其中,第3种和第4种3DES版本具有的密钥的有效长度都为112位。
6.4.3 国际数据加密算法(IDEA)
国际数据加密算法(IDEA)的分组密码是针对DES算法的密钥长度不够而开发的。与DES一样,IDEA对64位的明文/密文分组进行操作。然而,国际数据加密算法采用128位的密钥进行操作。这个密钥随后在一系列操作中被分解成52个16位的子密钥。这些子密钥接着使用异或和模运算的组合对输入的文本进行操作,从而生成输入消息的加密/解密版本。IDEA能够在DES使用的4种模式(ECB、CBC、CFB和OFB)中工作。
6.4.4 Blowfish
Bruce Schneier 的 Blowfish 分组密码是DES和IDEA的另一种选择。与它的这些前辈们一样,Blowfish对64位文本分组进行操作。然而,Blowfish扩展了IDEA的密钥强度,甚至准许使用变长密钥,范围从相对不安全的32位到相当难破解的448位。
6.4.5 Skipjack
Skipjack算法由美国政府在联邦信息处理标准(FederalInformationProcessingStdard,FIPS)185,即托管加密标准证书(EscrowedEncryptionStandard,EES)中批准使用。
6.4.6 高级加密标准(AES)
2000年10月,美国国家标准和技术协会(NIST)宣布Rijndael(发音为”rhine-doll”)分组密码己经被选中成为DES的替代标准。在同年的12月,美国商务部长批准了FIPS197,它要求使用AES/Rijndael对所有敏感但未被美国政府分类的数据进行加密。
AES密码准许使用三种密钥强度:128位、192位和256位。AES最初的规范支持128位分组的处理,但是Rijndael超出了这个规范,它准许密码学家使用与密钥长度相等的分组大小。如下所示,加密的轮数依赖于所边的密钥长度:
•128位密钥需要10轮加密。
•192位密钥需要12轮加密。
•256位密钥需要14轮加密。
Twofish算法
由Bruce Schneier(也是Blowfish的创建者)开发的 Twofish算法 是AES的另一种选择。与Rinjdael一样,Twofish也是一种分组密码。这种算法处理128位的数据分组,并且能够使用长度最大为256位的密钥。
Twofish利用了其他算法所没有的两种技术:
•预白噪声化(prewhitening)涉及在第一轮加密前将明文与一个单独的子密钥进行异或。
•后白噪声化(postwhitening)在第16轮加密后进行相似的操作。
6.4.7 对称密钥管理
由于加密密钥中包含的信息对于密码系统而言是至关重要的,因此密码系统的管理员和用户必须采取特殊的措施以保护密钥材料的安全。这些安全措施被统称为密钥管理实践。它们包含密钥的生成、分发、存储、销毁、恢复和托管。
1.创建和分发对称密码
正如前面提到的,对称加密算法内在的一个主要问题是操作算法所需密钥的安全分发。在下面的内容中,将对下列三个主要的用于安全交换密钥的方法进行分析:离线分发、公钥加密和Diffie-Hellman密钥交换算法。
- 离线分发——在技术方面最简单的方法涉及密钥材料的物理交换。一方向另一方提供包含密钥的一张纸或一份存储介质。在很多硬件加密设备中,密钥材料以电子设备的形式存在,这类似于插入到加密设备中的真实的钥匙。然而,这些方法都具有各自固有的缺陷。如果通过电子邮件发送密钥材料,那么密钥材料就可能被截获。电话可能会被窃听。包含密钥的纸张则可能被无意丢进废纸篓或丢失。
- 公钥加密——许多通信人员希望在没有密钥分发之争的情况下获得密钥加密的速度优势。因此,许多人使用公钥加密来建立初始的通信链接。一旦链接成功建立,并且双方对相互的身份都感到满意,那么他们就会在安全的公钥链接上交换密钥。随后,通信双方从基于公钥算法的通信进入基于秘密密钥算法的通信,并且能够享受快速的处理过程。一般而言,与公钥加密相比,私有密钥加密的速度快数千倍。
- Diffie-Hellman算法——某些情况下,无论是公钥加密还是离线分发,都是不充分的。双方可能需要相互通信,但是他们没有物理手段交换密钥材料,并且没有适当的公钥基础设施来促进秘密密钥的交换。在这样的情况下,像Diffie-Hellman这样的密钥交换算法被证明是极为有用的机制。
2.存储和销毁对称密钥
在对称密钥加密中,另一个主要的挑战是在密码系统中使用的密钥必须进行安全保管。以下给出了存储加密密钥的最佳实践:
- 永远不要将加密密钥存储在存放加密数据的同一个系统中,这将使攻击者更容易进行攻击!
- 对于敏感的密钥,可以考虑两个不同的人分别持有密钥的一半。他们必须合在一起才能构成完整的密钥。这是众所周知的知识分割原则(己在本章前面提到)。
当知道密钥的用户离开组织或不再被允许访问通过密钥包含的材料时,密钥必须更改,同时使用该密钥进行加密的所有材料必须用新的密钥进行重新加密。销毁一个密钥并将一个用户称密码系统中移除是困难的,这也是组织转而使用非对称算法的一个重要原因。
3.密钥托管
在过去10年中,人们提议通过下列两种主要途径进行密钥托管:
- 公平密码系统——在这种托管方法中,通信中使用的私有密钥被分为两个或多个部分,这些部分都被交给独立的第三方。每个部分本身都是无用的,但是通过重新组合可以获得私有密钥。政府获得法律授权访问特定的密钥时,需要向所有第三方提供法院的证据,随后才能重新组装这个私有密钥。
- 托管加密标准——这种托管方法向政府提供解密密文的技术手段。这个标准是本章前面讨论的Skipjack算法的基础。
政府管理者几乎不可能克服不可避免的法律和隐私障碍来广泛实现密钥托管。虽然技术上没有问题,但是一般民众不可能接受政府对个人生活的潜在介入。
6.4.8 密码生命周期
除了一次一密,所有的密码系统都有一个有限的生命周期。
安全专家在选择一个加密算法和相应的管理控制措施时必须考虑密码的生命周期以确保算法、协议和选择的密钥长度足以保存密码系统的完整性,以确保能够用于保护所需时间内信息的完整性和安全性。安全专家可以使用以下算法和协议管理控制:
- 确定组织内可以接受和使用的加密算法(例如,AES、3DES和RSA)。
- 基于传输信息的敏感性确定每个算法可接受使用的密钥长度。
- 列出可以使用的安全传输协议(如SSL和TLS)。
举例来说,如果设计的密码系统用来保护计划下周执行的商业计划,就无须担心处理器可能从目前到今后10年内可以破解它们这种理论上的风险。从另一方面看,如果要保护那种可能用于建造核弹的机密信息,那就十分肯定仍需要在今后10年里一直维护这个机密。
考试要点:
- 理解机密性、完整性和不可否认性在密码系统中扮演的角色。机密性是密码学的一个主要目标,它确保信息不对未授权的个人泄漏,并且准许加密信息、以在开放的网络中自由传输。对称和非对称密码系统都能够保证机密性。完整性为消息的接收方提供了消息在发送者建立和接收者接收到的时间范围内没有被(有意或无意)修改的保证。对称和非对称密码系统都能够保证完整性。不可否认性提供了不可否认的证据,从而证明消息的发送者确实是这个消息的作者。它防止发送者否认他们发送了原始信息。
- 了解如何使用密码系统达到身份认证的目标。身份认证提供了对用户身份的保证。使用身份认证的一种可能方案是挑战/响应协议,其中的远程用户被要求使用只有通信双方知道的密钥对消息进行加密。对称和非对称的密码系统都可以实现身份认证。
- 熟悉密码学的基本术语。当发送者希望向接收者传送一份私有消息时,发送者会取出明文(未加密的)消息,并且使用某种算法和某个密钥对明文消息进行加密,从而生成发送给接收者的密文消息。接收者随后使用相似的算法和密钥对密文进行解密,并且重建原始的明文消息以供查看。
- 理解编码和密码之间的区别,井且能够解释密码的基本类型。编码是对词汇或短语操作的符号密码学系统,有时是隐秘的,但是并不能永远提供机密性。不过,密码永远意味着对消息的真实含义进行隐藏。了解下列密码类型的工作方式:换位密码、替代密码(包括一次性填充)、流密码以及分组密码。
- 了解成功应用一次性填充的要求。要获得成功的一次性填充,密钥必须随机生成,并且不使用任何己知的模式。密钥必须至少和被加密的消息一样长。填充必须防止物理泄露,并且每个填充在被丢弃前必须只使用一次。
- 理解零知识证明的概念。零知识证明是一个概念。正如数字签名和数字证书一样,零知识证明交换特定类型的信息,但是不传输实际的数据。
- 理解知识分割。分割知识意味着执行某个操作所需的知识或权限在多个用户之间分配,这样可以确保任何一个人都没有足够的权限来危害环境的安全性。”MofN控制”是分割知识的一个示例。
- 理解工作函数(工作因数)。工作函数或工作因数通过度量解密消息所需的成本和/或时间,来度量密码学系统的强度。通常,针对加密系统执行完全穷举攻击所需的时间和努力就是工作函数所表示的内容。密码系统提供的安全性和保护与工作函数/因数的值成正比。
- 理解密钥安全性的重要性。密码学密钥为密码系统提供秘密性的必要组件。现代密码系统使用至少128位的密钥来提供足够的安全性。通常,人们都赞同数据加密标准(DES)56位密钥的长度己无法提供足够的安全性。
- 了解对称和非对称密钥系统之间的差异。对称密钥密码系统(或密钥密码系统)依赖于一个共享密钥的使用。它们的速度远远快于非对称算法,但是缺乏对可扩展性、简单密钥分发和不可否认性的支持。非对称密码系统对双方之间的通信使用公共/私钥对,但是要比对称算法的操作速度慢得多。
- 能够解释数据加密标准(DES)和三重DES(3DES)的基本操作模式。数据加密标准具有4种操作模式:电子代码本(ECB)模式、密码分组链接(CBC)模式、密码回馈(CFB)模式和输出回馈(OFB)模式。ECB模式被认为是最不安全的,并且只用于短消息。3DES使用DES的三次选代,利用两或三个不同的密钥,从而将密钥的有效强度各自增加到112位或168位。
- 了解高级加密标准(AES)。高级加密标准使用Rijndael算法,并且是美国政府安全交换敏感但非分类数据的标准。AES使用128、192和256位的密钥和固定128位大小的分组达到比旧的DES算法高得多的安全性。
参考链接:
=END=
《 “CISSP官方学习指南第7版#第6章” 》 有 8 条评论
如何正确对用户密码进行加密?
http://www.infoq.com/cn/articles/how-to-encrypt-the-user-password-correctly
http://coolcao.com/2018/07/24/Salted-Password-Hashing/
密钥安全技术
https://mp.weixin.qq.com/s/gzA1vW97SifNwvN8lMPsZQ
`
一、挑战
1、大数据挑战
2、边界挑战
3、开发交付挑战
4、新加密服务
二、密钥安全原则
1、不可萃取
2、KEY使用控制
3、敏捷性
4、信任
三、密钥管理技术
1、专用硬件
2、软token
3、可信执行环境
4、多方计算
总结
每个方案都有不同的安全性和可用性特点,同时也要考虑实际场景。
需要考虑的点包括:
IT基础设施的范围是什么,云、数据中心和终端?
要保护的对象是谁,敏感级别怎样,物理位置在哪。
合规要求有哪些?
厂商支持哪些?
未来有什么IT结构变化,比如全球化、云迁移、物联网、BYOD。
通过这些问题来选择自己的保护方法,实现最优匹配。
`
密码学详细介绍
https://intensecrypto.org/public/index.html
现代密码学实践指南[2015年]
https://gist.github.com/byronhe/232d22f1d3dcaa0a20cb
https://gist.github.com/tqbf/be58d2d39690c3b366ad
https://blog.helong.info/blog/2015/06/06/modern-crypto/
【翻译】密码学一小时必知
https://blog.helong.info/blog/2015/04/12/translate-Everything-you-need-to-know-about-cryptgraphy-in-1-hour/
https://www.bsdcan.org/2010/schedule/attachments/135_crypto1hr.pdf
密码学入门
https://blog.csdn.net/wjheha/article/details/73658249
如何在一个月内入门密码学?
https://www.zhihu.com/question/36289177
https://www.zhihu.com/question/23788427
密码哈希的慢方法
[译] 密码哈希的方法:PBKDF2,Scrypt,Bcrypt 和 ARGON2
https://zhuanlan.zhihu.com/p/113971205
https://github.com/xitu/gold-miner/blob/master/TODO1/password-hashing-pbkdf2-scrypt-bcrypt-and-argon2.md
`
关于如何安全的存储密码以及使用何种算法总是有很多的争论:MD5、SHA1,SHA256、PBKDF2,Bcrypt、Scrypt、Argon2、明文??
因此,我试图分析并总结了最新的合理选择:Scrypt、Bcrypt 和 Argon2 是符合条件的,MD5、SHA1、SHA256 就不太适合存储密码!
为什么会有用于密码哈希的慢方法?概括的说:
* 攻击者通常拥有与我们不同的、更专业(强大)的硬件
* 攻击者之所以使用专业的硬件,是因为它能根据某些算法进行定制,定制化的硬件允许某些算法能比非专业硬件(CPU)上运行的更快,而且 —— 总体而言 —— 某些算法还可以并行化;
* 我们依赖慢哈希方法来对密码进行哈希,从而实现你采用的 CPU/GPU 处理器与攻击者的 GPU/FPGA/ASIC 处理器在计算能力上处于同一水准。
那么今天什么是安全的呢?
原理还是一样的:我们需要一个加密社区审核过的慢函数并且依然未被破解。
PBKDF2 已经存在很长时间了,像之前文章讨论的一样,它有点过时了:轻松的在多核系统(GPU)上实现并行,这对于定制系统(FPGA/ASIC)来说微不足道。所以我拒绝了它。
BCrypt 在 1999年 就产生了,并且在对抗 GPU/ASIC 方面要优于 PBKDF2,但是我还是不建议你在新系统中使用它,因为它在离线破解的威胁模型分析中表现并不突出。
SCrypt 在如今是一个更好的选择:比 BCrypt设计得更好(尤其是关于内存方面)并且已经在该领域工作了 10 年。
Argon2 在 2015 年 7 月赢得了密码哈希竞赛。Argon2 有两个主要的版本:Argon2i 是对抗侧信道攻击的最安全选择,而 Argon2d 是抵抗 GPU 破解攻击的最安全选择。
Argon2d 使用依赖数据的内存访问,这使得它很适合用于加密数字货币和工作量证明的应用程序,而不会受到侧信道定时攻击的威胁。Argon2i 使用与数据无关的内存访问,这是密码哈希的首选方法。Argon2id 在内存第一次迭代的前半部分充当 Argon2i,其余部分则充当 Argon2d。因此,基于时间 —— 空间的平衡,它既提供了侧信道攻击保护也节约了暴力开销。Argon2i 对内存进行了更多的传递,以防止权衡攻击的发生。
如果你担心侧信道攻击(例如:恶意数据缓存加载/幽灵漏洞,它允许通过基于缓存的侧信道读取同一硬件上其他正在运行的进程的私有内存数据),你应该使用 Argon2i,否则使用 Argon2d。 如果你不确定或你对混合方法感到满意,你可以使用 Argon2id 来获得两个方面的优势。
在 2019 年,我建议你以后不要使用 PBKDF2 或 BCrypt,并强烈建议将 Argon2(最好是 Argon2id)用于最新系统。
`
What is the specific reason to prefer bcrypt or PBKDF2 over SHA256-crypt in password hashes?
https://security.stackexchange.com/questions/133239/what-is-the-specific-reason-to-prefer-bcrypt-or-pbkdf2-over-sha256-crypt-in-pass
Do any security experts recommend bcrypt for password storage?
https://security.stackexchange.com/questions/4781/do-any-security-experts-recommend-bcrypt-for-password-storage/6415#6415
Question: Is there any reason to prefer bcrypt over pbkdf2, or vice versa?
https://news.ycombinator.com/item?id=7286057
Password Hashing: PBKDF2, Scrypt, Bcrypt
https://medium.com/@mpreziuso/password-hashing-pbkdf2-scrypt-bcrypt-1ef4bb9c19b3
Password Hashing: Scrypt, Bcrypt and ARGON2
https://medium.com/analytics-vidhya/password-hashing-pbkdf2-scrypt-bcrypt-and-argon2-e25aaf41598e
Bcrypt、PBKDF2、Scrypt、Argon2
https://github.com/EasonWang01/Introduction-to-cryptography/blob/master/1.1%20Bcrypt%E3%80%81PBKDF2%E3%80%81Scrypt%E3%80%81Argon2.md