对称加密
DES、3DES、AES、Blowfish、IDEA、RC5、RC6。最常用的是AES。
非对称加密
何为非对称:加密和解密使用算法不一样 或 加密和解密的算法互不可逆。
x³+㏒₂(x)+sin(x)=y,给定x,求y很容易,但给出y求出x几乎不可能,非对称加密的算法比这些公式还难几万倍。
非对称加密的主要算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线算法)。其中使用最广泛的是RSA算法。
公钥加密,私钥解密
加密数据的,既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以是公钥负责加密,私钥负责解密
比如ssh登录远程主机就是使用的这种方式(这种是要输入密码的,注意不是无密码公钥登录)
其原理和过程是这样的:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户输入登录密码,然后使用这个公钥将登录密码加密后,发送回远程主机。
(3)远程主机用自己的私钥,解密登录密码,将解密后的密码和自己的密码比对,如果正确,就同意用户登录。
私钥加密,公钥解密
用来进行身份验证和文件完整性的,使用场景:数字签名,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责加密,公钥负责解决。
数字签名(指纹)
- 消息发送者生成秘钥对: (sk,pk):= generates(keysize)
- 消息发送者生成数字签名: signature := encrypt(sk, message)
- 消息接收者验证发送者身份: isValid := isEqual(decrypt(pk, message),message)
缺点: 该方法直接对传递的原始数据进行加密,当数据很大时,对数据进行签名和传输的效率很低。
改进:此时我们可以通过哈希函数提取数据的特征值,然后只对数据的哈希值进行签名。这里原始数据的哈希值被称为摘要。 由于哈希函数的特点,通过哈希值同样可以验证签名的私钥身份,同时还避免了对整段数据进行加密和传输的开销。
采用哈希函数后的数字签名原理如下:
- 消息发送者生成秘钥对: (sk,pk):= generates(keysize)
- 消息发送者生成数字签名: signature := encrypt(sk, hash(message))
- 消息接受者验证发送者身份: isValid := isEqual(decrypt(pk, signature),hash(message))
除了验证公钥拥有者的身份之外,数字签名还可以证明传输的数据没有被人恶意篡改,因为如果数据被篡改了,数据的哈希值就和解密后的签名对不上。
缺点:如果黑客偷偷用自己的公钥把A给B的公钥替换了,然后黑客写一封假信hash后,再用自己的私钥对假信加密,发送给B,B仍然是可以解密。但事实上B看到的信却不是A给他的发的了。
那如何保证B现在使用的公钥就是A发的呢?
改进: 通过数字证书来证明公钥的真实性。
数字证书(公钥证书)
将( 服务器真实的公钥 + 网站姓名+地址+联系方式)加起来,用世界公认的权威机构的私钥加密后发给浏览器,浏览器使用内置的公钥解密后得到真实服务器的公钥,再用这个真实的服务器公钥去解密服务器用私钥加密的网页信息。
RFC5280定义了x.509公钥证书的标准格式
- 证书拥有者的身份信息:证明证书持有者的身份,身份证上的姓名年龄性别地址身份证号
- CA机构的签名:CA签名用于保证身份的真实性;身份证上的公安局印章。
- 公钥和私钥:用于通信过程中加解密。
https证书过程
- openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout [$Key_File] -out [$OpenSSL_CSR],在本地生成私钥key和CSR,CSR中包含了Alice的公钥和姓名,机构、地址等身份信息。
- 使用该CSR向证书机构发起数字证书申请。
- 证书机构验证网站身份后,使用CSR中的信息生成数字证书pem,并使用自己的CA根证书对应的私钥对该证书签名。
- 网站使用自己的私钥对网页进行加密,然后将加密后的网页和自己的网站证书一起并发送给浏览器。
- 浏览器用内置的证书机构根证书中的公钥解密网站证书,得到网站公钥和网站的个人信息。
- 如果得到的网址与浏览器中的网址一样,说明网站可信,浏览器就使用网站公钥解密用网站私钥加密的网页。如果得到的网址与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
如果浏览器的根证书列表里面没有能解开数字证书的ca证书,就说明就说明服务器发过来的这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
哈希算法(散列)
MD4(Message-Digest Algorithm)
MD5
1991年 输出128位 (已经不安全)
MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515128位是16字节,为什么上面的值是32个字符,32字节? 因为上面的算出来的值是用16进制表示的。16进制下,2个字符占1个字节。
SHA-0(Secure Hash Algorithm)
1993年 输出160位 (发布之后很快就被NSA撤回,是SHA-1的前身)
SHA-1
SHA-2
包括SHA-224、SHA-256、SHA-384,和 SHA-512,分别输出- 224、256、384、512位。 (目前安全)
SSL行业多选择SHA-256作为数字签名的散列算法
以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为:
- MD5算法运行1000次的平均时间为:226ms
- SHA1算法运行1000次的平均时间为:308ms
- SHA256算法运行1000次的平均时间为:473ms
安全性方面,显然SHA256(又称SHA2)的安全性最高,但是耗时要比其他两种多
参考
https://blog.csdn.net/WuLex/article/details/81477097
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
数字证书原理-赵化冰的博客