上善若水,不浮不沉!
分类: LINUX
2015-07-30 15:05:24
一、详细介绍加密、解密技术
现在的加密/解密技术主要有三种:对称加密,非对称加密,和单向加密
这 三种加密解密技术的组合就是现在电子商务的基础,它们三个有各自最适合的领域,而且所要完成的功能也是不同的,大家都知道,只要我们连上互联网,那么我们 就相当于大门洞开,我们的一些隐私,跟其他人对话内容等都有可能会被人窃听,最常见的比如man in the middle(中间人),它主要是因为双方身份无法验证的时候回话被劫持造成的,就是说通信双方都以为是在跟对方交流,其实内容都可能已经被这个“中间 人”修改过,一些重要的信息也被这个“中间人”所获得,这对于现在的电子商务来说是致命的,所有我们必须找到一种解决方案来解决这个问题
对称加密:指的是加密方和解密方使用的是同一个密钥
优点:加密解密的速度很快
缺点:如果两个从未通信过的用户要进行通信的时候,该如何把解密的密钥传输给对方呢(密钥仍然要在网络上传输,所以密钥还是可能会被“中间人”截获),这是对称加密最大的缺点;
常见的对称加密算法有:
DES:使用56位的密钥,2000年的时候被人破解了,所以现在基本不再使用
AES:高级加密标准,可以使用128,129,256三种长度密钥
其他的还有blowfish,Twofish和RC6,IDEA(商业算法),CAST5等
非对称加密:非对称加密方式解决了对称加密的缺陷,它的加密和解密密钥是不同的,比如对一组数字加密,我们可以用公钥对其加密,然后我们想要将其还原,就必须用私钥进行解密,公钥和私钥是配对使用的,常见的非对称加密算法有:
RSA:既可以用来加密解密,又可以用来实现用户认证
DSA:只能用来加密解密,所以使用范围没有RSA广
非 对称加密长度通常有512,1024,2048,4096位,最常用的就是2048位,长度固然可以增加安全性但是需要花费很长时间来进行加密/解密,和 对称加密相比,加密/解密的时间差不多是对称加密的1000倍,所以我们通常用其作为用户认证,用对称加密来实现数据的加密/解密
单项加密: 单向加密就是用来计算一段数据的特征码的,为了防止用户通过“暴力破解”的方式解密,所以单向加密一般具有“雪崩效应”就是说:只要被加密内容有一点点的 不同,加密所得结果就会有很大的变化。单项加密还有一个特点就是无论被加密的内容多长/短,加密的结果(就是提取特征码)是定长的,用途:用于验证数据的 完整性,常用的单项加密算法
MD5:这种加密算法固定长度为128位
SHA1:这种加密算法固定长度是160位
下图是帮助我们理解加密算法在Internet上的使用所作的说明:
解释如下,先说BOB和ALICE通信阶段
黑框A:表示要传输的数据
黑框B:就是单项加密对这段数据提取的特征码,这段特征码同时运用了非对称加密,具体过程是用BOB的私钥加密,传输给ALICE,只要到达后ALICE能解密,表明对方确实是BOB。这一过程同时起到了用户认证和数据完整性的校验。黑框B又称为数字签名
红框A:这一阶段会生成一段很长的随机数(密钥)然后配合对称加密算法对黑框A和黑框B加密,但是我们如何把加密的密钥传输给ALICE呢?这就要用到红框B了
红框B:这一阶段是用ALICE的公钥加密这串随机数(对称加密阶段的密钥),ALICE接受到数据后如果能用自己私钥解密,那就证明接受者确实ALICE
加密过程:
第一步:用单向加密算法提取数据(黑框A)的特征值
第二步:用自己的私钥加密这段特征值形成黑框B
第三步:用对称加密算法,对黑框A和黑框B来加密,得到红框A
第四步:用ALICE的公钥来加密第三步所用的密钥,得到红框B
解密过程:
第一步:ALICE用自己的私钥解密红框B得到对称加密的密钥
第二步:用这个密钥解密红框A内容
第三步:用BOB的公钥解密黑框B,如果能成功,说明发送方确实是BOB,这就完成了身份验证(解密后会得到一串数据的特征值)
第四步:用同样的单项加密算法来对这段数据提取特征值,如果和第三步的特征值一样,说明这段数据是完整的,这就完成了数据完整性的校验
进行完上述内容厉害的读者会发现一个问题就是BOB和ALICE如何获得对方的公钥,或者说如何证明获得的公钥就是对方,这就需要引入另一方证书颁发机构CA,下面是对证书颁发机构跟BOB/ALICE之间的解释
黑框C:代表要颁发给BOB/ALICE的公钥,组织,地址等信息
黑框D:是对黑框C进行单向加密后得到的数字签名,然后用自己的私钥对其加密,传输给BOB和ALICE,拿着这个证书颁发机构的公钥(这些证书颁发机构
的公钥一般已经被microsoft事先放在windows里面,当然其他操作系统也是一样的)的BOB和ALICE如果能对这个证书进行解密,说明这个
证书颁发机构不是冒充的
红框E:表示颁发给BOB和ALICE的证书
二、openssl使用详解
在讲述之前首先要知道openssl中有如下后缀名的文件
.key格式:私有的密钥
.crt格式:证书文件,certificate的缩写
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
常用证书协议
x509v3:IETF的证书标准
x.500:目录的标准
SCEP: 简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的
PKCS#7: 是封装数据的标准,可以放置证书和一些请求信息
PKCS#10: 用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据
PKCS#12: 用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx
openssl主要组成部分
[root@stu2~]# rpm -qa|grep openssl/usr/lib64/libcrypto.so.10 #libcrypto主要实现加密解密的工具/usr/lib64/libssl.so.10 #主要实现ssl功能的/usr/bin/openssl #多用途的命令行程序[root@stu2~]# openssl version #查看openssl的版本号OpenSSL1.0.0-fips 29 Mar 2010
[root@stu2~]# cp /etc/fstab ./ #复制文件到当前目录下
[root@stu2~]# ls
anaconda-ks.cfg boot fstab install.log install.log.syslog ks.cfg
[root@stu2~]# openssl enc -des3 -in fstab -e -out fstab.des3 #对文件进行加密测试输出到fstab.des3
enterdes-ede3-cbc encryption password: #输入密码
Verifying- enter des-ede3-cbc encryption password: #再次输入相同密码
[root@stu2~]# ls #查看
anaconda-ks.cfg fstab install.log ks.cfg
boot fstab.des3 install.log.syslog
[root@stu2~]# cat fstab.des3
Salted__)申.2t~?..?? #后面的省略掉了
[root@stu2~]# lsanaconda-ks.cfg fstab install.log ks.cfgboot fstab.des3 install.log.syslog[root@stu2~]# rm -f fstab #删除原文件[root@stu2~]# lsanaconda-ks.cfg boot fstab.des3 install.log install.log.syslog ks.cfg[root@stu2~]# openssl enc -des3 -in fstab.des3 -d -out fstabenterdes-ede3-cbc decryption password: #输入加密时的密码[root@stu2~]# lsanaconda-ks.cfg fstab install.log ks.cfgboot fstab.des3 install.log.syslog[root@stu2~]# cat fstab #查看文件明文的列出了一部分##/etc/fstab#Created by anaconda on Sat Aug 10 08:33:02 2013
需要知道的是除了用上述命令获取文件的特征码之外,还可以通过md5sum fstal来获取,结果是相同的,[root@stu2~]# rm -f fstab.des3[root@stu2~]# lsanaconda-ks.cfg boot fstab install.log install.log.syslog ks.cfg[root@stu2~]# openssl dgst -md5 fstab #用md5单向加密算法获取文件的特征码MD5(fstab)=70adea925c86b2fa91e6a4900b31508a[root@stu2~]# openssl dgst -md5 -hex fstab #获取16进制的特征码,默认就是16进制的可以省略MD5(fstab)=70adea925c86b2fa91e6a4900b31508a[root@stu2~]# vim fstab #在文件第一行添加一个#[root@stu2~]# openssl dgst -md5 -hex fstab #重新获取文件的特征码MD5(fstab)=f8bd8f3c19697c85d4d683b0c4f0169b#和之前的特征码几乎完全不同,这就是所谓的雪崩效应
[root@stu2~]# openssl dgst -md5 -hex fstabMD5(fstab)=f8bd8f3c19697c85d4d683b0c4f0169b[root@stu2~]# md5sum fstabf8bd8f3c19697c85d4d683b0c4f0169b fstab
[root@stu2~]# openssl speed des-ede3Doingdes ede3 for 3s on 16 size blocks: 3298403 des ede3's in 2.99sDoingdes ede3 for 3s on 64 size blocks: 828631 des ede3's in 2.99sDoingdes ede3 for 3s on 256 size blocks: 209735 des ede3's in 2.99sDoingdes ede3 for 3s on 1024 size blocks: 52521 des ede3's in 3.00sDoingdes ede3 for 3s on 8192 size blocks: 6691 des ede3's in 2.98sOpenSSL1.0.0-fips 29 Mar 2010builton: Thu Feb 21 23:42:57 UTC 2013options:bn(64,64)md2(int) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)compiler:gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN-DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector--param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack-DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DSHA1_ASM-DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DWHIRLPOOL_ASMThe'numbers' are in 1000s of bytes per second processed.type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytesdesede3 17650.32k 17736.58k 17957.24k 17927.17k 18393.51
[root@stu2~]# openssl passwd -1 -salt 12345678Password:$1$12345678$85L2ohc0YJ4r/l1LAa6co1说明:其中-1表示基于md5的加密算法,-salt添加一些额外数(一般为8位),当前最好使用无规律的随机数,通过帮助文档可以进行查看man sslpasswd[root@stu2~]# openssl rand -hex 4 #随机生产8位随机数2c58639e[root@stu2~]# openssl passwd -1 -salt `openssl rand -hex 4`#通过salt后加密计算密码值Password: #输入密码$1$ca64684d$tQyI7a.yLwbQRMulUBMCI/ #生成的密码值# man sslpasswd# openssl passwd -1 -salt
[root@stu2~]# openssl genrsa;GeneratingRSA private key, 512 bit long modulus.++++++++++++................++++++++++++eis 65537 (0x10001)-----BEGINRSA PRIVATE KEY-----MIIBOQIBAAJBAJnZzY3oIvGIG8CJFoXp0QHd1VvyFGmSvIvDMAfFgmuzfL8E3uk0joZDq6HEnNxiAl+KFdheZeB2qluD2lZy9dUCAwEAAQJAEjnvVCRwH1UUlJapCGxOyn3RTPc829T6aURSaFlJviByWdgKLnOsr/HpBaF4/LGJXKcRdCRLC33CGBrSNFmc8QIhAMskRtZ0xls0fjmCo8EnYOJBjmGjT5e8in19Ekc0KSy3AiEAweIl9k25q53JXuFz/rf0ZWtjkH2sC72MgI7iIiGAvdMCIDz9Gzdvv83KKMtjaX6oL/I99F1kBpVrybh7QG2YP3RpAiAGRA7CBQUJHNJTNKoRA1TsqinPk6ApyPhvdy6rt7V3bQIgDqQ7ZquRPTo8QGCGrevqZBUowjeqczOzQaWup9nMlNg=-----ENDRSA PRIVATE KEY-----[root@stu2~]# openssl genrsa 2048 > lian.key #可以指定生成私钥的位数,并重定向文件中GeneratingRSA private key, 2048 bit long modulus.............................................+++.....+++eis 65537 (0x10001)[root@stu2~]# cat lian.key #可以进行查看
GeneratingRSA private key, 2048 bit long modulus......................................................................................................................................+++............................................+++eis 65537 (0x10001)Enterpass phrase:Verifying- Enter pass phrase:[root@stu2~]# cat lian.key #查看加密后的私钥文件-----BEGINRSA PRIVATE KEY-----Proc-Type:4,ENCRYPTED #表示该私钥已经被加密DEK-Info:DES-EDE3-CBC,3E3043F0CDBAA02E
[root@stu2~]# (umask 077;openssl genrsa -out lian2.key 2048)GeneratingRSA private key, 2048 bit long modulus..........................................................+++..+++eis 65537 (0x10001)[root@stu2~]# lltotal84-rw-------.1 root root 2801 Aug 10 08:44anaconda-ks.cfgdrwxr-xr-x 3 root root 4096 Aug 11 12:32 boot-rw-r--r-- 1 root root 1051 Aug 21 15:34 fstab-rw-r--r--.1 root root 43809 Aug 10 08:44 install.log-rw-r--r--.1 root root 9963 Aug 10 08:41install.log.syslog-rw-r--r-- 1 root root 1388 Aug 11 12:32 ks.cfg-rw------- 1 root root 1679 Aug 21 16:14 lian2.key-rw-r--r-- 1 root root 1743 Aug 21 16:06 lian.key
[root@stu2~]# openssl rsa -in lian2.key -puboutwritingRSA key-----BEGINPUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuRr/Yy9xPDYowj2Cf+vSapaSvOHmj33tpm80NAzB7IOvkC8oiulj6oUoowWT1xHEuGbyOJILQEBwN4/Jgm+SIN6/r8gLssY4UBUj34T9ZHnAD0jEgPxRrQTiWSe1SlCStwkCR3RPlBUNXUAySa7XSt70Fg9gKIlz4HNMZRrXFgxgFSVE0i4sWFCwrDeIbAzTx2/cGJVtQcYSMrdaKDAHNdgcqKNI0aQSwX9HvTxRtX4sfl7XbqXiyUUJVyuZ4jIxI7yKyii68y/Pk3mIz6mLg5XOa15Jw9ggKHY5gd7g+nr4iioHMQQ/WI8Bargs1ftwESw5lKddQBnLgn2aTpxe1QIDAQAB-----ENDPUBLIC KEY-----
[root@stu2~]# openssl req -new -key lan.key -out lan.csrYouare about to be asked to enter information that will be incorporatedintoyour certificate request.Whatyou are about to enter is what is called a Distinguished Name or a DN.Thereare quite a few fields but you can leave some blankForsome fields there will be a default value,Ifyou enter '.', the field will be left blank.-----CountryName (2 letter code) [XX]:CN #国家名Stateor Province Name (full name) []:henan #省份名称LocalityName (eg, city) [Default City]:Zhengzhou #城市名称OrganizationName (eg, company) [Default Company Ltd]:lanlian #公司名称OrganizationalUnit Name (eg, section) []:tech #部分名称CommonName (eg, your name or your server's hostname) []: #证书拥有者的名称,若使用域名访问这里使用域名,如用ip地址访问这里一定是Ip地址EmailAddress []: #邮箱地址,可以省略不写Pleaseenter the following 'extra' attributestobe sent with your certificate requestAchallenge password []: #将请求加密起来输入密码,不想直接回车即可Anoptional company name []:
#cd/etc/pki/CA####################################################################[ca ]default_ca = CA_default # The default ca section####################################################################[CA_default ] #默认CA的配置dir = /etc/pki/CA # Where everything is kept自建CA的工作目录certs = $dir/certs # Where the issued certs are kept指定当前CA的证书存放位置crl_dir = $dir/crl # Where the issued crl are kept指定证书撤销列表所在的工作目录database = $dir/index.txt # database index file.将签署的证书制作成索引保存下来也就是数据库文件#unique_subject= no # Set to 'no' toallow creation of#several ctificates with same subject.new_certs_dir = $dir/newcerts # default place for new certs.新签证书的位置certificate = $dir/cacert.pem # The CA certificate CA自己证书位置serial = $dir/serial # The current serial number已签署的证书,序列号crlnumber = $dir/crlnumber # the current crl number已吊销证书的个数# mustbe commented out to leave a V1 CRLcrl = $dir/crl.pem # The current CRL当前的证书吊销文件private_key = $dir/private/cakey.pem# The private key证书颁发机构自己的私钥文件RANDFILE = $dir/private/.rand # private random number filecacert.pem certs crl index.txt newcerts private serial
[root@stu2CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) #为CA生成一个私钥[root@stu2CA]# ls private/cakey.pem[root@stu2 CA]# openssl req -new -x509 -keyprivate/cakey.pem -out cacert.pem -days 3656Youare about to be asked to enter information that will be incorporatedintoyour certificate request.Whatyou are about to enter is what is called a Distinguished Name or a DN.Thereare quite a few fields but you can leave some blankForsome fields there will be a default value,Ifyou enter '.', the field will be left blank.-----CountryName (2 letter code) [XX]:CNStateor Province Name (full name) []:henanLocalityName (eg, city) [Default City]:zhengzhouOrganizationName (eg, company) [Default Company Ltd]:lanlianOrganizationalUnit Name (eg, section) []:techCommonName (eg, your name or your server's hostname) []:EmailAddress []:[root@stu2CA]# lscacert.pem certs crl newcerts private[root@stu2CA]# touch serial index.txt[root@stu2CA]# echo 01 > serial[root@stu2CA]# lscacert.pem certs crl index.txt newcerts private serial
[root@stu2~]# openssl ca -in lan.csr -out lan.crt -days 3656Usingconfiguration from /etc/pki/tls/openssl.cnfCheckthat the request matches the signatureSignatureokCertificateDetails:Serial Number: 1 (0x1)ValidityNot Before: Aug 21 09:20:01 2013GMTNot After : Aug 25 09:20:01 2023GMTSubject:countryName = CNstateOrProvinceName = henanorganizationName = lanlianorganizationalUnitName = techcommonName =X509v3 extensions:X509v3 Basic Constraints:CA:FALSENetscape Comment:OpenSSL Generated CertificateX509v3 Subject Key Identifier:6C:0F:54:43:9A:73:B2:74:FF:2E:59:16:E6:FD:D7:EE:C3:7D:0A:0BX509v3 Authority Key Identifier:keyid:59:56:89:9D:46:10:65:8B:F0:B4:EB:ED:C2:21:A0:CC:E4:9F:F4:FECertificateis to be certified until Aug 25 09:20:01 2023 GMT (3656 days)Signthe certificate? [y/n]:y1out of 1 certificate requests certified, commit? [y/n]yWriteout database with 1 new entriesDataBase Updated