密钥
在http通信里面。我们要关注传输的安全性。
如果使用明文传输,那么我们的密码就会被窃取
我们毫不犹豫选择密文传输
既然是密文传输就要考虑如何加密和解密问题:
1.服务器如何选择加密算法
2.客户端如何翻译成为明文
加密基础知识
1.对称加密:指的是加密方和解密方使用的是同一个密钥
优点:加密解密的速度很快
缺点:如果两个从未通信过的用户要进行通信的时候,
该如何把解密的密钥传输给对方呢(密钥仍然要在网络上传输,
所以密钥还是可能会被“中间人”截获),这是对称加密最大的缺点;
常见的对称加密算法有:
DES:使用56位的密钥,2000年的时候被人破解了,所以现在基本不再使用
AES:高级加密标准,可以使用128,129,256 512 1024 2048 4096密钥
其他的还有blowfish,Twofish和RC6,IDEA(商业算法),CAST5等
2.非对称加密:非对称加密方式解决了对称加密的缺陷,
它的加密和解密密钥是不同的,比如对一组数字加密,我们可以用公钥对其加密
然后我们想要将其还原,就必须用私钥进行解密,公钥和私钥是配对使用的,
常见的非对称加密算法有:
优点: 加密和解密 用不同密钥
缺点:加密速度非常慢
RSA:既可以用来加密解密,又可以用来实现用户认证
DSA:只能用来加密解密,所以使用范围没有RSA广
非对称加密长度通常有512,1024,2048,4096位,最常用的就是2048位,
长度固然可以增加安全性但是需要花费很长时间来进行加密/解密,和对称加密相比,
加密/解密的时间差不多是对称加密的1000倍,所以我们通常用其作为用户认证,用对称加密来实现数据的加密/解密
3. 单项加密:
单向加密就是用来计算一段数据的特征码的,为了防止用户通过“暴力破解”的方式解密,所以单向加密一般具有“雪崩效应”。
就是说:只要被加密内容有一点点的不同,加密所得结果就会有很大的变化。
单项加密还有一个特点就是无论被加密的内容多长/短,加密的结果(就是提取特征码)是定长的,
用途:用于验证数据的完整性,常用的单项加密算法
特点:加密后的数据长度固定:128
MD5:这种加密算法固定长度为128位
SHA1:这种加密算法固定长度是160位
问题:
密钥不只是一个。
我要怎么才能知道客户端里面的有什么密钥?支持哪些密钥?
服务器支持什么密钥?
如何和客户端约定好,两者使用什么密钥?
这些我们都是要知道的。
为了解决这个问题:
抽象一点:我们一个人管理所有密文。对于服务端只给一部分。
然后由服务端给客户端一部分密钥。
这样子可以保证客户端的密钥都是服务器支持的。
这就是这里的SLL证书。
自己生成根密钥方法:( 自建根证书 )
首先检测自己是不是安装了openssl
rpm -ql openssl
openssl version
没有安装
apt install openssl
第一步我们建立根证书:(#是注释)
#1.进入根目录,创建文件
cd /
mkdir ca
mkdir ca/root
#2.创建根证书目录
cd /ca/root
#3.#建立相关目录,private存放根凭证的私钥,cert存放根凭证的凭证,signed_certs存放根凭证签发过的凭证的副本.
mkdir private cert signed_certs
#变更private目录的存取权限.
chmod 700 private
#建立index.txt,此档案会用来纪录根凭证签发过的凭证的纪录,每次根凭证签发凭证OpenSSL会自动更新此档案.
touch index.txt
#建立serial,并在档案中填入0001,被签发的凭证都会有序号的栏位,纪录此凭证在上一层签发单位所签发的凭证的序号,此档案会用来纪录根凭证签发的凭证的序号,每次根凭证签发凭证OpenSSL会自动更新此档案.
echo 0001 > serial
创建openssl_root_ca.cnf并放置在root目录内,内容:
[ ca ]
default_ca = CA_default
[ CA_default ]
#放置相关的档案和目录.
dir = /ca/root
certs = $dir/cert
new_certs_dir = $dir/signed_certs
database = $dir/index.txt
serial = $dir/serial
RANDFILE = $dir/private/.rand
#放置私钥和凭证的路径.
private_key = $dir/private/root_ca.key.pem
certificate = $dir/cert/root_ca.cert.pem
default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days = 365
preserve = no
policy = policy_defualt
[ policy_defualt ]
#签发中继凭证时资料的检查(是否必须和根凭证一样).
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
# req工具需要的参数.
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
default_md = sha256
[ req_distinguished_name ]
#产生凭证时要输入的资料的说明.
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name
localityName = Locality Name
0.organizationName = Organization Name
organizationalUnitName = Organizational Unit Name
commonName = Common Name
emailAddress = Email Address
[ root_ca ]
#签发根凭证使用.
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ intermediate_ca ]
#签发中继凭证使用.
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign