先说说加密。
加密分为对称性、非对称性两种。
对称性:双方都用一份加密的密钥。相当于A,B都有一个相同的钥匙。
非对称性:密钥有2个----公钥、私钥,都可以加密、解密。B先把公钥发给A,A用公钥加密,B再用私钥解密。
常用的对称性加密算法:DES,DES3,RC4,RC5,加密速度快,但是相对不安全,密钥在传输过程会被截获
非对称性加密算法:RSA 加密速度相对慢
话说ssh就是用RSA生成的id.rsa,id.pub
但是一般情况下会用混合加密的,兼顾以上2中算法的特点
混合加密:先用对称算法,得到一个密钥,把数据用此密钥加密,再把这个密钥用一个公钥加密,传给对方。对方先用自己的私钥解密,得到密钥,然后用这个密钥解密数据。
数据传输:公钥加密,私钥解密
数字签名:私钥加密,公钥解密
公钥可以给别人,但是私钥一定要自己保管。
数字签名:把一个文件,用私钥加密后,传给对方,对方用我的公钥解密,如果能解开,则证明文件是我传的。
虽然可以保证文件是我发出的,但不能保证文件的完整性。可能别人中途篡改了文件内容。这就需要数字安全签名。
数字安全签名:把文件加上完整性检查,防止中途篡改文件内容。一般是文件用哈希算法(md5,sha1)计算,
figo@figo:~$ openssl dgst -md5 info
MD5(info)= 1374a02bc0909f8f25cd1c41439dd207
得到一个哈希值,俗称校验和(checksum)。把这个校验和一并加密送给对方,对方用我的公钥解密后,计算这个文件的哈希值,
figo@figo:~$ md5sum info
1374a02bc0909f8f25cd1c41439dd207 info
如果计算出来的这个值跟我传的一样,则证明这是我传的,且没有被篡改过的文件。
中间人攻击:但是如果A,B中间有一个黑客C,当A向B发文件时,会请求B的公钥,用于加密。这是黑客C截获了B的公钥,并且伪造了一个B的公钥B'给了A,A无法知道这个B'就是B的公钥。所以就会用B'加密信息发给B,这时C又截获了这个数据,利用自己的B'私钥,解密了数据,然后再用之前截获的B的公钥加密,把数据发给B,当然C篡不篡改数据完全自己说了算,因为B可以解密数据,并且校验和也正确,就确定这个数据就是A发过来的。整个过程对A,B是透明的。
为了防止中间人攻击,就要保证每个人的公钥就是每个人发出的。这样就出现了认证机构(CA Certificate Authority)
CA:是一个大家都信赖的机构,专门来管理大家的公钥。也就是说,只要B的公钥是是CA认证的公钥,我就认为这肯定是B的。之前说了,这个CA就是管理大家公钥的,所以我信任它,就要把我的公钥交给它保管。好吧,那我就向CA申请,请你管理我的公钥。那就填一个申请吧。比如我叫figo
openssl req -newkey rsa:4096 -nodes -sha256 -keyout figo.key -out figo.csr
这样就生成了我的私钥figo.key,跟一个证书请求文件figo.csr,其实这个证书请求文件里就包含你的公钥了。
把这个申请文件发给CA吧。CA拿到这个文件以后,要处理一下:
首先CA要有一个公钥跟私钥,用自己的私钥给figo.csr(我的公钥)文件加密,生成了一个经过CA认证的数字签名文件figo.crt好了,现在你的公钥已经被认证为figo.crt了,我把自己的证书下载到我本地,那以后谁需要我的公钥,我就把证书发给他,他自己CA认证吧。
现在B要访问我了,好吧,如果B想用https加密数据,那我就把证书(figo.crt)发给你吧,B去拿CA的公钥,拿到以后就可以开锁了(figo.crt + CA的公钥 = figo的公钥),开锁以后就拿到了我的公钥。主流的浏览器都记录了大部分CA的地址,遇到https协议的时候会主动去找证书并下载。如果很不幸,这个证书不是任何一家CA发出的,这时浏览器会提醒你:
CA服务器需要这样操作,把figo.csr,也就是我的公钥的请求文件,用自己的私钥ca.key,跟自己的认证证书处理一下,生成我的数字签名证书:figo.crt
openssl ca -in figo.csr \
-out figo.crt \
-cert ca.crt \
-keyfile ca.key \
-outdir .
搭建一个CA服务器
首先要生成一个公钥,私钥对
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout ca.key \
-x509 -days 365 -out ca.crt
然后建立一个目录
mkdir demoCA
cd demoCA
touch index.txt
echo '01' > serial
cd ..
最后注册别人的crs文件
openssl ca -in figo.csr \
-out figo.crt \
-cert ca.crt \
-keyfile ca.key \
-outdir .
下面讲一下openssl命令的用法
openssl version 看看版本
openssl ca 查看安装目录
当然主要功能是加密了,看看支持哪些加解密算法 openssl --help
有N多种加密算法,同学们可以自由选择
主要语法
des3 加密算法
-in inputfile 输入文件
-out outputfile 输出文件
-a 把加密后的文件转为base64
-d 解密
openssl des3 -k 123456 -salt -in info -out info.des3 -a
用des3算法加密,-k:密码是 123456,-salt 加一个盐值
也可以用哈希把一个文件打散,用dgst命令,里面支持md4,md5,sha,sha1,sha256,sha512,,rmd160等
openssl dgst -md5 fileName
用sha1签名一个文件
openssl sha1 -sign figo.key -out info.rsa info
验证签名
openssl sha1 -verify figo.pub -signature info.rsa info
根据私钥导出公钥
openssl rsa -in figo.key -passin pass:trousers -pubout -out figo.pub
用公钥加密、解密一个文件
openssl rsautl -encrypt -pubin -inkey figo.pub -in plain.txt -out cipher.txt
openssl rsautl -decrypt -inkey figo.key -in cipher.txt -out plain.txt
用私钥加密解密一个文件
openssl rsautl -sign -inkey figo.key -in plain.txt -out signature.bin
openssl rsautl -verify -pubin -inkey figo.pub -in signature.bin -out plain