一:hash或者散列(摘要)算法
1. md5散列生成测试:
echo '123456'|md5sum
f447b20a7fcbf53a5d5be013ea0b15af -
2.什么是salt?怎么知道有没有加salt?
假如我linux上的密码是'123456',我用openssl生成密码试下:
openssl passwd -1 '123456'
$1$.ZJzk4VI$S7/faPeN8WEN9UpFKTTIY.
唉?为什么上1中生成的md5值不一样????
1中为f447b20a7fcbf53a5d5be013ea0b15af,
而这里生成为S7/faPeN8WEN9UpFKTTIY.
原来里面默认加salt了,那加的salt是多少?原来是.ZJzk4VI,怎么看出来的?不告诉你,因为你自己长眼睛了;
当id为1时,使用md5加密,id为5,采用SHA256进行加密,id为6采用SHA512进行加密,所以说此处使用md5加密,salt为.ZJzk4VI(我们没有加,系统生成了一个随机salt)
哦,原来我们没有加salt时,系统会随机加一个salt;
究竟是不是随机的?我们做个测试:
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$jiIqc5TJ$h/V7O.dsJwhKHZnnWm.ip0
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$DdSmc0jC$OXmJIfAtrWC0byxV7e4Q4/
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$M3ivhDMU$ceXGazOgTS4yQmhGFM6dB/
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$Sb5LVfgr$HfCd6n6n37TfU7WkMCZTw.
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$wO02OttQ$r.eqE.h2xdDvABF5Ydczw0
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$AGUYW7t9$Zkg.2BW6Iz5dO/gqV5tMX/
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$C7xfGsLS$UaVk.Kil6rTJpGw4/NCfW1
liuxingde@ubuntu:~$ openssl passwd -1 '123456'
$1$OlI184pR$p6RhZq4xcugohsMTVeXH0/
上在每次的salt都不一样,所以生成的md5值不一样;
使用md5,salt固定时,同一个密码;
openssl passwd -1 -salt '.ZJzk4VI' '123456'
$1$.ZJzk4VI$S7/faPeN8WEN9UpFKTTIY.
3.测试linux密码:
[root@RV1126_RV1109:~]# cat /etc/shadow
root:$1$qFWlLOg5$ngAa3sLQ7mmbDO3uRNguO1:10933:0:99999:7:::
openssl passwd -1 -salt 'qFWlLOg5' 'qwer1234'
$1$qFWlLOg5$ngAa3sLQ7mmbDO3uRNguO1
4.base64编码:
liuxingde@ubuntu:~$ echo "123456"|openssl base64
MTIzNDU2Cg==
5. 从文件生成md5:
echo "123456"|openssl md5
(stdin)= f447b20a7fcbf53a5d5be013ea0b15af
liuxingde@ubuntu:~$ echo "123456"|md5sum
f447b20a7fcbf53a5d5be013ea0b15af -
openssl md5 1.txt
MD5(1.txt)= f447b20a7fcbf53a5d5be013ea0b15af
6.hash算法:利用openssl命令生成摘要
liuxingde@ubuntu:~/openssl$ openssl sha 1.txt
SHA(1.txt)= 0f5ef460b71723d1421f93beee2ecfb1c1174beb
liuxingde@ubuntu:~/openssl$ openssl sha1 1.txt
SHA1(1.txt)= c4f9375f9834b4e7f0a528cc65c055702bf5f24a
liuxingde@ubuntu:~/openssl$ openssl sha256 1.txt
SHA256(1.txt)= e150a1ec81e8e93e1eae2c3a77e66ec6dbd6a3b460f89c1d08aecf422ee401a0
liuxingde@ubuntu:~/openssl$ openssl sha384 1.txt
SHA384(1.txt)= df654d6a5a655cd9f39af072ca08b1640d9a3122514e3169b12db2dc45fa435788d501a87d3a8c00c048418641497286
二:对称加密算法:
AES(Advanced Encryption Standard), 用来替代DES(Data Encryption Standard),包含五种模式:
流加密(如OFB、CFB等)和块加密(如ECB、CBC等)
ECB(Electronic Code Book电子密码本)模式;
加密:
echo 123456 > 1.txt
liuxingde@ubuntu:~/openssl$ openssl aes-128-cbc -in 1.txt -k 123 -base64
U2FsdGVkX1/OgaIedDdSQtpp36+YeBvWkkvb1hEdR4k=
解密:
openssl aes-128-cbc -d -k 123 -base64 -in aes-128-cbc-1.txt
123456
三:非对称加密
对称加密中,我们只需要一个密钥,通信双方同时持有。
而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。公钥用
来对信息加密。私钥由信息接受方保留,用来解密。既然公钥是公开的,就不存在保密问题。也就是说非对称加密完全不存在密
钥配送问题!你看,是不是完美解决了密钥配送问题?
公钥只能用做数据加密。公钥加密的数据,只能用对应的私钥才能解密。这是非对称加密的核心概念。
1.最早开发的实用非对称密码系统之一是RSA;
这是三位共同发明人的首字母缩写:Ron Rivest、Adi Shamir和Leonard Adleman。该加密系统于1983年获得专利,并于2000年
由RSA Security发布到公有领域。RSA系统指定了用于生成和分发密钥以及使用这些密钥的加密和解密操作的机制。我们将不深
入讨论所涉及的数学细节,但是,重要的是要知道密钥生成过程取决于选择两个唯一、随机且通常非常大的素数。
2. DSA(Digital Signature Algorithm):数字签名算法
DSA是是非对称加密系统的另一个例子,用于签名和验证数据,于1991年获得专利,是美国政府联邦信息处理标准的一部分。
与RSA类似,DSA涵盖了密钥生成过程以及使用密钥对签名和验证数据。需要指出的是,该系统的安全性取决于选择一个随机种子值,
该值被纳入到签名过程中。
一,公钥私钥
1,公钥和私钥成对出现
2,公开的密钥叫公钥,只有自己知道的叫私钥
3,用公钥加密的数据只有对应的私钥可以解密
4,用私钥加密的数据只有对应的公钥可以解密
5,如果可以用公钥解密,则必然是对应的私钥加的密
6,如果可以用私钥解密,则必然是对应的公钥加的密
明白了?
假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们,然后我告诉大家,1是我的公钥。
我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密。这样我就可以保护数据了。
我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。
现在我们知道用公钥加密,然后用私钥来解密,就可以解决安全传输的问题了。如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是1,那么这种加密有什么用处呢?
但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他解密看是不是c。他用我的公钥1解密,发现果然是c。这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。
好,我们复习一下:
1,公钥私钥成对出现
2,私钥只有我知道
3,大家可以用我的公钥给我发加密的信了
4,大家用我的公钥解密信的内容,看看能不能解开,能解开,说明是经过我的私钥加密了,就可以确认确实是我发的了。
总结一下结论:
1,用公钥加密数据,用私钥来解密数据
2,用私钥加密数据(数字签名),用公钥来验证数字签名。
在实际的使用中,公钥不会单独出现,总是以数字证书的方式出现,这样是为了公钥的安全性和有效性。
二,SSL
我和我得好朋友x,要进行安全的通信。这种通信可以是QQ聊天,很频繁的。用我的公钥加密数据就不行了,因为:
1,我的好朋友x没有公私钥对,我怎么给他发加密的消息啊? (注:实际情况中,可以双方都有公私钥对)
2,用公私钥加密运算很费时间,很慢,影响QQ效果。
好了,好朋友x,找了一个数字3,用我的公钥1,加密后发给我,说,我们以后就用这个数字来加密信息吧。我解开后,得到了数字3。这样,只有我们两个人知道这个秘密的数字3,别的人都不知道,因为他们既不知x挑了一个什么数字,加密后的内容他们也无法解开,我们把这个秘密的数字叫做会话密钥。
然后,我们选择一种对称密钥算法,比如DES,(对称算法是说,加密过程和解密过程是对称的,用一个密钥加密,可以用同一个密钥解密。使用公私钥的算法是非对称加密算法),来加密我们之间的通信内容。别人因为不知道3是我们的会话密钥,因而无法解密。
好,复习一下:
1,SSL实现安全的通信
2,通信双方使用一方或者双方的公钥来传递和约定会话密钥 (这个过程叫做握手)
3,双方使用会话密钥,来加密双方的通信内容
上面说的是原理。大家可能觉得比较复杂了,实际使用中,比这还要复杂。不过庆幸的是,好心的先行者们在操作系统或者相关的软件中实现了这层(Layer),并且起了一个难听的名字叫做SSL,(Secure Socket Layer)。