Hash (哈希或散列)算法它能将任意长度的二进制明文串映射为较短的(一般是固定长度的)二进制串(Hash值),而且不一样的明文很难映射为相同的Hash值。算法
Hash (哈希或散列): 能将任意长度的二进制明文串映射为较短的(一般是固定长度的)二进制串(Hash值),而且不一样的明文很难映射为相同的 Hash 值。
Hash 值在应用中又常被称为指纹或摘要(digest)。Hash 算法的核心思想也常常被应用到基于内容的编址或命名算法中数据库
一个优秀的Hash算法将能实现以下功能:数组
冲突避免:有时候又称为“抗碰撞性”,分为:安全
目前常见的 Hash 算法包括 MD5 和 SHA系列算法,MD5算法和SHA1已经被破解,通常推荐使用SHA2-256或更安全的算法网络
Hash算法分为:框架
数字摘要:对数字内容进行Hash运算,获取惟一的摘要值来指代原始完整的数字内容。数字摘要是 Hash算法最重要的一个用途。利用Hash函数的抗碰撞性特色,数字摘要能够解决确保内容未被篡改过的问题。函数
Hash 算法并非一种加密算法,不能用于对信息的保护。但Hash算法经常使用于对口令的保存上。例如用户登陆网站,网站后台保存口令的Hash值,每次登陆进行比对便可,即使数据库泄露,也没法从 Hash值还原口令,只能进行穷举。性能
Hash攻击: 因为有时用户设置口令的强度不够,只是一些常见的简单字符串,如password,123456等。有人专门搜集了这些常见口令,计算对应的Hash值,制做成字典。这样经过Hash值能够快速反查到原始口令。这一类以空间换时间的攻击方法包括字典攻击和彩虹表攻击(只保存一条Hash链的首尾值,相对字典攻击能够节省存储空间)等。学习
Hash攻击防范方法:为了防范这一类攻击,通常采用加盐(salt)的方法。保存的不是口令明文的 Hash值,而是口令明文再加上一段随机字符串(即“盐”)以后的Hash值。Hash结果和“盐”分别存放在不一样的地方,这样只要不是二者同时泄露,攻击者就很难破解了。区块链
加解密算法是密码学的核心技术,可分为两大基本类型:
现代加解密系统的典型组件通常包括: 加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,而且通常是公开可见的。密钥则是关键的信息,须要安全地保存起来,甚至经过特殊硬件进行保护。对同一种算法,密钥须要按照特定算法每次加密前随机生成,长度越长,则加密强度越大。加解密基本过程以下:
根据加解密过程当中使用的密钥是否相同,算法能够分为对称加密和非对称加密,两种模式适用于不一样的需求,刚好造成互补,某些时候能够组合使用,造成混合加密机制。
密码学实现的安全每每是经过算法所依赖的数学问题来提供,而并不是经过对算法的实现过程进行保密。
对称加密算法,加密和解密过程的密钥是相同的。
对称密码从实现原理上能够分为两种:
对称加密算法适用于大量数据的加解密过程;不能用于签名场景;而且每每须要提早分发好密钥;
非对称加密能够很好的解决对称加密中提早分发密钥的问题。非对称加密中,私钥通常须要经过随机数算法生成,公钥能够根据私钥生成。公钥通常公开,他人可获取的;私钥通常是我的持有,他人不能获取
非对称加密算法:
非对称加密算法的安全性每每须要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等经典数学难题进行保护。表明算法包括: RSA、ElGamal、椭圆曲线(ECC)、SM2等系列算法。目前广泛认为RSA类算法可能在不远的未来被破解,通常推荐可采用安全强度更高的椭圆曲线系列算法。
在非对称加密中,因为公钥是公开能够获取的,所以任何人均可以给定明文,获取对应的密文,这就带来选择明文攻击的风险。 在已知明文攻击、已知密文攻击、选择明文攻击中,最有威胁的为选择明文攻击。
为了规避选择明文攻击这种风险,现有的非对称加密算法都引入了必定的保护机制。对一样的明文使用一样密钥进行屡次加密,获得的结果彻底不一样,这就避免了选择明文攻击的破坏。实现上有多种思路:
混合加密机制同时结合了对称加密和非对称加密的优势。先用计算复杂度高的非对称加密协商出一个临时的对称加密密钥(也称为会话密钥)而后双方经过对称加密算法传递的大量数据进行快速的加解密处理。
HTTPS 在传统的HTTP层和TCP层之间经过引入 Transport Layer Security/Secure Socket Layer(TLS/SSL)加密层来实现可靠的传输
HTTPS 为典型应用案例:
该过程的主要功能:在防止中间人窃听和篡改的前提下完成会话密钥的协商。
Diffie-Hellman(DH)密钥交换协议是一个经典协议,使用该协议能够在不安全信道完成对称密钥的协商,以便后续通讯采用对称加密。
DH的缺点:
消息认证码和数字签名技术经过对消息的摘要进行加密,可用于消息放篡改和身份证实问题。
消息认证码: 全称是“基于Hash的消息认证码”。消息认证码基于对称加密,能够用于对消息完整性进行保护。
基本过程: 对某个消息利用提早共享的对称密钥和Hash算法进行加密处理,获得HMAC值。该HMAC值持有方能够证实本身拥有共享的对称密钥,而且也能够利用HMAC确保消息内容未被篡改。
消息认证码通常用于证实身份的场景, 主要问题是须要共享密钥
数字签名基于非对称加密,既能够用于证明某数字内容的完整性,又同时能够确认来源。
典型的场景: A经过信道发给B一个文件(一份信息),B如何获知收到的文件即为A发出的原始版本?A能够先对文件内容进行摘要,而后用本身的私钥对摘要进行加密(签名),以后同时将文件和签名发给B。B收到文件和签名后,用A的公钥来解密签名,获得数字摘要,与收到文件进行摘要后的结果进行比对。若是一致,说明该文件确实是A发的(别人没法拥有A的私钥),而且文件内容没有被修改过(摘要结果一致)
知名的数字签名算法包括DSA 和 安全强度更高的ECSDA等。
除普通的数字签名应用场景外,针对一些特定的安全需求,产生了一些特殊数字签名技术:
数字签名算法自身的安全性由数学问题进行保障,但在使用上,系统的安全性也十分关键。目前常见的数字签名算法每每须要选取合适的随机数做为配置参数,配置参数不合理的使用或泄露都会形成安全漏洞,须要进行安全保护。
对于非对称加密算法和数字签名来讲,很重要的一点就是公钥的分发。但在传输过程当中,公钥有没有多是伪造的呢?传输过程当中有没有可能被篡改?一旦公钥出了问题,则整个创建在其上的安全体系的安全性将不复存在。
数字证书机制: 能够证实所记录信息的合法性,好比证实某个公钥是某个实体(如组织或我的)的,而且确保一旦内容被篡改能被探测出来,从而实现对用户公钥的安全分发。
根据保护公钥的用途,能够分为:
通常状况下,证书须要由证书认证机构来进行签发和背书
通常来讲,一个数字证书内容可能包括基本数据(版本、序列号)、所签名对象信息(签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥)、CA的数字签名,等等。目前使用最普遍的标准为ITU和ISO联合制定的X.509的 v3 版本规范
证书的颁发者还须要对证书内容利用本身的私钥添加签名,以防止别人对证书内容进行篡改。
X.509规范中通常推荐使用PEM格式来存储证书相关的文件。证书文件的文件名后缀通常为.crt或.cer,对应私钥文件的文件名后缀通常为.key,证书请求文件的文件名后缀为.csr。有的时候也统一用.pem做为文件名后缀。此外还有DER格式,是采用二进制对证书进行保存,能够与PEM格式互相转换。
证书中记录了大量信息,其中最重要的包括“签发的公开密钥”和“CA数字签名”两个信息。所以,只要使用CA的公钥再次对着个证书进行签名比对,就能证实某个实体的公钥是不是合法的。
那么怎么证实用来验证对实体证书进行签名的CA公钥自身是否合法呢?
证书做为公钥信任的基础,对其生命周期进行安全管理十分关键。
在非对称加密中,公钥能够经过证书机制来进行保护,但证书的生成、分发、撤销等过程并无在X.509规范中进行定义。安全地管理和分发证书能够遵循PKI(Public Key Infrastructure)体系来完成。PKI体系核心解决的是证书生命周期相关的认证和管理问题。PKI是创建在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架,并不表明某个特定的密码学技术和流程。
PKI至少包括以下核心组件:
操做流程: 用户经过RA登记申请证书,提供身份和认证信息等;CA审核后完成证书的制造,颁发给用户。用户若是须要撤销证书则须要再次向CA发出申请。
CA对用户签发证书其实是对某个用户公钥,使用CA的私钥对其进行签名。这样任何人均可以用CA的公钥对该证书进行合法性验证。验证成功则承认该证书中所提供的用户公钥内容,实现用户公钥的安全分发。
用户证书的签发能够有两种方式:
证书超过有效期后会做废,用户也能够主动向CA申请撤销某证书文件。
CA 没法强制收回已经颁发出去的数字证书,所以为了实现证书的做废,每每还须要维护一个撤销证书列表,用于记录已经撤销的证书序号。(因此第三方验证某个证书时,第一步就是检查该证书是否在撤销列表中,若是存在则没法验证经过。若是不在则继续后续验证)
Merkle(默克尔)树:又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。区块链出现以前,普遍用于文件系统和P2P系统中。
主要特色:
默克尔树逐层记录哈希值的特色,让它具备了一些独特的性质。例如,底层数据的任何变更,都会传递到其父节点,一层层沿着路径一直到树根。这意味着树根的值实际上表明了对底层全部数据的“数字摘要”
默克尔树的应用场景有以下:
布隆过滤器: 是一种基于Hash的高效查找结构,可以快速(常数时间内)回答“某个原始是否在一个集合内”的问题。
应用场景:布隆过滤器由于其高效性大量应用于网络和安全领域,例如信息检索、垃圾邮件规则、注册管理等
基于Hash的快速查找算法: Hash能够将任意内容映射到一个固定长度的字符串,并且不一样内容映射到相同串的几率很小。所以,可构成以个很好的“内容——》索引”的生成关系。(内容Hash后为索引经过索引可在数组中快速的查找当前内容)
基于Hash的快速查找算法的缺点:当映射后的值限制在必定范围(如总数组的大小)内时,会发现 Hash 冲突的几率会变高,并且范 围越小,冲突几率越大。不少时候,存储系统的大小又不能无限扩展,这就形成算法效率的降低。为了提升空间利用率,后来人们基于Hash算法思想设计出了布隆过滤器结构。
布隆过滤器: 采用多个Hash函数来提升空间利用率。对于同一个给定输入来讲,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1。进行查找时,进行一样的计算过程,并查看对应原始,若是都为1,则说明较大几率是存在该输入。
优势:大大提升了空间利用率,可使用较少的空间来表示较大集合的存在关系。
总结: 不管是Hash算法,仍是布隆过滤器,基本思想都是基于内容的编址。Hash函数存在冲突,布隆过滤器也存在冲突。这就形成了两种方法都存在误报的状况,但绝对不会漏报。
同态加密: 是一种特殊的加密方法,容许对密文进行处理获得任然是加密的结果。即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,获得的结果相同。
优势:同态加密能够保证明现处理者没法访问到数据自身的信息
同态加密的两个应用场景:
目前全同态的加密方案主要包括“基于理想个的方案”、“基于整数上近似GCD问题的方案”、“基于带扰动学习问题的方案”。已知的同态加密技术每每须要较高的计算时间或存储成本,相比传统加密算法的性能和强度还有差距。
同态加密保护的是数据自己,而函数加密保护的是处理函数自己,即让第三方看不处处理过程的前提下,对数据进行处理。
零知识证实: 证实者在不想验证者提供任何额外信息的前提下,使验证者相信某个论断是正确的。
零知识证实至少要知足三个条件:
量子密码学:随着量子计算和量子通讯的研究而受到愈来愈多的关注,将会对已有的密码学安全机制产生较大的影响。
即使存在理论上完美的技术,也不存在完美的系统!
我的理解:系统中有人的组成部分并非坚不可破的,由于人带有社会属性,经过社会学攻击能够轻易的攻破理论上完美的系统。