在日常的开发或者面试中,我们常常会遇到一些概念。
对称加密是什么 非对称加密是什么 证书是什么 签名是什么?
这些东西之间又有什么关联呢?今天谈一点自己的理解。
其实这些东西围绕的都是数据安全的一些算法。我们可以把它们都看作一种加密方式。
首先来解释一下什么叫对称加密,非对称加密。
一、对称加密
什么是对称加密呢? 我来举一个例子。 比如我们现在有一串明文00000000我想把这个东西发送给我的朋友,但是同时又不想让别人知道这段消息我怎么做呢? 这个时候我就定义一个规则,这个规则就叫做取反。那么这一串消息取反之后就成为了11111111. 这个东西就叫做密文, 我的朋友拿到我发到的消息之后也用取反(逆运算)就可以解出明文即解密过程。 那么这一系列就叫做对称加密。常见的算法有DES 3DES等都是比较出名的对称加密。这些算法的安全性取决于一个叫做S盒的东西, 它是加密算法的核心, S盒设计的越巧妙越复杂,那么被破解的概率就越小 常见的加密算法DES 3DES等。
二、非对称加密
了解了对称加密这个时候就会出现一个问题,首先对称加密的算法是可逆的,那么它的安全性比较低,还遇到一个最严重的问题例如A要发消息给B, 对应法则是f , 那么A如何通过安全的方式把f传给B又不让别人知道呢? 这一点在广播的互联网上是很难做到的。 这个时候出现了一种算法, 它有两个密钥, 一个叫做公钥,一个叫做私钥。它们是一对的,并且公钥并不能推出来私钥。并且并且!!很重要的一点就是公钥加密的消息只有持有这个私钥的人才可以解出来明文!!! 公钥是可以广播给所有人的, 而私钥只有自己知道。 那么例如A想给B发消息,A只需要用B的公钥把消息加密并且发送给B再把消息发送出去就可以了。只有B拿到消息之后才可以解锁消息得到真正的明文。那么这个时候又会有人有疑问了, 这一套机制到底是什么样子呢? 这里面用到了比较巧妙的算法, 日后我会在一篇叫做《RSA算法解析》的文章中具体来说非对称加密的原理是什么样子。 市面上常用的非对称算法有RSA DSA ECC等。
非对称加密和对称加密对比:一般来讲对称加密的计算时间比非对称加密少一些,或者说不是一个数量级的, 但是对于我们现在的计算机cpu的计算速度来说感觉不到差别。 不过对于数据量比较大的数据我们可以通过 对称 + 非对称加密的方法来解决, 通过非对称加密发送相关的密码算法 然后通过对称加密来加密消息。 这样只有发送方和接受方可以得到加密解密的方法也可以提高算法效率。
三、Hash函数(单向散列函数 摘要算法)
在开发过程中我们经常会用到hash算法, hash算法也是密码学的基础,它又叫散列函数那么究竟它是什么呢? 一般的hash函数主要满足下面几个特性:
1.输入任意长度明文 , 输出的是固定长度的密文且基本唯一 拿最最最最简单常见的MD5算法来说,我们可以给他任意长度的数据, 通过64轮的加密运算之后会给我们返回一个128bit长度的密文,并且这个密文有雪崩效应。 什么叫雪崩效应? 比如我们有两串明文 00000001 和00000000 但是我们加密出来的密文是完全不一样的。
2.防碰撞性 防碰撞性指的是现在我们有一个明文A 通过Hash算出来了 B 但是你很难找到一个C 通过Hash算出来的结果也是B , 这种操作只能通过暴力破解来尝试但是成本也是非常巨大的。所以基本我们可以这么认为 给定固定的A有且仅有唯一的B与之对应, 那么比特币的挖矿其实就是在找这个基本不可能的碰撞(想深入了解的回头我可能写比特币的文章可以来看)。那么一个设计好的Hash函数具体会不会发成碰撞是要有严谨的逻辑推理的, 例如MD5已经被破解, 不过成本依然非常巨大。
3.单向性 通过一个hash函数的value值是基本不可能找到hash的输入数值的。一般情况下只要hash算法的输入足够大,那么通过输出的结果基本上不可能找到输入的数据。
常见的HASH算法有MD5(加盐) HMAC(需要证书) SHA SHA-256 等算法。在实际的开发中为了保证数据安全并且需要验证常常会用到hash算法。
四、数字签名
在实际的开发应用中,如果我们用公钥加密进行一个消息的发送。那么这时候就会出现一个问题,怎么让对方知道这条消息真的是我发送并且没有被篡改过呢?这个时候很自然的就需要对我们的消息加上一个tag来证明这个消息是我发出的并且是不可伪造的,那么就涉及到了数字签名的技术。 数字签名简单来说就是公钥加密的逆应用,用私钥加密 用公钥解密。用私钥对要发送的消息进行签名处理,因为私钥是唯一的所以处理之后的签名也是唯一的。一般来说生成数字签名的步骤大概如下:
1.对明文消息进行哈希计算,得到哈希值
2.利用私钥对哈希值进行加密,生成签名
3.将签名附加在消息后面发送至对方
收到消息之后验证签名的过程:
1.收到消息后,提取消息中的签名
2.用公钥对签名进行解密,得到哈希值A(这个解密运算并不是逆运算 注意 注意 注意!!! 而是数学里面的模运算 不懂得去看一下RSA的加密过程就懂了)。
3.对消息中的正文进行哈希计算,得到哈希值B。
4.比较哈希值A和哈希值B,如果相同,则验证成功。认证消息发送者并且确定没有被篡改。
五、证书认证
继续刚才的话题,比如我们现在是A想要给B发送一个消息,我们用自己的私钥对消息进行了签名证明消息是我们自己的 要发送给B再用B的公钥对消息进行加密发送出去那么全网只有B自己可以用私钥解密消息没毛病吧?那么问题来了你怎么知道你用的B他就是B的公钥呢? 如果A和B之间有一个C那么C把消息截获下来并且把他的公钥给你告诉你他就是B 那么A和B的每一条消息都会被C截获这就造成了安全隐患。这时候随之而来就出现了一个公钥合法性的问题。那么这时候证书就派上用场了。证书是什么呢 ?简单的说证书实际上就是对公钥进行数字签名,它是对公钥合法性提供证明的技术。
证书一般包含:公钥(记住证书中是带有公钥的),公钥的数字签名,公钥拥有者的信息。若证书验证成功,这表示该公钥是合法,可信的。 那么问题又来了,我们如何找一个权威的证书验证机构呢? 这就涉及到了操作系统的问题。如果我们购买的操作系统是正版的,那么操作系统内部就内置了权威的证书颁发机构(CA)。如果你用的是盗版的操作系统那么CA有可能是假的。
下面简述一下证书的生成和验证过程:
生成证书:
1.服务器将公钥A给CA(公钥是服务器的)
2.CA用自己的私钥B给公钥A加密,生成数字签名A
3.CA把公钥A,数字签名A,附加一些服务器信息整合在一起,生成证书,发回给服务器。
证书验证:
1.客户端得到证书
2.客户端得到证书的公钥B(通过CA或其它途径)
3.客户端用公钥B对证书中的数字签名解密,得到哈希值
4.客户端对公钥进行哈希值计算
5.两个哈希值对比,如果相同,则证书合法
网友评论