加密算法
所谓加密算法就是指将信息变成密文的计算方法。 可以很简单也可以很复杂。
有的加密算法就是对信息进行简单的替换和乱序, 这种加密算法最明显的缺陷就是算法本身必须保证是保密的。
现代加密算法通常需要密匙来完成对信息的加密运算, 算法本身是可以公开的, 理论上, 只要保证密匙的安全就能保存信息的安全
对称加密算法与非对称加密算法
基于密匙的加密算法可以分为两大类: 对称加密算法和非对称加密算法(也叫公钥算法)。
对称加密算法
加密数据和解密数据都是用的同一个密匙。
非对称加算法
密匙分为公钥和私钥, 公钥用来加密数据, 私钥用来解密数据; 不能从公钥推导出私钥; 任何人都可以拥有公钥,都可以用来加密数据, 只有拥有私钥的人才能将信息解密。
RSA算法
RSA算法是当今使用最为广泛的非对称加密算法。
详细可参考 阮一峰-RSA算法原理(一)
PKI 公开密匙体系
PKI是Publick Key Infrastruction的缩写
对称加密算法的致密弱点在于密匙的安全性,导致对称加密体系解决不了密匙分配和管理的问题。
非对称加密算法的缺点是速度慢, 非对称加密算法比对称加密算法要慢的多。
因此非对称加密不适合用于大量的数据加密传输。 为了实现数据的加密传输, 非对称加密需要和对称加密结合使用, 即非对称负责对称密匙交换, 对对称加密算法负责实际的数据加密。
大概的流程如下:
- 用户1 生产随机的secrect key1
- 使用用户1的公钥对secrect key1进行加密, 然后传递给用户2
- 用户2接收到加密的secrect key1, 使用对应的私钥进行解密,得到secrect key1
- 用户2 生产随机的secrect key2
- 使用用户2的公钥对secrect key2进行加密, 然后传递给用户1
- 用户1接收到加密的secrect key2, 使用对应的私钥进行解密,得到secrect key2
- 用户1和用户2就可以使用secrect key1, secrect key2进行加解密
(? 不是太明白为什么需要secrect key1, secrect key2两个密匙, 使用一个应该就可以)
公开密匙体系除了可用于安全密匙交换之外, 还可以用于鉴别用户身份。
这种是两个用户都有自己的私钥和对方的公钥。 意思有两对公钥私钥:
- 用户1使用自己的私钥加密message1, 将加密后的信息传递给用户2
- 用户2使用用户1的公钥对数据进行解密, 然后使用自己的私钥对这个数据进行加密, 再传递给用户1
- 用户1使用用户2的公钥对数据进行解密, 看是否和之前发出的数据一致
同样的原理, 公开密匙算法可以对数据进行签名和校验, 保证数据的一致性和完整性。
- 用户1将数据和对数据加密之后的签名一起发送给用户2
- 用户2使用用户1的公钥对数据进行签名, 然后与接收的数据进行比较, 如果一致证明数据没有别篡改
因为非对称加密算法很慢, 对数据签名一般不采用直接加密数据的方式, 而是加密数据的散列值。
数据的散列值是通过单向散列函数计算得到的一个固定长度的值, 消息不同得到的散列值也有很大的差异。
单向的意思就是,不可能从散列值反推出原始数据。比较数据的散列值与数据本身是等价的。 常用的消息散列算法有MD5和SHA-1等。
非对称算法(也就是公钥算法)仍然要面临公分发, 公钥、私钥与用户(比如说一个网站)真实身份绑定的问题。
验证用户(一个网站)身份, PKI引入了证书机制解决这个问题, 证书由证书注册中心(CA)统一颁发。
用户(一个网站)获得自己的证书后, 就可以使用证书来表明自己的身份, 接收方只要使用CA中心的公钥验证用户的证书, 如果验证成功, 就可以信任该证书的用户的身份。
SSL
安全套接字层
internet是一个开放的网络环境, 意味着网络上传输的任何数据都有被截取和监听的可能。 当你向网站提交一些信息时, 这些信息从你的计算机传出, 通过internet上的若干节点之后, 到达服务器, 在这中间的过程中, 这些数据完全是暴露的, 任何人只要有适当的工具都可以截取这些数据。
SSL就是用来解决这一个问题的。
SSL位于TCP/IP层和HTTP应用层之间的一层, 是用来加密数据的。 浏览器的SSL实现采用了RSA公司的公钥、私钥加密系统和数字证书应用系统。
当今的主流浏览器都内置了对SSL的支持
SSL也是使用 非对称负责对称密匙交换, 对对称加密算法负责实际的数据加密这种方式, 这个工程称为
SSL握手。
- 客户端向服务器发送客户端的SSL版本号, 加密算法设置等
2.服务器 向客户端发送客户端的SSL版本号, 加密算法设置等 和证书 - 客户端验证服务器身份
- 客户的创建secret(对称加密秘钥), 用服务器的公钥加密(公钥在服务器证书中)
- 如果服务器也要求验证客户端的身份, 那么客户端也需要把自己的证书传递给服务器