Network security
网络安全
---
加密
在我们安全防御中主要遇到的问题就是中间人***包括:
1. 密码数据的嗅探
2. 数据的修改
3. 认证的修改
而我们在常用到的一些应用层协议中主要有:
FTP POPS telnet 数据的加密
NFS NIS sendmail 数据加密
rsh rcp 远程登录认证的加密
我们的加密就是:将原来的代码打乱顺序、加入salt等将元数据变成非明文的乱码。我们加密的原则----kerckhoffs'principle:加密之后密文的安全性是由密码来决定的而不是由加密的方法来决定的.在互联网中,认证的安全与数据的完整性比我们数据的安全性更重要,而我们的原则是能够实现数据的安全性、完整性、身份认证的安全.
通常我们不管哪种加密方式都要用到随机数安全器,生成的随机数使我们加密的前提,是我们安全的基础,随机数生成器分为:
通过软件生成:这种方式比较容易找出破绽,尤其是在暴力破解下
通过硬件生成:这是通过我们硬件的某种特性来产生随机数。
在我们的linux中,linux会通过内存中熵池的东西(键盘两次之间的间隔时间、外部存储两次之间的间隔时间等来硬件的产生)。在我们的linux的设备文文/dev/random /dev/urandom中获取随机数,不过我们大多数的设备dev/random 中取数据,这是最好的,因为这里的随机数都是来自熵池的,如果我们熵池中的随机数去完之后,我们的应用程序会终止的 。而我们的/dev/urandom中也会从熵池中取数,但是如果去完就会用我们的软件产生的随机数。我们的/etc/rc.d/rc.sysinit中就有一个生成随机数的程序
加密的方法与种类
1.
单项加密
(主要保证数据的完整性)
单向加密严格来说不是加密算法,而是通过提取数据的特征码,将明文变成密文,但是从密文变成明文几乎是不可能的,重要作用是用来验证数据在传输过程中是否被修改。无论数据是多大,其特征码是定长的,但是根据算法的不同特征码的长度可能不同;我们单向加密还有雪崩效应(蝴蝶效应)的特点,就是初始数据的一点变化从而引起真个结果的巨大一样,例如两个1G的数据 如果其中一个数据变化了一个 字符结果算出来的结果就完全不一样,且不可逆。当然单向加密也并非全面不可破解,如果我们的密码是:123456 或 redhat 等特殊的字符串,这是往往能够被暴力破解出来的。所以这些东西一定不能用作我们管理员密码的。常见的加密算法:
MD5 128bit 128的输出定长,一般来说我们linux中/etc/shadow中的密码就是默认使用md5
sha1 160bit sha1在加密的时候会比MD5的方法慢一些
我们也可以手动的实现数据的加密、解密,注意这些都是单向。
sha1sum file sha1工具用来提取file的特征码
md5sum file MD5工具用来提取file的特征码
openssl
主要作用:
保证数据完整性,防止数据的非法修改,一般不能保证是否来自真正的主机。 例子:file----->md5--->hash1,然后将hash1和file一起发给接受者,接受者将拿到的file在用MD5加密一次得到hash2,然后比较hash1和hash2 看是否发生改变,发生变化了,就说明文件已经不可用了。
2.
对称加密
加密和解密时使用同一个密钥 不能实现保证数据的完整性,保证数据的机密性
如果我们之前没有任何通信,所以他们之间没法,只能使用非对成加密ars
常用的 des(70years IBM) aes(1,2,) 3des(3轮des的加密)
还有:RC2 RC4 IDEA CAST5 BlowFish
3.
非对称加密算法(公钥算法)
加密和解密时,公钥是从私钥中提取出来的,密码是成对出现的,是用公钥加密的只能使用私钥解密,用私钥加密的只能用公钥解密。非对称的加密算法是对称加密的1000倍复杂,所以
非对称的加密只能保证数据用于身份的认证、数字签名,加密对称密钥(实现密钥交换),一般不用于数据加密。
数字签名:将某段数据的特征码提取出来,然后用自己的私钥来加密这段特征码,加密之后的数据就是数字签名
Bob要发邮件给----->Alice
要保证 1,邮件只能被Alice得到,并且Alice能够确认邮件是由Bob发来的 2,这个邮件在发送过程中修改过 3,邮件在发送过程中没有被看到过。
这个过程中有以下问题:
1.对称加密能实现邮件发送过程没有被看到过,保密性得到保证,确认邮件是来自Bob的,但不能保证数据被修改过。
2,假如Bob和Alice之前没有见过面,他们第一次怎么能商定好对称加密的密文。(怎样密钥交换)
3,如果我们直接使用pki往往会造成Alice不能确认邮件是来自Bob的。
常见的算法 1. RSA(数字签名、密钥交换、数字加密(单一般不用))
2. DSA(数字签名、密钥交换)
DH:密码交互协议,专门用来交换密钥的 ,密钥是不在网上传输的
随即选取质数 p g
A:x g^x mod p 结果----->B
B:y g^y mod p 结果----->A
5.PKI(
公钥基础设施
public key Infrastructures)
Bob和Alice都将自己的公钥放到服务器上,这个服务器就是PKI。但是我们怎么擦能保证我们从PKI商获得的公钥就一定是我们想要对象的公钥呢?这就要牵涉到CA
6.CA(证书颁发机构)
在现代的网络中Bob要和Alice即便是第一次通信也能实现数据的完整性、安全性、身份认证的安全(确认接受的邮件就是来自Bob)
为了保证我们获取在PKI上的公钥是可靠的,所以一个公信力的机构就是专门给放在网上的公钥做认证的。为了表明bob的公钥就是bob的,CA机构有自己的一对公钥、私钥,在首次通信的时候CA会对bob的公钥进行认证。 bob会将自己的公钥提取出来特征码(单向加密),然后由CA对这段特征码用CA自己的私钥加密,alice然后用CA的公钥解密特征码,然后用同样单向加密的算法再算一次特征码,如果得出的结果一样,我们就认为证书是可靠的,所以alice就获得了BOB的公钥,然后alice用bob的公钥加密一段密码给BOB,到此公钥的认证结束。然后开始通信,bob写一封邮件,将邮件提取出来特征码,并用自己的私钥将特征码加密,同时将特征码和我们邮件用从alice得到的密码加密之后发送给alice.alice得到密文之后,先用密码解密密文,这保证了数据的机密性,然后用bob的公钥解密特征码,如果能解密说明文件是来自bob的,者实现了身份认证,最后用同样的单项加密算法得到特征码和bob送来的特征码对比,如果一样实现了数据的完整性。
CA 是发证机构,如果bob的私钥丢了,他就要向CA通知,说明证书作废,所以我们常常要到CA机构查看当我们通信的对方公钥是否作废的
7.
数字证书
保证现代电子商务安全的,公钥基础设施重要组成部分的就是数字证书,在我们的linux中实现单向、对称、非对称方法且能发放证书甚至简单构建一个PKI实现机制有两种
1.ssl:ssl是一种机制,安全的套接字层,是工作在应用层与传输层之间的一种加密明文协议,其使用openssl作为一种工具,并提供额外的工具,也是用的最多的。
2.gpg gnu的一款产品
在网络中也是这样的:
C(custom)------>
S(server)
要想实现加密一般是要3种加密方法,
1 加密算法的协商
2.C向S先发起一个ssl请求
3 S向c发送自己的公钥证书,并用自己的私钥加密从公钥中提取出来的特征码,做出数字签名
4,首先查看CA自己是否认可,然后用S的公钥解密特征码,得到特征码,然后在使用相同的单向加密方法计算公钥得到一个特征码,比较特征码就能认证S的身份。然后C用S的公钥将协商出来的对称加密的密码加密并传给S,然后在大块S的网站,之后所有的传输内容都是加密的(S就会在传输给C的数据将数据的特征码提取出来,用自己的四要加密,同时用对称密钥加密明文和特征码,给C)
如何将我们的公钥被CA所认证
1 首先我们自己生成一对公钥、私钥
2 将自己的公钥做成CSR(包含组织机构、详细地址、邮件等)
3 CA将我们传过来的CSR认证后生成CRT并传给我们
我们的公司内部CA的服务器搭建并发放
CA
来给我们公司内部使用,这样可以实现低成本的认证
1
简单介绍openssl
我们自己做CA server时长用openssl 可以支持http ftp smtp。通常包含了libcrypto(加密库,用来生成加密密钥) libssl(实现ssl协议,本来我们linux仅仅支持http协议80端口,有了这个我们就能用https协议了443端口,当然ftp,smtp等都可以通过ssl实现加密的) openssl(数据的加密解密,证书的生成、颁发)3个组成部分。
]#openssl ? 查看openssl的用法
]#openssl enc -des3 -slat -a -in fstab -out fstab.de3 使用enc来实现数据加密 in表示读入 out输出
]#openssl enc -d des3 -slat -a -in fstab.de3 -out fstab -d表示解密
]#openssl dgst -md5 /root/fstab 实现单向加密,计算出特征码
]#openssl passwd -1 表示使用MD5算法加密一段数据
2 CA S
erver的搭建和发放证书
1. 做CA时自己先要给自己发证即自签署的证书,然后给用户发证书
/etc/pki/CA/private 这里是CA存放私钥的地方
/etc/pki/tls/openssl.conf 我们linux做CA的配置文件
]#cd /etc/pki/CA
]#(umask 077;openssl genrsa 1024 > private/cakey.pem) 生成一个rsa的私钥(注意我们公钥是从私钥中提取出来的,只要有私钥了,公钥也就有了 1024是公钥长度,同时要把生成的私钥存在/private/cakey.pem,且使用umask修改生成文件的权限)
]#vim /etc/pki/tls/openssl.conf
[CA_default]
dir == ../.../CA 换成 dir=/etc/pki/CA
CA]#touch index.txt serial
CA]#echo 01>serival serial是序列号,要给其一个初值
CA]#mkdir crl newcerts certs
CA]#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
实现自签署的命令 req new 表示一个新的签署请求 x509证书的格式 key表示从哪读取公钥的 out表示保存为什么样子 days表示保存多少天 注意一点我们在签署证书中有一条common name一定要写成自己的URL不要写自己的ip地址
客户端如何申请证书
注意我们在客户端申请证书的时候一定要记住,我们申请使用CA证书为什么样的服务用。就要把私钥、请求信息放在什么样的服务的配置文件目录中比如web服务
]#/etc/httpd
]#mkdir /etc/certs
]#cd /etc/certs
]#umask 077;openssl genrsa 1024 > www.pem )
]#openssl req -new -key www.pem -out www.csr
这里我们不能使用x509 因为x509是实现自签署证书的,然后客户端将csr文件传递给我们的CA服务器
]#opssl ca -in www.csr -out www.crt
CA认证之后,服务器将我们认证后的crt文件传递给我们的客户端。