密码学与安全技术

Hash算法与数字摘要

  Hash(哈希或散列)能将任意长度的二进制明文串映射为较短的(通常是固定长度的)二进制串(Hash值),并且不同的明文很难映射为相同的Hash值。Hash值在应用中又被称为指纹(fingerprint)或摘要(digest)。

  优秀的Hash算法能实现以下功能:

    正向快速:给定明文和Hash算法,在有限时间和有限资源内能计算得到的Hash值

    逆向困难:给定Hash值,在有限时间内很难逆推出明文

    输出敏感:原始输入信息发生任何改变,新产生的Hash值都应该出现很大不同

    冲突避免:很难找到两段内容不同的明文,使得它们的Hash值一致。冲突避免又称为“抗碰撞性”。分为弱抗碰撞性和强抗碰撞性。若给定明文前提下,无法找到与之碰撞的其他明文,则算法具有“弱狂碰撞性”;若无法找到任意两个发生Hash碰撞的明文,则称该算法具有“强抗碰撞性”。

  Hash算法一般是对计算敏感型。意味着计算资源是瓶颈,主频越高的CPU运行Hash算法的速度也越快。

  数字摘要是对数字内容进行Hash运算,获取唯一的摘要值来指代原始完整的数字内容。Hash算法一般用于对口令的保存上,有时用户设置口令的强度不够,此时一般采用加盐(salt)的方法。保存的不是口令明文的Hash值,而是口令明文再加上一段随机字符串之后的Hash值。Hash结果和“盐”分别存放在不同的地方。

加密算法

算法类型 特点 优势 缺陷 代表算法
对称加密 加解密的秘钥相同 计算效率高,加密强度高 需提前共享密钥,易泄露 DES,3DES,AES,IDEA
非对称加密 加解密的秘钥不相关 无需提前共享秘钥 计算效率低,仍存在中间人攻击可能 RSA,ElGamal,椭圆曲线系列算法

  

加解密系统基本组成

  现代加解密系统的典型组件一般包括:加解密算法,加密秘钥,解密秘钥。加解密算法自身是固定不变的,并且一般是公开可见的,密钥则是需要保存起来,甚至通过特殊硬件保护的。一般来说,对同一种算法,密钥需要按照特定算法每次加密前随机生成,长度越长,则加密强度越大。

  加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。

  解谜过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。

  根据加解密过程中所用的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)

对称加密算法

  加密解密过程的密钥是相同的。该类算法的有点事加解密效率和加密强度都高。缺点是参与方需要提前持有密钥,一旦有人泄露则安全性被破坏;并且如何在不安全同道中提前分发密钥也是问题,需要借助Diffie-Hellman协议或非对称加密方式来实现。

  对称密码从实现原理上可以分为两种:分组密码和序列密码。分组密码将明文且分为定长数据块最作为基本加密单位。序列密码则每次只对一个字节或字符进行加密处理,且密码不断变化。

非对称加密

  加密秘钥和解密秘钥是不同的,分别称为公钥(public key)和私钥(private key)。私钥一般需要通过随机数算法生成,公钥可以根据私钥生成。公钥一般是公开的,他人可获取的;私钥一般是个人持有的,他人不能获取。非对称加解密算法的优点是公私钥分开,不安全通道也可以使用。缺点是处理速度往往比较慢,一般比对称加解密算法慢2~3个数量级;同时加密强度也往往不如对称加密算法。非对称加密算法的安全性往往需要基于数据问题来保障,目前主要有基于大数指引自分解,离散对数,椭圆曲线的等经典数学难题。

  在非对称加密中,由于公钥是公开可以获取的,因此任何人都可以给定明文,获取对应的密文,进行明文攻击。为了避免这种风险,现有的费对称加密算法引入了一种保护机制。对同样的明文使用同样密钥进行多次加密。

混合加密机制

  混合加密机制同时结合了对称加密和非对称加密的优点。先用计算复杂度高的非对称加密协商出一个临时的对称加密秘钥,然后双方再通过对称加密算法对传递的大量数据进行快速的加解密处理。

  HTTPS在传统的HTTP层和TCP层之间通过引入Transport Layer Security/Secure Socket Layer(TSL/SSL)加密层来实现可靠的传输。

 

  (1) 客户端浏览器发送信息到服务器,包括随机数R1,支持的加密算法类型,协议版本,压缩算法等。该过程为明文

  (2) 服务端返回信息,包括随机数R2,选定加密算法类型,协议版本以及服务器证书

  (3) 浏览器检查带有该网站公钥的证书。该证书需要由第三方CA来签发,浏览器和操作系统会预置权威CA的根证书。若证书被篡改作假,CA很容易能验出来

  (4) 若证书没问题,则客户端用服务端证书中的公钥加密随机数R3(Pre-Master Secret),发送给服务器。此时客户端和服务器都拥有R1,R2和R3信息,基于随机数R1,R2和R3,双方通过伪随机数函数来生成共同的对称会话密钥Master Secret

  (5) 后续客户端和服务端的通信都通过对称加密算法进行保护

  该过程的主要功能是防止中间人窃听和篡改的前提下完成会话密钥的协商。为了保障前向安全性(perfect forward secrecy),TLS对每个会话连接都可以生成不同的密钥,避免某次会话密钥泄露之后影响了其他会话连接的安全性。

  离散对数与Diffie-Hellman密钥交换协议

    Diffie-Hellman(DH)密钥交换协议的设计基于离散对数问题(Discrete Logarithm Problem,DLP)。离散对数问题是指对于一个很大的素数p,已知g为p的模循环群的原根,给定任意x,求解X=g^x mod p是可以很快获取的,但是在已知p,g和X的前提下,逆向求解x目前没有多项式时间实现的算法。

  DH协议的基本交换过程如下:

    1. Alice和Bob两个人协商密钥,先公开商定p,g

    2. Alice自行选取私密的整数x,计算X = g^x mod p,发送X给Bob  

    3. Bob自行选取私密的证书y,计算Y=g^y mod p,发送Y給A

    4. Alice根据x和Y,求解共同密钥Z_A=Y^x mod p

    5. Bob根据X和y,求解共同密钥Z_B=X^y mod p

    实际上Alice和Bob计算出的结果完全相同,因为在mod p的前提下, Y^x=(g^y)^x=g^(xy)=(g^x)^y=X^y。而信道监听者在已知p,g,X,Y的前提下,无法求得Z

 

消息认证码和数字签名  

  消息认证码和数字签名技术通过对消息的摘要进行加密,可用于消息防篡改和身份证明问题。

  消息认证码全程是“基于Hash的消息认证码”(Hash-based Message Authentication Code, HMAC)。消息验证码基于对称加密,可用于对消息完整性(integrity)进行保护。基本过程为:对某个消息利用提前共享的对称密钥和Hash算法进行加密处理,得到HMAC值。该HMAC值持有方可以证明自己拥有共享的对称密钥,并且也可以用HMAC确保消息内容未被篡改。典型的HMAC(K, H, Message)算法包括三个因素,K为提前共享的对称密钥,H为提前商定的Hash算法(一般为SHA-256),Message为处理的消息内容。消息认证码使用过程中主要问题是需要共享密钥。当密钥可能被多方拥有的场景下,无法证明消息来自某个确切的身份。反之若采用非对称加密的方式,则可以追溯到来源身份,即数字签名。

数字签名

  数字签名基于非对称加密,既可以用于正式某数字内容的完整性,又同时可以确认来源。知名的数字签名算法包括DSA(Digital Signature Algorithm)和安全强度更高的ECSDA(Elliptic Curve Digital Signature Algorithm)等。

  盲签名(blind signature)

    签名者需要在无法看到原始内容的前提下对信息进行签名。盲签名可以实现对所签名内容的保护,防止签名者看到原始内容;另一方面,盲签名还可以实现防止追踪(unlinkability),签名者无法将签名内容和签名结果进行对应。

  多重签名(multiple signature)

    多重签名即n个签名者中,收集到至少m个(n>=m>=1)的签名,即认为合法。其中n是提供的公钥个数,m是需要匹配公钥的最少的签名个数。

  群签名(group signature)

    群签名即某个群组内一个成员可以代表群组进行匿名签名。签名可以验证来自于该群组,却无法准确追踪到签名的是哪个成员。群签名需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名成员身份的风险。

  环签名(ring signature)

    环qianmign属于简化的群签名。签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立地产生签名,而无需其他人帮助。签名者集合中的其他成员可能并不知道自己被包含在最终的签名中。

  

数字证书

  根据所保护公钥的用途,可以分为加密数字证书(Encryption Certificate)和签名验证数字证书(Signature Certificate)。加密数字证书可用于保护加密信息的公钥,签名验证数字证书可保护用于进行解密签名身份验证的公钥。两种类型的公钥也可同时放在同一个证书中。

  

X.509证书规范

  一个数字证书内容可能包括基本数据(版本,序列号),所签名对象信息(签名算法类型,签发者信息,有效期,被签发人,签发的公开密钥),CA的数字签名等。

  目前使用最广泛的标准为ITU和ISO联合制定的X.509的v3版本规范,其定义的证书信息域如下:

    版本号(Version Number):规范的版本号,目前为版本3,值为0x2

    序列号(Serial Number):由CA维护的为它所颁发的每个证书分配的唯一的序列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书,最大不能超过20个字节

    签名算法(Signature Algorithm):数字签名所采用的算法,如sha256WithRSAEncryotion或ecdsa-with-SHA256

    办法者(Issuer):颁发证书单位的标识信息,如“C=CN, ST=Beijing, L=Beijing, O=org.example.com”

    有效期(Validity):证书的有效期,包括起止时间

    主体(Subject):证书拥有者的标识信息(Distinguished Name)

    主体的公钥信息(Subject Public Key Info):所保护的公钥相关的信息

      公钥算法(Public Key Algorithm):公钥采用的算法

      主体公钥(Subject Public Key):公钥的内容

    颁发者唯一号(Issuer Unique Identifier):代表颁发者的唯一信息

    主体唯一号(Subjext Unique Identifier):代表拥有证书实体的唯一信息

    扩展(Extensions,可选):

      Subject Key Identifier:实体的密钥标识符,区分实体的多对密钥

      Basic Constraints:一般指明是否属于CA

      Authority Key Identifier:证书颁发者的公钥标识符

      CRL Distribution Points:撤销文件的发布地址

      Key Usage:证书的用途或功能信息

  证书格式

    X.509规范中一般推荐使用PEM(Privacy Enhanced Mail)格式来存储证书相关的文件。证书文件的文件名后缀一般为.crt或.cer。对应死要文件的文件名后缀一般为.key,证书请求文件的文件名后缀为.csr。有时也统一用.pem作为文件名后缀。PEM格式采用文本方式进行存储,一般包括首尾标记和内容块,内容块采用Base64进行编码。

    还有DER(Distinguished Encoding Rules)格式,是采用二进制对证书进行保存,可与PEM格式互相转换。

  

证书信任链

  证书中记录了大量信息,其中最重要的包括“签发的公开密钥”和“CA数字签名”两个信息。只要使用CA的公钥再次对这个证书进行签名对比,就能证明某个实体的公钥是否是合法的。证明CA公钥的合法,一方面可以通过更上层的CA颁发的证书来进行认证;另一方面某些根CA(Root CA)可以通过预先分发证书来实现信任基础。主流操作系统和浏览器里面,往往会提前预置一些权威的CA的证书(通过自身的私钥签名,系统承认这些是合法的证书)。之后所有基于这些CA认证过的中间层CA(Intermediate CA)和后继CA都会被验证合法。这样就从预先信任的根证书,经过中间层,到最底下的实体证书,构成一条完成的证书信任连。某些时候用户在使用浏览器访问某些网站时,可能会被提示是否信任对方的证书。这说明该网站证书无法被当前系统中的证书信任链进行验证,需要进行额外检查,另外,当信任链上任意证书不可靠时,则依赖它的所有后继证书都将失去保障。  

PKI体系

  安全的管理和分发证书可以遵循PKI(Public Key Infrastructure)体系来完成。PKI体系核心解决的是证书生命周期相关的认证和管理问题。PKI是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架,并不代表某个特定的密码学技术和流程,实现了PKI规范的凭条可以安全可靠地管理网络中用户的密钥和证书。

  一般情况下,PKI至少包括以下核心组件:

    CA(Certification Authority):负责证书的颁发和作废,接收来自RA的请求,是最核心的部分

    RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给CA

    证书数据库:存放证书,多采用X.500系列标准格式。可以配合LDAP目录服务管理用户信息

    

证书的签发

  CA对用户签发证书实际上是对某个用户公钥,使用CA的私钥对其进行签名。任何人可以使用CA的公钥对该证书进行合法性验证。验证成功则认可该证书中所提供的用户公钥内容,实现用户公钥的安全分发。用户证书的签发可以有两种方式。一般可以由CA直接来生成证书(内含公钥)和对应的私钥发给用户;也可以由用户自己生成公钥和私钥,然后由CA来对公钥内容进行签名。后者情况下,用户一般会首先自行生成一个私钥和证书申请文件(Certificate Signing Request,即csr文件),该文件中包括了用户对应的公钥和一些基本信息,如通用名(common name,即cn),组织信息,地理位置等。CA只需要对证书请求文件进行签名,生成证书文件,办法给用户即可。整个过程中,用户可以保持私钥信息的私密性,不会被其他方获知。生成证书申请文件的过程并不复杂,用户可以很容易地使用开源软件openssl来生成csr文件和对应的私钥文件。

  $ openssl req -new -keyout private.key -out for_request.csr //使用OpenSSL生成私钥和对应的证书请求文件

  生成过程中需要输入地理位置,组织,通用名等信息。生成的私钥和csr文件默认以PEM格式存储,内容为Base64编码。

  $ openssl req -in for_request.csr -noout -test //openssl查看PEM格式文件明文

  用户自行生成私钥的情况下,私钥文件一旦丢失,CA方由于不持有私钥信息,无法进行恢复,意味着通过该证书中公钥加密的内容将无法被解密

证书的撤销

  证书超出有效期后会作废,用户也可以主动向CA申请撤销某证书文件。由于CA无法强制收回已经颁发出去的数字证书,因此为了实现证书的作废,还需要维护一个撤销证书列表(Certificate Revocation List, CRL),用于记录已经撤销的证书序号。因此通常情况下,当第三方对某个证书进行验证时,需要首先检查该证书是否在撤销列表中。若存在,则改正数无法通过验证。若不存在,则继续进行后续的证书验证过程。

Merkle树结构

  Merkle树,又叫哈希树,是一种典型的二叉树结构,由一个根节点,一组中间节点和一组叶节点组成。主要特点是最下面的叶节点包含存储数据或其哈希值;非叶子节点(包括中间节点和根节点)都是他的两个孩子节点内容的哈希值。默克尔树逐层记录哈希值的特点。底层数据的任意变动,都会传递到其父节点,一层层沿着路径一直到树根。

  默克尔树的典型应用场景:

    快速比较大量数据

      对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着两组数据必然相同,否则,必然存在不同。

    快速定位修改

      一旦发现某个节点的Root的数值发生变化,沿着Root,最多通过O(lgn)时间即可快速定位到实际发生改变的数据块D1

    零知识证明

      零知识证明(zero knowledge proof)即证明者在不向验证者提供任何额外信息的前提下,使验证者相信某个论断是正确的。

      零知识证明一般要满足三个条件:

        完整性(Completeness):真实的证明可以让验证者成功验证

        可靠性(Soundness):虚假的证明无法让验证者保证通过验证,但允许存在小概率例外

        零知识(Zero-Knowledge):若得到证明,无法从证明过程中获知除了所证明信息之外的任何信息

      

布隆过滤器

  布隆过滤器(Bloom Filter)是一种基于Hash的高效查找结构,能够快速回答“某个元素是否在一个集合内”的问题

  基于Hash的快速查找

    给定一个内容和存储数组,通过构造Hash函数,让映射后的Hash值总不超过数组的大小,则可以实现快速的基于内容的查找。若“Hello World”的Hash值是100,则将Hello World放到数组的第100个单元上。但是当映射后的值限定在一定范围时,会发现Hash冲突的概率会变高,范围会变小,冲突概率越大。很多时候,系统的大小又不可以无限扩展,因此人们设计出了布隆过滤器结构。

    布隆过滤器采用了多个Hash函数来提高空间利用率。对同一个给定输入来说,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1。进行查找时,进行同样的计算过程,并查看对应元素,若都为1,则说明较大概率是存在该输入。布隆过滤器相对单个Hash算法查找,大大提高了空间利用率,可以使用较少的空间来表示较大集合的存在关系。Hash和布隆过滤器都存在冲突,因此两种方法都存在这误报(false positive),但不会漏报(false negative)。布隆过滤器在应用中误报很低,使用7个不同的Hash函数,记录100w个数据,采用2MB大小的位串,整体的误判率将低于1%,而传统的Hash查找算法的误报率将接近10%。

  

同态加密

  同态加密(homomorphic encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果。即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,得到的结果相同。即同态性。同态加密可以保证实现处理者无法访问到数据自身的信息。同态一般包括四种类型:加法同态,乘法同态,减法同态和除法同态。同时满足加法同态和乘法同态的则意味着是代数同态,称为全同态(full homomorphic)。同时满足四种同态性,则称为算数同态。对于计算机操作来说,实现了全同态意味着对所有处理都可以实现同态性,只能实现部分特定操作的同态性,称为特定同态(somewhat homomorphic)。

  目前全同态的加密方案主要包括三种类型:

    基于理想格(idea lattice)的方案:基于理想格的方案可以实现72bit的安全强度,对应的公钥大小约为2.3GB,同时刷新密文的处理时间要十几分钟。

    基于整数上近似GCD问题的方案:采用了简化的概念模型,可以降低公钥大小至几十MB量级

    基于带扰动学习(Learning With Errors, LWE)问题的方案:多密钥同态加密方案,接近实时多方安全计算的需求

 

函数加密

  同态加密保护的是数据本身,而函数加密保护的是处理函数本身,即让第三方看不到处理过程的前提,对数据进行处理。

  

  

  

  

  

    

猜你喜欢

转载自www.cnblogs.com/forerver-elf/p/9083996.html