RSA算法
RSA是一种非对称公钥加密算法,采用公钥对数据进行加密,用私钥对数据进行解密。通常,公钥是公开的,私钥自己保留不能公开,所以在采用RSA加密算法进行通信时,信息发送者与信息接受者之间互相传递的就是公钥和数据。
要知道,无论是数据加密还是数字签名,都是出于安全性的考虑,两者不同之处在于,数据加密是加密数据,防止数据泄漏,而数字签名是由数据生成签名,防止伪造数据,篡改数据。
数据加密
数据加密过程中,使用公钥加密数据,私钥解密。
场景一:
A与B通信,A向B发送消息,过程如下:
- B向A公布自己的公钥
- A使用B的公钥对需要发送的数据进行加密
- B收到A发送的加密数据,使用自己的私钥进行解密
在这个A–>B发送消息的过程中,即使A的消息以及B的公钥都被截获,仍旧无法获取A的真实内容。
此种场景下,保证了消息的安全性,但有一个前提就是B想接收的就是A的消息,加入此时有一名黑客C,使用B公布的公钥伪造假消息发送给B,或者截获A的消息,然后篡改消息,B是无法鉴别的,因此,数字签名就有必要了。
数字签名
数字签名使用私钥进行加签, 使用公钥进行验签。
场景二:
A向B发送消息,黑客C也向B发送假消息,因为B只想要A的消息,所以过程如下:
- A公布自己的公钥,B获取A的公钥
- A使用自己的私钥对消息进行加签(同时,该消息内容也可以使用数据加密),然后将签名以及消息同时发送给B
- B使用A的公钥对签名进行解签,解析处理来的内容与实际的消息内容一样,可以证明该消息确实是A发送的
在此过程中,如果C向B发送伪造的消息,B使用A的公钥对伪造消息的签名进行验签,一定是不通过的。
综上,数据加密和数字签名各司其责,一个保证数据安全,一个保证数据正确,所以在消息传递过程中,为了保证安全性,可以考虑使用两者。
RSA密钥
密钥文件格式
密钥(包括私钥与公钥)格式只有两种,der与pem
der:一种特殊的二进制格式
pem:经过base64 ASCII编码的纯文本格式
PEM文件
既然PEM文件是纯文本文件,那么很显然是可以用文本软件直接打开的,只不过看到的是编码过的信息,如果希望看到真实的内容,需要使用openssl 工具打开。
openssl x509 -in baidu.crt -text -noout
DER文件
der文件是一种二进制文件,如果用一般的文本编辑器如vim打开,会是乱码,需要是用openssl命令来查看具体信息
openssl rsa -inform der baidu.key -text -noout
文本软件 | openssl | |
---|---|---|
PEM文件 | ||
DER文件 |
密钥文件后缀
常见文件后缀
- .cer, .cert:window平台下的常见证书文件,格式可以为der,也可以是pem,只包含公钥
- .crt:Linux平台下的证书文件,格式同上,也只包含公钥
- .key:私钥文件,格式同上,只包含私钥
其他文件后缀
- .csr:证书生成请求文件,一般用于向CA机构提交生成证书文件
- .pfx, .p12:windows平台常用的der格式文件,包含公钥与私钥
- .jks:java密钥库,包含公钥与私钥
- .pem, .der:即是文件格式,也可以是文件后缀,什么后缀,就表示什么格式文件,一般公钥用该后缀
密钥使用方法
一般情况下,rsa密钥需要**私钥/证书(并非公钥)**配合使用,需要三个步骤:
- 本地生成私钥文件private.key
- 如果是自签证书(即没有CA机构认证过的),只需根据私钥生成证书,即可使用
- 如果是生产环境,一般需要CA机构认证证书,则需要根据私钥生成certificate.csr文件,然后将csr文件提交CA机构生成证书,即可使用
PS:如果需要用到公钥文件,则可以根据私钥生成公钥
公钥与证书的区别
既然数字签名与信息的加/解密都是基于公/私钥的,那么为什么要证书呢。
证书显然是包含公钥的,同时还包含CA的机构信息等,表示该该公钥是一个经过权威机构认证的合格的证书。
证书通常是CA认证机构用自己的私钥对用户的公钥进行数字签名,CA机构向公众公布自己的公钥,然后使用该证书的用户就可以验证该公钥是否是认证过的合法的公钥。
常用openssl命令
操作 | openssl 命令 | |
---|---|---|
生成私钥 | openssl genrsa -out privkey.pem 2048 |
|
生成自签证书 | openssl req -new -x509 -key privkey.key -out cacert.pem -days 3650 |
|
生成CSR文件 | openssl req -new -key privkey.key -out cert.csr |
|
生成公钥 | openssl rsa -in privkey.key -pubout -out pubkey.pem |
|
查看key文件 | openssl rsa -in private.key -text -noout |
|
查看公钥 | openssl rsa -pubin -in public.pem -text -noout |
|
查看der 格式的证书文件 | openssl x509 -inform der -in certificate.cer -text -noout |
添加-inform der命令表示der文件 |
查看pem格式的证书文件 | openssl x509 -in certificate.cer -text -noout |
省略掉-inform选项 |
pem转换der | openssl x509 -in myserver.pem -outform der -out myserver.crt |
|
der转换pem | openssl x509 -inform der -in myserver.der -out myserver.crt |